Практическое руководство по реализации наблюдаемости в DevOps

Kate

Administrator
Команда форума


В ходе этой статьи мы развернём следующий стек инструментов наблюдаемости Grafana:


Приступим!

Что потребуется​


  • Кластер Kubernetes (я использую Kind). Я уже писал (англ.) о том, как настраивать Kind с помощью Terraform.
  • Kubectl и Helm.

Что такое наблюдаемость?​


Наблюдаемость (observability) позволяет нам понять систему снаружи, не вникая в её внутренние механизмы.

Иными словами, она даёт ответ на вопрос: «Как себя ведёт наша система?»

Loki​


Loki: подобен Prometheus, только для логов.

Отличие Loki от Prometheus в том, что он ориентирован не на метрики, а на логи, и доставка осуществляется по модели push, а не pull.

jcwakhpe85upv8a16juvshl6zlq.png


Стек логирования на основе Loki состоит из трёх компонентов:

  1. promtail выступает агентом, отвечающим за сбор логов и их отправку Loki.
  2. loki является основным сервером, отвечающим за хранение логов и обработку запросов.
  3. Grafana отвечает за запросы и отображение логов.

После развёртывания Loki будет выглядеть так:

t7nskalqz_39zrxwsnchi2tded0.png


Для запроса логов нужно быть знакомым с LogQL. Сам формат запроса выглядит так:

{job="mysql"} |= "error" != "timeout"

Наглядные примеры использования можно найти в документации.

В нём также есть визуальный инструмент, который можно использовать, если вы не хотите писать запросы сами. Если выбрать Log browser, то он предоставит несколько специализированных лейблов, из которых в моём случае я выбираю namespace.

В результате он показывает мне список пространств имён, существующих в моём кластере Kubernetes.

brlobte0jiyhbgaqgu6_du-ib4i.png


После выбора своего пространства имён я кликаю по Show logs, выводя все логи этого пространства.

▍ Live tailing​


Loki поддерживает функцию Live tailing, отображающую логи системы в режиме реального времени. Включить её можно в верхнем правом углу интерфейса.

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.

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, который представляет собой инструмент для мониторинга систем и сервисов. Он собирает метрики с установленных целей через заданные интервалы времени, оценивает правила, выводит результаты и может активировать оповещения при выполнении указанных условий.

jydogfklt1wmq7yyxbci7t93bdo.png


По умолчанию время хранения данных в Prometheus составляет всего 15 дней, что приводит нас к Cortex и Grafana Mimir, которые обеспечивают для него возможность долгосрочного хранения.

Cortex и Grafana Mimir​


▍ Cortex​


Cortex — это горизонтально масштабируемое, высокодоступное, мультиарендное, долгосрочное хранилище для удалённой записи данных Prometheus.

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.

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. Кроме того, он отвечает за подавление оповещений.

j5fdhnnkd6_yqmmlnf6k9qalpec.png


Типичный пример использования Alertmanager – это его подключение к Slack, через который он уведомляет пользователя о возникших в кластере проблемах.

Grafana​


Grafana позволяет запрашивать, визуализировать, получать оповещения и трактовать метрики вне зависимости от места их хранения.

hxljcwbmcc-b1eriwbjzkmaawqa.png


  • Визуализация: быстрые и гибкие графы на клиентской стороне с множеством опций. Плагины панели предлагают различные способы визуализации метрик и логов.
  • Динамические контрольные панели: создавайте динамические и переиспользуемые информационные панели с переменными шаблонов, выводимыми в виде выпадающих окон в верхней части панели.
  • Анализ метрик: изучайте данные метрик с помощью специализированных запросов и динамического просмотра. Разделяйте представления для наглядного сравнения различных временных диапазонов, запросов и источников данных.
  • Анализ логов: испытайте магию переключения с метрик на логи с сохранёнными фильтрами лейблов, а также выполняйте быстрый поиск по всем логам или выводите их в реальном времени.
  • Оповещения: визуально определяйте условия оповещений для наиболее важных метрик. Grafana будет непрерывно оценивать и отправлять уведомления в системы вроде Slack, PagerDuty, VictorOps или OpsGenie.
  • Смешанные источники данных: совмещайте разные источники данных в одном графе. При этом источники, в том числе кастомные, можно указывать для отдельных запросов.

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.

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

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/.

g1mh2j1qukrhtcwt1c7h6xujcl4.png


Если вы кликните по кнопке Metrics Explorer, то получите длинный список всех метрик, которые Prometheus собирает по кластеру.

bstnszfc5hu83jielourpwoqvpq.png


Авторизация в Alertmanager​


Команда для доступа к Alertmanager:

kubectl port-forward svc/my-grafana-stack-kube-prom-alertmanager 9093:9093 -n observability

Интерфейс Alertmanager находится в браузере по адресу http://localhost:9093/.

gij8uw4c2lz45mkw0ydxkx4187a.png


Нажав значок +, вы увидите, что у нас уже есть ряд оповещений.

wz_2rwrf-vbks1ut4tzfejcczpw.png


▍ Создание нового оповещения​


Давайте создадим новое оповещение, чтобы понять принцип. Для этого потребуется изменить файл values.yaml.

Ранее мы добавили из Grafana два дополнительных источника данных — для Tempo и Loki. Тогда мы внесли их в раздел grafana.additionalDataSources.

Оповещение же добавляется в раздел additionalPrometheusRulesMap:.

Наше оповещение будет проверять, содержит ли пространство имён observability менее 11 подов. Если вы выполните kubectl get pods -n observability, то увидите, что текущее их число равно 10.

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. Это означает, что продолжительность его активности ещё не превысила установленный порог.

oajulyt5kj0tbakrt98kda9qcpy.png


Когда период активности оповещения этот порог превысит, состояние оповещения изменится на Firing.

xauimoag7sb5ur6cd0u_2sgbupe.png


Совет: вы можете кликнуть по ссылке выражения, которая перенаправит вас в UI для дополнительной визуализации.

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

wovevnkwrh2mr9lupqsyauwqby8.png


Если вы кликните по Dashboard, то увидите, что чарт Helm установил уже настроенные контрольные панели.

2ori7jhn29pkjzzrpe3uycreizi.png


-xd6eekp41qyvulcrlhm56vben4.png


Теперь, когда мы поняли, как обращаться к Grafana, Prometheus и Alertmanager, посмотрим, как использовать Loki и Tempo.

Источники данных​


Grafana поддерживает множество разных хранилищ для ваших данных временных рядов. Список поддерживаемых источников данных находится здесь.

Если вы сейчас перейдёте в Data Sources, то найдёте источники данных для Loki и Tempo, которые мы добавили в файл values.yaml.

yw1k-mmhxbw2srmt8zy-ycusmvg.png


Источник данных Prometheus был добавлен при развёртывании Kube-Prometheus.

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


eintmdtqkljoqyny9azvm8iwwhk.png


Прежде чем применить файл развёртывания, обратите внимание на переменные среды. Демо HotROD направлено через них на сборщик трейсов.

  • JAEGER_AGENT_HOST: имя хоста для связи с агентом.
  • JAEGER_AGENT_PORT: порт для сообщения с агентом.
  • JAEGER_SAMPLE_TYPE и JAEGER_SAMPLE_PARAM: используются для ручной активации сэмплинга. Подробности здесь.

Применяется он командой kubectl apply -f hotrod-deployment.yaml

▍ HotROD Service​


vim hotrod-service.yaml


ou6ipc0jcfimklclw6ctq2duy4k.png


kubectl apply -f hotrod-service.yaml

После развёртывания демо-приложения получить к нему доступ можно через проброс портов:

kubectl port-forward service/hotrod -n observability 3001:8080

Откройте в браузере http://127.0.0.1:3001/

d-pvgoamun848e1scdixsr_t5o4.png


Сгенерируйте несколько запросов/трейсов, кликнув по имени клиента. Эти запросы появятся в Grafana, что мы вскоре увидим.

0nsjkiy6orajsil75bix9fshot8.png



Просмотр трейсов в Tempo​


Время запросить логи приложения HotROD.

  • Вернитесь в Grafana и кликните по кнопке Explore.
  • Из выпадающего списка выберите в качестве источника данных Loki.
  • В разделе Labels выберите app, а затем hotrod.

cqxfuhhegk_sxbkoy5yenh3pp0m.png


  • Кликните по кнопке Run Query в верхнем правом углу.

Теперь в нижней части экрана вы увидите все логи (loki).

yzkzgzrv81d24ctaid4ucp6hlde.png


  • Кликните по одной из записей логов, чтобы её открыть. Обратите внимание на поле TraceID, которое представляет извлечённый из логов trace_id.

zuzngiqgle_2tepwwqqadrxqd1y.png


Теперь рядом с TraceID должна быть видна синяя кнопка Tempo. Кликнув по ней, вы откроете Tempo UI, где можно просмотреть информацию о трейсах.

xf6h5eis1ajpljp9u-ktqdze2sg.png


Отсюда можно использовать весь трейс, на который ведёт ссылка из логов Loki. Это очень круто, поскольку вы можете переходить напрямую из логов (Loki) в трейсы (Tempo).

Заключение​


Поздравляю, вы только что развернули стек наблюдаемости Grafana, включающий Grafana, Prometheus, Loki и Tempo.


 
Сверху