[Перевод] Loki — сбор логов, используя подход Prometheus
Салют, хабровчане! В преддверии старта нового набора на курс «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:
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.
Экран Explorer разделен между Prometheus и Loki
На этом экране можно смотреть логи в Loki, связанные с метриками Prometheus, используя концепцию разделения экрана. Начиная с версии 6.5, Grafana позволяет обрабатывать идентификатор трассировки (trace id) в записях логов Loki для перехода по ссылкам к вашим любимым инструментам распределенной трассировки (Jaeger).
Локальный тест Loki
Самый простой способ локального тестирования Loki — использовать docker-compose. Файл docker-compose находится в репозитории Loki. Получить репозиторий можно с помощью следующей команды git
:
$ git clone https://github.com/grafana/loki.git
Затем вам нужно перейти в каталог production:
$ cd production
После этого можно получить последнюю версию образов Docker:
$ docker-compose pull
Наконец, стек Loki запускается следующей командой:
$ docker-compose up
Архитектура Loki
Вот небольшая диаграмма с архитектурой Loki:
Принципы архитектуры 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 http://docs.grafana.org/features/datasources/loki/ 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
Нажав на «Test» можно проверить связь с Loki.
Делаем запросы к Loki
Теперь перейдите в Grafana в раздел «Explore». При приеме логов от контейнеров Loki добавляет метаданные от Kubernetes. Таким образом, становится возможным просматривать логи определенного контейнера.
Например, для выбора логов контейнера promtail можно использовать следующий запрос: {container_name = "promtail"}
.
Здесь также не забудьте выбрать источник данных Loki.
Этот запрос вернет активность контейнеров в следующем виде:
Результат запроса в Grafana
Добавление на дашборд
Начиная с Grafana 6.4, можно поместить информацию о логах непосредственно на дашборд. После этого пользователь сможет быстро переключаться между количеством запросов на его сайте к трейсами приложения.
Ниже приведен пример дашборда, реализующий это взаимодействие:
Образец дашборда с метриками 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, отображаемых в Grafana
Становится возможным использовать одно из полей JSON, например, для:
- ссылки на внешний инструмент
- фильтрации содержимого логов
Например, вы можете кликнуть на traceId, чтобы перейти в Zipkin или Jaeger.
Традиционно ждем ваши комментарии и приглашаем на открытый вебинар, где поговорим о том, как развивалась DevOps-индустрия в течение 2019 года и обсудим возможные пути развития на 2020 год.