Loki — сбор логов, используя подход Prometheus

в 13:35, , рубрики: devops, docker, Grafana, kubernetes, logging, loki, Блог компании OTUS. Онлайн-образование

Салют! В преддверии старта нового набора на курс «DevOps практики и инструменты» подготовили для вас перевод интересного материала.


Эта статья — краткое введение в Loki. Проект Loki поддерживается Grafana и направлен на централизованный сбор логов (с серверов или контейнеров).

Основным источником вдохновения для Loki был Prometheus с идеей применения его подходов к управлению логами:

  • использование меток (labels) для хранения данных
  • потребление малого количества ресурсов

Мы еще вернемся к принципам работы Prometheus и приведем несколько примеров его использования в контексте Kubernetes.

Несколько слов о Prometheus

Чтобы полностью понять, как работает Loki, важно сделать шаг назад и немного вспомнить Prometheus.

Одной из отличительных характеристик Prometheus является извлечение метрик из точек сбора (через экспортеры) и сохранение их в TSDB (Time Series Data Base, база данных временных рядов) с добавлением метаданных в виде меток.

Зачем это нужно

В последнее время Prometheus стал стандартом де-факто в мире контейнеров и Kubernetes: его установка очень проста, а в кластере Kubernetes изначально присутствует эндпоинт для Prometheus. Prometheus также может извлекать метрики из приложений, развернутых в контейнере, сохраняя при этом определенные метки. Поэтому мониторинг приложений очень прост в реализации.

К сожалению, для управления логами до сих пор нет решения “под ключ”, и вы должны найти решение для себя:

  • управляемый облачный сервис для централизации логов (AWS, Azure или Google)
  • сервис мониторинга «мониторинг как услуга» (monitoring as a service) (например, Datadog)
  • создание своего сервиса сбора логов.

Для третьего варианта я традиционно использовал Elasticsearch, несмотря на то, что я не всегда был им доволен (особенно его тяжестью и сложностью настройки).

Loki был спроектирован с целью упрощения реализации в соответствии со следующими принципами:

  • быть простым для старта
  • потреблять мало ресурсов
  • работать самостоятельно без какого-либо специального обслуживания
  • служить дополнением к Prometheus для помощи в расследовании багов

Однако эта простота достигается за счет некоторых компромиссов. Один из них — не индексировать контент. Поэтому поиск по тексту не очень эффективен или богат и не позволяет вести статистику по содержимому текста. Но поскольку Loki хочет быть эквивалентом grep и дополнением к Prometheus, то это не является недостатком.

Расследование инцидентов

Чтобы лучше понять, почему Loki не нужна индексация, давайте вернемся к методу расследования инцидентов, который использовали разработчики Loki:

Loki — сбор логов, используя подход Prometheus - 1
1 Alert → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!
(1 Предупреждение → 2 Дашборд → 3 Adhoc Query → 4 Агрегация логов → 5 Распределенная трассировка → 6 Исправляем!)

Идея состоит в том, что мы получаем какой-то алерт (Slack Notification, SMS и т. д.) и после этого:

  • смотрим дашборды Grafana
  • смотрим метрики сервисов (например, в Prometheus)
  • смотрим записи логов (например, в Elasticsearch)
  • возможно, взглянем на распределенные трейсы (Jaeger, Zipkin и др.)
  • и, наконец, исправляем исходную проблему.

Здесь, в случае стека Grafana + Prometheus + Elasticsearch + Zipkin, придется использовать четыре разных инструмента. Для сокращения времени хорошо бы иметь возможность выполнять все эти этапы с помощью одного инструмента: Grafana. Стоит отметить, что такой подход к исследованию реализован в Grafana начиная с версии 6. Таким образом, становится возможным обращаться к данным Prometheus непосредственно из Grafana.

Loki — сбор логов, используя подход Prometheus - 2
Экран Explorer разделен между Prometheus и Loki

На этом экране можно смотреть логи в Loki, связанные с метриками Prometheus, используя концепцию разделения экрана. Начиная с версии 6.5, Grafana позволяет обрабатывать идентификатор трассировки (trace id) в записях логов Loki для перехода по ссылкам к вашим любимым инструментам распределенной трассировки (Jaeger).

Локальный тест Loki

Самый простой способ локального тестирования Loki — использовать docker-compose. Файл docker-compose находится в репозитории Loki. Получить репозиторий можно с помощью следующей команды git:

$ git clone <a href="https://github.com/grafana/loki.git">https://github.com/grafana/loki.git</a>

Затем вам нужно перейти в каталог production:

$ cd production

После этого можно получить последнюю версию образов Docker:

$ docker-compose pull

Наконец, стек Loki запускается следующей командой:

$ docker-compose up

Архитектура Loki

Вот небольшая диаграмма с архитектурой Loki:

Loki — сбор логов, используя подход Prometheus - 3
Принципы архитектуры Loki

Веб-клиент запускает приложения на сервере, Promtail собирает логи и отправляет их в Loki, веб-клиент также отправляет метаданные в Loki. Loki все агрегирует и передает в Grafana.
Loki запущен. Для просмотра имеющихся компонентов выполните следующую команду:

$ docker ps

В случае свежеустановленного Docker команда должна вернуть следующий результат:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Мы видим следующие компоненты:

  • Promtail: агент, отвечающий за централизацию логов
  • Grafana: известный инструмент для дашбордов
  • Loki: демон централизации данных

В рамках классической инфраструктуры (например, на основе виртуальных машин) на каждой машине должен быть развернут агент Promtail. Grafana и Loki могут быть установлены на одной машине.

Развертывание в Kubernetes

Установка компонентов Loki в Kubernetes будет заключаться в следующем:

  • daemonSet для развертывания агента Promtail на каждой из машин в кластере серверов
  • развертывание (Deployment) Loki
  • и последнее — развертывание Grafana.

К счастью, Loki доступен в виде пакета Helm, что упрощает его развертывание.

Установка через Heml

Heml уже должен быть у вас установлен. Его можно скачать из GitHub-репозитория проекта. Он устанавливается через распаковку архива, соответствующего вашей архитектуре, и добавления helm в $PATH.

Примечание: версия 3.0.0 Helm была выпущена недавно. Так как в ней было много изменений, то читателю рекомендуется немного подождать, прежде начать ее использовать.

Добавление источника для Helm

Первым шагом будет добавление репозитория “loki” с помощью следующей команды:

$ helm add loki https://grafana.github.io/loki/charts

После этого можно искать пакеты с именем “loki”:

$ helm search loki

Результат:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Эти пакеты имеют следующие функции:

  • пакет loki/loki соответствует только серверу Loki
  • пакет loki/fluent-bit позволяет вам развертывать DaemonSet, используя fluent-bin для сбора логов вместо Promtail
  • пакет loki/promtail содержит агент сбора лог-файлов
  • пакет loki/loki-stack, позволяет сразу развернуть Loki совместно с Promtail.

Установка Loki

Чтобы развернуть Loki в Kubernetes, выполните следующую команду в пространстве имен “monitoring”:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Для сохранения на диск добавьте параметр --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Примечание: если вы хотите развернуть одновременно Grafana, то добавьте параметр --set grafana.enabled = true

При запуске этой команды вы должны получить следующий вывод:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Посмотрев на состояние подов в пространстве имен “monitoring”, мы увидим, что все развернуто:

$ kubectl -n monitoring get pods -l release=loki

Результат:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Все поды запущены. Теперь пришло время сделать несколько тестов!

Подключение к Grafana

Чтобы под Kubernetes подключиться к Grafana, необходимо открыть туннель к его поду. Ниже приведена команда для открытия порта 3000 для пода Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Еще одним важным моментом является необходимость восстановления пароля администратора Grafana. Пароль хранится в секрете loki-grafana в поле .data.admin-user в формате base64.

Для его восстановления необходимо выполнить следующую команду:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Используйте этот пароль совместно с учетной записью администратора по умолчанию (admin).

Определение источника данных Loki в Grafana

Прежде всего убедитесь, что создан источник данных Loki (Configuration / Datasource).
Вот пример:

Loki — сбор логов, используя подход Prometheus - 4
Пример настройки источника данных для Loki

Нажав на “Test” можно проверить связь с Loki.

Делаем запросы к Loki

Теперь перейдите в Grafana в раздел “Explore”. При приеме логов от контейнеров Loki добавляет метаданные от Kubernetes. Таким образом, становится возможным просматривать логи определенного контейнера.

Например, для выбора логов контейнера promtail можно использовать следующий запрос: {container_name = "promtail"}.
Здесь также не забудьте выбрать источник данных Loki.

Этот запрос вернет активность контейнеров в следующем виде:

Loki — сбор логов, используя подход Prometheus - 5
Результат запроса в Grafana

Добавление на дашборд

Начиная с Grafana 6.4, можно поместить информацию о логах непосредственно на дашборд. После этого пользователь сможет быстро переключаться между количеством запросов на его сайте к трейсами приложения.

Ниже приведен пример дашборда, реализующий это взаимодействие:

Loki — сбор логов, используя подход Prometheus - 6
Образец дашборда с метриками Prometheus и логами Loki

Будущее Loki

Я начал использовать Loki еще в мае / июне с версии 0.1. Сегодня уже выпущена версия 1, и даже 1.1 и 1.2.

Надо признать, что версия 0.1 была не достаточна стабильна. Но 0.3 показала уже реальные признаки зрелости, а следующие версии (0.4, затем 1.0) только усилили это впечатление.

После 1.0.0, ни у кого уже не может быть оправданий, чтобы не использовать этот замечательный инструмент.

Дальнейшие улучшения должны касаться не Loki, а скорее его интеграции с превосходной Grafana. На самом деле, в Grafana 6.4 уже появилась хорошая интеграция с дашбордами.

Grafana 6.5, которая была выпущена недавно, еще больше улучшает эту интеграцию, автоматически распознавая содержимое логов в формате JSON.

Ниже на видео приведен небольшой пример этого механизма:

Loki — сбор логов, используя подход Prometheus - 7
Использование строк Loki, отображаемых в Grafana

Становится возможным использовать одно из полей JSON, например, для:

  • ссылки на внешний инструмент
  • фильтрации содержимого логов

Например, вы можете кликнуть на traceId, чтобы перейти в Zipkin или Jaeger.

Традиционно ждем ваши комментарии и приглашаем на открытый вебинар, где поговорим о том, как развивалась DevOps-индустрия в течение 2019 года и обсудим возможные пути развития на 2020 год.

Автор: MaxRokatansky

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js