![](https://habrastorage.org/webt/jc/wa/kh/jcwakhpe85upv8a16juvshl6zlq.png)
В ходе этой статьи мы развернём следующий стек инструментов Observability (наблюдаемости) Grafana:
- Loki (логи);
- Promtail (агент логов);
- Tempo (трассировка);
- Prometheus (метрики);
- Cortex и Grafana Mimir (долгосрочное хранилище для данных Prometheus);
- Alertmanager (обработка оповещений Prometheus);
- Grafana (визуализация).
Приступим!
Что потребуется
- Кластер Kubernetes (я использую Kind). Я уже писал (англ.) о том, как настраивать Kind с помощью Terraform.
- Kubectl и Helm.
Что такое наблюдаемость?
Наблюдаемость (observability) позволяет нам понять систему снаружи, не вникая в её внутренние механизмы.
Иными словами, она даёт ответ на вопрос: «Как себя ведёт наша система?»
Loki
Loki: подобен Prometheus, только для логов.
Отличие Loki от Prometheus в том, что он ориентирован не на метрики, а на логи, и доставка осуществляется по модели
push
, а не pull
.![](https://habrastorage.org/webt/jc/wa/kh/jcwakhpe85upv8a16juvshl6zlq.png)
Стек логирования на основе Loki состоит из трёх компонентов:
promtail
выступает агентом, отвечающим за сбор логов и их отправку Loki.loki
является основным сервером, отвечающим за хранение логов и обработку запросов.- Grafana отвечает за запросы и отображение логов.
После развёртывания Loki будет выглядеть так:
![](https://habrastorage.org/webt/t7/ns/ka/t7nskalqz_39zrxwsnchi2tded0.png)
Для запроса логов нужно быть знакомым с LogQL. Сам формат запроса выглядит так:
{job="mysql"} |= "error" != "timeout"
Наглядные примеры использования можно найти в документации.
В нём также есть визуальный инструмент, который можно использовать, если вы не хотите писать запросы сами. Если выбрать Log browser, то он предоставит несколько специализированных лейблов, из которых в моём случае я выбираю namespace.
В результате он показывает мне список пространств имён, существующих в моём кластере Kubernetes.
![](https://habrastorage.org/webt/br/lo/bt/brlobte0jiyhbgaqgu6_du-ib4i.png)
После выбора своего пространства имён я кликаю по Show logs, выводя все логи этого пространства.
▍ Live tailing
Loki поддерживает функцию Live tailing, отображающую логи системы в режиме реального времени. Включить её можно в верхнем правом углу интерфейса.
![](https://habrastorage.org/webt/zm/r5/93/zmr593m_bp9pm9ijglrvncf3cxo.png)
▍ Promtail
Promtail – это агент, передающий содержимое локальных логов в закрытый инстанс Grafana Loki или Grafana Cloud. Обычно он развёртывается на каждой машине, где есть приложения, требующие мониторинга.
Его основные задачи:
- обнаружение целей;
- назначение лейблов потокам логов;
- их передача в инстанс Loki.
На данный момент Promtail может собирать логи из двух источников:
- локальных лог-файлов;
- журнала systemd.
▍ Развёртывание Loki
Прежде чем начать, давайте создадим отдельное пространство имён Kubernetes для нашей конфигурации:
kubectl create ns observability
Лучшей практикой считается организация кластера K8s с помощью пространства имён. Подробнее почитать об этом можно здесь (англ.).
Клонируйте Helm-чарты сообщества Grafana на свою рабочую станцию:
git clone https://github.com/grafana/helm-charts
Перейдите в каталог
loki-stack
:cd helm-charts/charts/loki-stack
В файле readme мы видим, что можно развернуть Loki с предустановленной конфигурацией:
helm upgrade --install loki . -n observability
Вывод должен выглядеть так:
NAME: loki
LAST DEPLOYED: Fri Sep 23 17:20:34 2022
NAMESPACE: observability
STATUS: deployed
REVISION: 1
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
Если у вас возникает следующая ошибка:
Error: INSTALLATION FAILED:
An error occurred while checking for chart dependencies.
You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: loki, promtail, fluent-bit, grafana, prometheus, filebeat, logstash
Выполните:
helm dependency build
Теперь проверьте, запущены ли поды:
kubectl get pods -n observability
Вывод:
NAME READY STATUS RESTARTS AGE
loki-0 1/1 Running 0 7s
loki-promtail-xvhn5 1/1 Running 0 7s
Loki развёрнут :)
Перейдём к Tempo.
Tempo
Grafana Tempo – это открытый и удобный в использовании инструмент трассировки. Он отличается высокой эффективностью, требуя для работы лишь объектное хранилище, и при этом глубоко интегрирован с Grafana, Prometheus и Loki.
![](https://habrastorage.org/webt/i3/qo/ok/i3qookhhoholtgv2qhrubcadcfg.png)
Интеграция с остальным стеком Grafana очень важна, поскольку позволяет переходить напрямую из Logs (извлекая ID трейса из Loki) в Traces (хранящиеся в Tempo). Помимо этого, вы сможете использовать тот же язык запросов, что упростит получение трейсов.
Если вы уже используете Grafana, Prometheus и Loki, то есть смысл дополнительно подключить к ним Tempo для трассировки данных.
Tempo можно использовать с любым из открытых протоколов трассировки, включая Jaeger, Zipkin и OpenTelemetry.
Это означает, что он может получать пакеты трейсов в любом из упомянутых форматов, буферизовать их и затем записывать в Azure, GCS, S3 либо на локальный диск, делая доступными для запроса через Grafana.
▍ Развёртывание Grafana Tempo
Мы будем использовать тот же репозиторий, что и для развёртывания Loki. Потребуется лишь перейти в каталог
tempo
:cd helm-charts/tempo
Развёртывание Tempo с помощью Helm:
helm upgrade --install tempo . -n observability
Вывод должен выглядеть так:
NAME: tempo
LAST DEPLOYED: Fri Sep 23 17:26:22 2022
NAMESPACE: observability
STATUS: deployed
REVISION: 1
TEST SUITE: None
Проверим, запущены ли поды:
kubectl get pods -n observability
Вывод:
NAME READY STATUS RESTARTS AGE
loki-0 1/1 Running 0 7s
loki-promtail-xvhn5 1/1 Running 0 7s
tempo-0 2/2 Running 0 74s
Tempo развёрнут :)
Переходим к Prometheus и Grafana.
Prometheus
Prometheus – это продукт Cloud Native Computing Foundation, который представляет собой инструмент для мониторинга систем и сервисов. Он собирает метрики с установленных целей через заданные интервалы времени, оценивает правила, выводит результаты и может активировать оповещения при выполнении указанных условий.
![](https://habrastorage.org/webt/jy/do/gf/jydogfklt1wmq7yyxbci7t93bdo.png)
По умолчанию время хранения данных в Prometheus составляет всего 15 дней, что приводит нас к Cortex и Grafana Mimir, которые обеспечивают для него возможность долгосрочного хранения.
Cortex и Grafana Mimir
▍ Cortex
Cortex — это горизонтально масштабируемое, высокодоступное, мультиарендное, долгосрочное хранилище для удалённой записи данных Prometheus.
![](https://habrastorage.org/webt/pj/rb/bp/pjrbbpk1mr8-6gc3ccdrdfmimky.png)
Для его использования в конфигурацию Prometheus нужно добавить:
remote_write:
- url: http://localhost:9009/api/v1/push
Также будет нелишним ознакомиться с документацией этого инструмента.
▍ Grafana Mimir
В марте 2022 года разработчики Grafana объявили о выходе Grafana Mimir, построенном на базе Cortex.
Mimir совмещает в себе всё лучшее, что мы создали в Cortex, с возможностями, которые мы разработали для выполнения GEM и Grafana Cloud в широчайших масштабах. Всё это под лицензией AGPLv3.
![](https://habrastorage.org/webt/lm/v1/dl/lmv1dltxp5zobavjivo_y7ngunu.png)
Mimir позволяет отслеживать более миллиарда метрик, обеспечивая простоту развёртывания, высокую доступность, мультиарендность, длительное хранение и высокую скорость обработки запросов, в 40 раз превосходящую скорость Cortex. Mimir размещён на https://github.com/grafana/mimir и выпущен под лицензией AGPLv3.
Как и в случае с Cortex, для его использования потребуется добавить в настройки Prometheus следующее:
remote_write:
- url: http://localhost:9009/api/v1/push
Конфигурация сервера Prometheus, который считывает сам себя и записывает эти метрики в Grafana Mimir, выглядит так:
remote_write:
- url: http://localhost:9009/api/v1/push">http://localhost:9009/api/v1/push
scrape_configs:
- job_name: prometheus
honor_labels: true
static_configs:
- targets: ["localhost:9090"]
Подробнее читайте на этой странице.
При желании можете поэкспериментировать с Grafana Mirmir здесь.
Также рекомендую почитать документацию.
Alertmanager
Alertmanager обрабатывает оповещения, отправляемые клиентскими приложениями, такими как сервер Prometheus. При этом он обеспечивает отсутствие повторов, а также группировку и перенаправление сообщений нужному получателю вроде ящика электронной почты, Slack, PagerDuty или OpsGenie. Кроме того, он отвечает за подавление оповещений.
![](https://habrastorage.org/webt/j5/fd/hn/j5fdhnnkd6_yqmmlnf6k9qalpec.png)
Типичный пример использования Alertmanager – это его подключение к Slack, через который он уведомляет пользователя о возникших в кластере проблемах.
Grafana
Grafana позволяет запрашивать, визуализировать, получать оповещения и трактовать метрики вне зависимости от места их хранения.
![](https://habrastorage.org/webt/hx/lj/cw/hxljcwbmcc-b1eriwbjzkmaawqa.png)
- Визуализация: быстрые и гибкие графы на клиентской стороне с множеством опций. Плагины панели предлагают различные способы визуализации метрик и логов.
- Динамические контрольные панели: создавайте динамические и переиспользуемые информационные панели с переменными шаблонов, выводимыми в виде выпадающих окон в верхней части панели.
- Анализ метрик: изучайте данные метрик с помощью специализированных запросов и динамического просмотра. Разделяйте представления для наглядного сравнения различных временных диапазонов, запросов и источников данных.
- Анализ логов: испытайте магию переключения с метрик на логи с сохранёнными фильтрами лейблов, а также выполняйте быстрый поиск по всем логам или выводите их в реальном времени.
- Оповещения: визуально определяйте условия оповещений для наиболее важных метрик. Grafana будет непрерывно оценивать и отправлять уведомления в системы вроде Slack, PagerDuty, VictorOps или OpsGenie.
- Смешанные источники данных: совмещайте разные источники данных в одном графе. При этом источники, в том числе кастомные, можно указывать для отдельных запросов.
![](https://habrastorage.org/webt/mt/sz/ed/mtszedmfsshjykcr3sqpbff_6hi.png)
Kube-Prometheus
Репозиторий Kube-Prometheus объединяет в себе манифесты Kubernetes, контрольные панели Grafana и правила Prometheus, а также документацию и скрипты, обеспечивая удобство сквозного мониторинга кластеров Kubernetes с помощью Prometheus Operator.
Стек Kube-Prometheus предназначен для мониторинга кластеров.
Достаточно развернуть его в своём кластере K8s, и он автоматически начнёт собирать метрики по всем компонентам. В нём изначально настроен базовый набор правил оповещения и контрольные таблицы Grafana. Превосходное решение!
▍ Развёртывание Kube-Prometheus
Для развёртывания Prometheus и Grafana можно использовать Helm-чарт Kube-Prometheus.
Клонируйте Helm-чарты сообщества Prometheus на свою локальную рабочую станцию:
git clone https://github.com/prometheus-community/helm-charts/
Перейдите в каталог
kube-prometheus-stack
:cd helm-charts/charts/kube-prometheus-stack
Прежде чем развёртывать его с помощью Helm, мы настроим файл
values.yaml
.Файл values.yaml
содержит предустановленную конфигурацию для конкретного чарта. Если вам потребуется переопределить некоторые из значений, его можно изменить.
В нашем случае нужно добавить два источника данных Grafana, а именно ранее развёрнутые Loki и Tempo.
![](https://habrastorage.org/webt/h1/fy/kv/h1fykvwbbq0xotvjedkajgk300g.png)
Обратите внимание на
derivedFields
.Конфигурация Derived Fields позволяет:
- добавлять поля, спарсенные из лог-сообщения;
- добавлять ссылку, использующую значение поля.
Эту функциональность можно использовать, к примеру, чтобы указывать в логе ссылку на ваш инструмент трассировки или на страницу профиля пользователя, если в строке лога присутствует
userId
. Эти ссылки появляются в подробностях логов.Время развернуть kube-prometheus с помощью Helm (заметьте, что мы передаём здесь файл
values.yaml
):helm install my-grafana-stack prometheus-community/kube-prometheus-stack -n observability --values values.yaml
Установка
kube-prometheus
в ваш кластер Kubernetes займёт некоторое время.NAME: my-grafana-stack
LAST DEPLOYED: Fri Sep 23 19:22:13 2022
NAMESPACE: observability
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace observability get pods -l "release=my-grafana-stack"
Выполните
helm list -A
для вывода всех релизов без применения фильтров.NAME NAMESPACE STATUS CHART
loki observability deployed loki-stack-2.8.2
my-grafana-stack observability deployed kube-prometheus-stack-40.1.2
tempo observability deployed tempo-0.16.2
Теперь проверьте, запущены ли поды:
kubectl get pods -n observability
![](https://habrastorage.org/webt/x-/eh/-o/x-eh-outexzxocr-ugezlnk2-ja.png)
Grafana и Prometheus развёрнуты :)
Авторизация в Prometheus
Для доступа к Prometheus можно использовать проброс портов.
kubectl get svc -n observability
kubectl port-forward svc/my-grafana-stack-kube-prom-prometheus 9090:9090 -n observability
Чтобы увидеть интерфейс Prometheus, откройте браузер и перейдите на страницу
http://localhost:9090/
.![](https://habrastorage.org/webt/g1/mh/2j/g1mh2j1qukrhtcwt1c7h6xujcl4.png)
Если вы кликните по кнопке Metrics Explorer, то получите длинный список всех метрик, которые Prometheus собирает по кластеру.
![](https://habrastorage.org/webt/bs/tn/sz/bstnszfc5hu83jielourpwoqvpq.png)
Авторизация в Alertmanager
Команда для доступа к Alertmanager:
kubectl port-forward svc/my-grafana-stack-kube-prom-alertmanager 9093:9093 -n observability
Интерфейс Alertmanager находится в браузере по адресу
http://localhost:9093/
.![](https://habrastorage.org/webt/gi/j8/uw/gij8uw4c2lz45mkw0ydxkx4187a.png)
Нажав значок
+
, вы увидите, что у нас уже есть ряд оповещений.![](https://habrastorage.org/webt/wz/_2/rw/wz_2rwrf-vbks1ut4tzfejcczpw.png)
▍ Создание нового оповещения
Давайте создадим новое оповещение, чтобы понять принцип. Для этого потребуется изменить файл
values.yaml
.Ранее мы добавили из Grafana два дополнительных источника данных — для Tempo и Loki. Тогда мы внесли их в раздел
grafana.additionalDataSources
.Оповещение же добавляется в раздел
additionalPrometheusRulesMap:
.Наше оповещение будет проверять, содержит ли пространство имён
observability
менее 11 подов. Если вы выполните kubectl get pods -n observability
, то увидите, что текущее их число равно 10.![](https://habrastorage.org/webt/3s/5s/du/3s5sdub3adwm6mtunilwdtw5wqe.png)
После изменения
values.yaml
нужно выполнить helm upgrade
для применения изменений.helm upgrade my-grafana-stack prometheus-community/kube-prometheus-stack -n observability --values values.yaml
Чтобы убедиться в создании оповещения, откройте ещё раз Prometheus UI и перейдите во вкладку Alerts:
https://127.0.0.1:9090/alerts
Найдите в ней созданное нами оповещение ->
observabilityPodsDown
Сейчас состояние этого оповещения
Pending
. Это означает, что продолжительность его активности ещё не превысила установленный порог.![](https://habrastorage.org/webt/oa/ju/ly/oajulyt5kj0tbakrt98kda9qcpy.png)
Когда период активности оповещения этот порог превысит, состояние оповещения изменится на
Firing
.![](https://habrastorage.org/webt/xa/ui/mo/xauimoag7sb5ur6cd0u_2sgbupe.png)
Совет: вы можете кликнуть по ссылке выражения, которая перенаправит вас в UI для дополнительной визуализации.
![](https://habrastorage.org/webt/0c/jx/wv/0cjxwvlixr1nxu0z4necucowrio.png)
Авторизация в Grafana
Для доступа к Grafana можно использовать проброс портов:
Команда kubectl port-forward
пригождается для тестирования/отладки, так что вы можете обращаться к своему сервису, не раскрывая его.
kubectl port-forward svc/my-grafana-stack 3000:80 -n observability
Интерфейс Alertmanager доступен через браузер по адресу
http://localhost:3000/
.Логин по умолчанию:
admin : prom-operator
![](https://habrastorage.org/webt/wo/ve/vn/wovevnkwrh2mr9lupqsyauwqby8.png)
Если вы кликните по Dashboard, то увидите, что чарт Helm установил уже настроенные контрольные панели.
![](https://habrastorage.org/webt/2o/ri/7j/2ori7jhn29pkjzzrpe3uycreizi.png)
![](https://habrastorage.org/webt/-x/d6/ee/-xd6eekp41qyvulcrlhm56vben4.png)
Теперь, когда мы поняли, как обращаться к Grafana, Prometheus и Alertmanager, посмотрим, как использовать Loki и Tempo.
Источники данных
Grafana поддерживает множество разных хранилищ для ваших данных временных рядов. Список поддерживаемых источников данных находится здесь.
Если вы сейчас перейдёте в Data Sources, то найдёте источники данных для Loki и Tempo, которые мы добавили в файл
values.yaml
.![](https://habrastorage.org/webt/yw/1k/-m/yw1k-mmhxbw2srmt8zy-ycusmvg.png)
Источник данных Prometheus был добавлен при развёртывании Kube-Prometheus.
![](https://habrastorage.org/webt/hb/ak/-f/hbak-ffp2rseyop51ujcmwzxbge.png)
Отправка трейсов
Для просмотра трейсов в Grafana у нас должно быть приложение. Обычно для тестирования используют специально созданное демо HotRod (Rides on Demand).
HotROD (Rides on Demand)
HotRod разработала команда Jaeger, и он вполне годится для тестирования трейсов. Разработчик Jaeger, Юрий Шкуро, написал об этом прекрасную статью Take Jaeger for a HotROD ride.
Если коротко, то это демо-приложение для бронирования поездок, которое состоит из нескольких микросервисов (и сопутствующего хранилища вроде MySQL и Redis). При запуске оно генерирует веб-страницу с кнопками, представляющими клиентов.
Мы писали о HotRod в предыдущей статье -> A beginner’s guide to Jaeger, где вы найдёте все необходимые инструкции о том, как связать его с Jaeger:)
Теперь, когда мы поняли, что из себя представляет HotRod, давайте создадим два файла Kubernetes (
deployment
и service
).▍ HotROD Deployment
vim hotrod-deployment.yaml
![](https://habrastorage.org/webt/ei/nt/md/eintmdtqkljoqyny9azvm8iwwhk.png)
Прежде чем применить файл развёртывания, обратите внимание на переменные среды. Демо HotROD направлено через них на сборщик трейсов.
JAEGER_AGENT_HOST
: имя хоста для связи с агентом.JAEGER_AGENT_PORT
: порт для сообщения с агентом.JAEGER_SAMPLER_TYPE
иJAEGER_SAMPLER_PARAM
: используются для ручной активации сэмплинга. Подробности здесь.
Применяется он командой
kubectl apply -f hotrod-deployment.yaml
▍ HotROD Service
vim hotrod-service.yaml
![](https://habrastorage.org/webt/ou/6i/pc/ou6ipc0jcfimklclw6ctq2duy4k.png)
kubectl apply -f hotrod-service.yaml
После развёртывания демо-приложения получить к нему доступ можно через проброс портов:
kubectl port-forward service/hotrod -n observability 3001:8080
Откройте в браузере
http://127.0.0.1:3001/
![](https://habrastorage.org/webt/d-/pv/go/d-pvgoamun848e1scdixsr_t5o4.png)
Сгенерируйте несколько запросов/трейсов, кликнув по имени клиента. Эти запросы появятся в Grafana, что мы вскоре увидим.
![](https://habrastorage.org/webt/0n/sj/ki/0nsjkiy6orajsil75bix9fshot8.png)
Просмотр трейсов в Tempo
Время запросить логи приложения HotROD.
- Вернитесь в Grafana и кликните по кнопке Explore.
- Из выпадающего списка выберите в качестве источника данных Loki.
- В разделе Labels выберите app, а затем hotrod.
![](https://habrastorage.org/webt/cq/xf/uh/cqxfuhhegk_sxbkoy5yenh3pp0m.png)
- Кликните по кнопке Run Query в верхнем правом углу.
Теперь в нижней части экрана вы увидите все логи (loki).
![](https://habrastorage.org/webt/yz/kz/gz/yzkzgzrv81d24ctaid4ucp6hlde.png)
- Кликните по одной из записей логов, чтобы её открыть. Обратите внимание на поле
TraceID
, которое представляет извлечённый из логовtrace_id
.
![](https://habrastorage.org/webt/zu/zn/gi/zuzngiqgle_2tepwwqqadrxqd1y.png)
Теперь рядом с
TraceID
должна быть видна синяя кнопка Tempo. Кликнув по ней, вы откроете Tempo UI, где можно просмотреть информацию о трейсах.![](https://habrastorage.org/webt/xf/6h/5e/xf6h5eis1ajpljp9u-ktqdze2sg.png)
Отсюда можно использовать весь трейс, на который ведёт ссылка из логов Loki. Это очень круто, поскольку вы можете переходить напрямую из логов (Loki) в трейсы (Tempo).
Заключение
Поздравляю, вы только что развернули стек наблюдаемости Grafana, включающий Grafana, Prometheus, Loki и Tempo.
Telegram-канал с полезностями и уютный чат
![](https://habrastorage.org/webt/sz/7j/pf/sz7jpfj8i1pa6ocj-eia09dev4q.png)