Преобразовывайте свои журналы прямо во время запроса, настраивайте уведомления с Loki.
Прошел примерно год после выпуска Loki 1.0, мы за это время заметили большой всплеск внедрений в компаниях (например, Grofers и Paytm Insider), использующих как облачную версию Grafana, так и размещенную на своих мощностях. В то же время мы приложили много усилий для улучшения производительности, используя оптимизацию и распараллеливание запросов. В последнем выпуске 1.6.0 мы продолжили рефакторинг кода для достижения еще большей производительности, а также добавили небольшие новые функции к языку запросов, например, бинарные операции.
Эксплуатационные выгоды использования маленького индекса Loki были огромными. Любой, кто использовал Loki, быстро почувствовал эти дополнительные преимущества. Однако небольшой индекс и небольшой набор меток, критически важных для производительности Loki, накладывают ограничения на возможности запросов, а нам такое не нравится.
Это и есть причина, по которой мы решили значительно улучшить Loki, поэтому рады представить Loki 2.0. В этой версии мы добавили новейший набор функций языка запросов, позволяющий извлекать метки во время запроса, убирая старые ограничения.
Теперь у вас есть лучшее из обоих подходов: небольшой набор меток для индексирования журналов во время сбора, соединенный с комплексным языком запросов, который позволяет извлекать больше меток во время запроса. Ограничить способности запросов теперь может только ваше воображение!
Давайте посмотрим детальнее на новые функции!
Извлечение меток из строк журналов во время запроса
Рассмотрим новые дополнения к языку запросов в версии 2.0!
С оранжевыми пунктами вы уже должны быть знакомы. Выборка содержимого журнала с помощью |=
!=
|~
и !~
, а также преобразование ваших журналов в параметры с использованием rate
и count_over_time
уже работали в Loki 1.x. Все остальное, выделенное белым цветом — новое в версии 2.0, мне кажется, что будет лучше рассмотреть, как оно работает детальнее на примерах, так что погнали!
Разбор
Это начальная точка: мы извлекаем метки во время запроса. Например, у нас есть поставщик журнала:
Посмотрите, какие метки были возвращены:
Давайте немножко поменяем запрос и посмотрим на результат, возвращаемый по этому журналу:
Обратите внимание на метки...
Вот так вот просто каждая пара ключ=значение из logfmt стала меткой!
Не используете logfmt? Тогда мы идем к вам!
Регулярное выражение:
JSON:
Примечание. Для JSON мы убираем вложенные объекты, используя подчеркивания для слияния элементов. Посмотрите на объект responce
на картинке выше. Мы хотим в дальнейшем расширить возможности обработки JSON, но для этого потребуется собственный язык, так что мы для начала выбрали более простое решение.
Это покрывает первый этап, извлечение содержимого журнала в метки во время запроса. Давайте посмотрим, что это нам дает.
Выборка
В Loki 2.0 доступны более мощные возможности выборки. Используя расширенные существующие выражения для выборки, вы теперь можете отсеять данные, полученные на предыдущем этапе разбора. Давайте посмотрим на пример, показывающий только те строки журнала, где извлеченный параметр duration больше 1 секунды с помощью query_type=filter
:
Обратите внимание на «умную» обработку Loki выходных типов в некоторых контекстах, в этом случае идет разбор duration в стиле Golang.
Выборка является важной частью обработки ошибок в новых функциях. Если что-то пошло не так с обработкой строки, Loki назначит новую метку __error__
с именем ошибки. Это можно использовать для выбора журналов и анализа причин:
В вышеприведенном случае такие строки — не JSON, так что они не были обработаны как JSON на этапе json
. Теперь, когда вы узнали причину, можно легко и непринужденно исключить такие строки:
Форматирование
Упростить работу всем, кто смотрит журналы, стало еще легче. Loki 2.0 может перезаписать ваши строки журнала так, как они показаны, а также с его помощью можно сделать так:
Превращаем в такое:
Метки label_format
и line_format
используют синтаксис шаблонов Golang, позволяя вам выбрать связанные строки журнала для отображения. С этим также связаны другие дополнительные возможности, например, способность вертикального выравнивания или обрезания содержимого журнала.
Графики
Вам это, возможно, покажется более впечатляющим, чем новые возможности выборки. У вас появилась возможность отображения ваших журналов в виде параметров. Многие новые функции группировки параметров могут быть использованы на этапе unwrap
, на котором извлеченные метки будут превращены во временные ряды, с которыми вы сможете использовать следующие функции:
sum_over_time
avg_over_time
stddev_over_time
stdvar_over_time
max_over_time
min_over_time
quantile_over_time
Давайте рассмотрим пример использования, чтобы отобразить 99 перцентиль параметра request_time из журналов NGINX, сгруппированных по целевому серверу:
А теперь берем тот же запрос и группируем по клиентскому IP:
Как вы видите, появилось что-то новое и восхитительное: способность группировать данные с большой мощностью.
Еще пара примеров:
В последнем примере вы можете видеть такое: duration(duration)
. Так можно указать Loki разбирать значения duration
в стиле Golang (там добавляются единицы, например s
или ms
). Скоро будет доступна поддержка и других дополнительных типов, например kb
, mb
и прочих.
Создание уведомлений из любого запроса
Все эти новые функции очень впечатляют, особенно, если они используются совместно с еще одним большим улучшением в 2.0: возможностью создания уведомлений прямиком из ваших журналов в Loki и их отправки в Prometheus Alertmanager.
Ранее для такого вам надо было настроить Loki в качестве источника данных для Prometheus, после чего указать Grafana использовать его для создания уведомлений. В Loki 2.0 мы внедрили распределенный механизм оценки правил, так что вы можете написать любой запрос и создать уведомление с использованием знакомого синтаксиса Prometheus. Эти уведомления потом отправляются в Prometheus Alertmanager, развернутый отдельно. Процесс создания и отправки уведомлений стал простым!
Нет больше отдельного хранилища индексов
И последняя впечатляющая новость о Loki 2.0 — удаление пометки "экспериментальный" с типа индекса boltdb-shipper
!
В Loki 1.5 мы представили новый индекс boltdb-shipper. С новым индексом вы могли запустить Loki поверх любого объектного хранилища, а сейчас вам уже больше не нужно отдельное выделенное хранилище (DynamoDB, Bigtable, Cassandra и другие), а также все дополнительные, связанные с ним, затраты! В 2.0 эта функция готова к промышленному использованию. В Grafana Labs мы для себя уже переместили в этом направлении все наши кластера.
Дополнительная информация
Нет возможности запустить свой Loki, либо просто хотите попробовать все это в действии? Активируйте испытательный период в 30 дней в Grafana Cloud! В облаке вы получите экземпляр Loki, связанный с Grafana и Alertmanager с новым интерфейсом правил уведомлений, с которым вы легко запустите процесс сбора журналов и создания уведомлений за несколько минут!
Для начала работы обратитесь к странице выпуска, также есть исчерпывающее руководство для обновления вашего кластера Loki. Там есть несколько вещей, на которые стоит обратить внимание!
А еще у нас есть шикарнейшее видео от Ward Bekker с исследованием и обзором новых функций в 2.0.
От редакции: Подробнее о работе с Loki можно узнать на курсе Слёрма «Мониторинг и логирование инфраструктуры в Kubernetes». Курс от основ до продвинутого уровня для быстрого ввода в эксплуатацию мониторинга и логирования инфраструктуры.