Grafana Stack: закрываем все современные потребности Observability
Ни одна система не может функционировать без сбоев, всегда могут возникнуть ситуации, когда в работе софта возникают проблемы. И здесь важное значение имеет observability — понятие, включающее в себя мониторинг и наблюдаемость. С помощью мониторинга мы можем определить, когда возникла проблема, а наблюдаемость позволяет нам понять, почему она возникла.
В этой статье мы поговорим о том, как можно реализовать observability с помощью сервисов стека Grafana.
Сервисы Grafana
Прежде всего, нам необходимо познакомиться с теми сервисами, из которых состоит стек LGTM. Это сервисы Loki, Mimir и Tempo. Каждая из них представляет собой серверную систему агрегации информации для различных типов данных: журналов, метрик и трассировок. Grafana обеспечивает отправную точку для выполнения запросов и визуализации данных, поступающих из нескольких источников, подключенных к данной системе.
Важным элементом observability является наличие возможности оповещения при наступлении определенных событий, или превышения метриками некоторых пороговых значений.
Дополнительный момент здесь касается метрик, которые сами по себе уже очень полезны, но в сочетании с оповещениями они становятся основой для выявления проблем. Сначала мы можем определить, как управлять метриками, экстраполировать это на журналы и трассировки и доработать, также настроив оповещения.
Рассмотрим каждый из этих сервисов более подробно.
Агрегатор журналов Loki
Loki — это горизонтально масштабируемая, высокодоступная, мультитенантная система агрегации журналов. Она разработана таким образом, чтобы быть экономной в плане ресурсов и простой в эксплуатации. Она не индексирует содержимое журналов, а представляет собой набор меток для каждого потока журналов. Проект Loki был запущен в Grafana Labs в 2018 году под лицензией AGPLv3.
Loki позволяет отслеживать журналы в режиме реального времени, чтобы просматривать события по мере их поступления в систему, обновлять данные через определенные интервалы времени, просматривать журналы за определенную дату и т. д. Встроенная интеграция с Prometheus, Grafana и K8s позволяет легко переключаться между метриками, журналами и трассировками в рамках единого пользовательского интерфейса.
Важным преимуществом Loki является то, что он индексирует только метаданные, а не полный текст всей записи в журнале:
Благодаря такому подходу мы можем существенно сэкономить время и ресурсы. В частности, такой подход минимальной индексации означает, что для хранения одного и того же набора журналов в Loki требуется гораздо меньше места, чем при использовании других решений.
Для работы с журналами Loki предлагает использовать мощный язык запросов LogQL. Вы можете выполнить запросы LogQL непосредственно в Grafana, чтобы визуализировать результаты, или с помощью LogCLI — для тех, кто предпочитает работу с командной строкой.
Вот несколько примеров таких запросов:
С помощью следующего запроса мы можем получить данные по скорости выполнения HTTP‑запросов GET из журналов NGINX:
avg(rate(({job="nginx"} |= "GET")[10s])) by (region)
А в этом запросе мы группируем по уровням количество записей за последние пять минут:
sum(count_over_time({job="mysql"}[5m])) by (level)
Также в Loki можно настроить правила оповещения, для того, чтобы в случае превышения пороговых значений можно было отправлять предупреждения в Prometheus Alertmanager для последующей обработки.
На сайте Grafana можно найти несколько вариантов установки Loki для различных сред.
В целях изучения можно по традиции воспользоваться контейнеризацией:
$ mkdir grafana-loki
$ cd grafana-loki
$ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml -O loki-config.yaml
$ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/promtail-local-config.yaml -O promtail-local-config.yaml
$ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml
$ docker-compose up –d
В случае успешной установки нам будут доступны следующие URL:
http://localhost:3101/ready
http://localhost:3102/ready
Хранилище Mimir
Grafana Mimir — это программный проект с открытым исходным кодом, который обеспечивает горизонтально масштабируемое, долгосрочное хранилище для метрик Prometheus и OpenTelemetry. С его помощью можно выполнять запросы, создавать новые данные с помощью правил записи и настраивать правила оповещения сразу для нескольких клиентов.
Установить Mimir также можно несколькими способами. Проще всего взять уже готовый контейнер:
docker pull grafana/mimir:latest
Для запуска нам потребуется создать сначала новую сеть
docker network create grafanet
А затем уже запустить контейнер в этой сети.
docker run \
--rm \
--name mimir \
--network grafanet \
--publish 9009:9009 \
--volume "$(pwd)"/demo.yaml:/etc/mimir/demo.yaml grafana/mimir:latest \
--config.file=/etc/mimir/demo.yaml
При этом файл demo.yaml может иметь следующий вид:
# Do not use this configuration in production.
# It is for demonstration purposes only.
multitenancy_enabled: false
blocks_storage:
backend: filesystem
bucket_store:
sync_dir: /tmp/mimir/tsdb-sync
filesystem:
dir: /tmp/mimir/data/tsdb
tsdb:
dir: /tmp/mimir/tsdb
compactor:
data_dir: /tmp/mimir/compactor
sharding_ring:
kvstore:
store: memberlist
distributor:
ring:
instance_addr: 127.0.0.1
kvstore:
store: memberlist
ingester:
ring:
instance_addr: 127.0.0.1
kvstore:
store: memberlist
replication_factor: 1
ruler_storage:
backend: filesystem
filesystem:
dir: /tmp/mimir/rules
server:
http_listen_port: 9009
log_level: error
store_gateway:
sharding_ring:
replication_factor: 1
Трассировщик Grafana Tempo
Grafana Tempo — это серверное решение для распределенной трассировки с открытым исходным кодом. Tempo позволяет выполнять поиск трасс, генерировать показатели на основе интервалов и связывать данные отслеживания с журналами и метриками. Распределенная трассировка визуализирует жизненный цикл запроса по мере его прохождения через набор приложений.
Для работы Tempo требуется только хранилище объектов и он глубоко интегрирован с Grafana, Mimir, Prometheus и Loki, также это решение поддерживает различные протоколы трассировки с открытым исходным кодом, включая Jaeger, Zipkin или Open Telemetry.
Для установки нам тоже потребуется создать свою сеть в docker
$ docker network create docker-tempo
Далее загрузим YAML файл с примером настроек:
$ curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml
И запускаем контейнер:
docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml
Теперь вам нужно запустить контейнер для запросов Tempo query. Для этого сначала загрузим файл конфигурации tempo query.
$ curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml
Используя полученный файл конфигурации tempo-query, запустим контейнер docker.
$ docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml
В случае успешной установки Tempo будет доступен по адресу ttp://localhost:16686
Далее уже можно подключать источники к компонентам стека и настраивать их взаимодействие, но это тема отдельных статей.
Заключение
В рамках данной статьи мы рассмотрели компоненты, входящие в состав стека Grafana. Совместное использование сервисов Loki, Mimir и Tempo позволяет обеспечить полноценную наблюдаемость для целевых систем.
7 ноября пройдет открытый урок на тему «Grafana Stack: закрываем все современные потребности Observability». На нем проведем обзор и настройку Grafana Stack для комплексного мониторинга и анализа данных.
Если тема для вас актуальна, записывайтесь на урок на странице курса «Observability: мониторинг, логирование, трейсинг».