Grafana Stack: закрываем все современные потребности Observability

Ни одна система не может функционировать без сбоев, всегда могут возникнуть ситуации, когда в работе софта возникают проблемы. И здесь важное значение имеет observability — понятие, включающее в себя мониторинг и наблюдаемость. С помощью мониторинга мы можем определить, когда возникла проблема, а наблюдаемость позволяет нам понять, почему она возникла.

В этой статье мы поговорим о том, как можно реализовать observability с помощью сервисов стека Grafana.

Сервисы Grafana

Прежде всего, нам необходимо познакомиться с теми сервисами, из которых состоит стек LGTM. Это сервисы Loki, Mimir и Tempo. Каждая из них представляет собой серверную систему агрегации информации для различных типов данных: журналов, метрик и трассировок. Grafana обеспечивает отправную точку для выполнения запросов и визуализации данных, поступающих из нескольких источников, подключенных к данной системе.

303e25ed52a94750bed37fce82bb43d6.png

Важным элементом observability является наличие возможности оповещения при наступлении определенных событий, или превышения метриками некоторых пороговых значений.

Дополнительный момент здесь касается метрик, которые сами по себе уже очень полезны, но в сочетании с оповещениями они становятся основой для выявления проблем. Сначала мы можем определить, как управлять метриками, экстраполировать это на журналы и трассировки и доработать, также настроив оповещения.

Рассмотрим каждый из этих сервисов более подробно.

Агрегатор журналов Loki

Loki — это горизонтально масштабируемая, высокодоступная, мультитенантная система агрегации журналов. Она разработана таким образом, чтобы быть экономной в плане ресурсов и простой в эксплуатации. Она не индексирует содержимое журналов, а представляет собой набор меток для каждого потока журналов. Проект Loki был запущен в Grafana Labs в 2018 году под лицензией AGPLv3.

Loki позволяет отслеживать журналы в режиме реального времени, чтобы просматривать события по мере их поступления в систему, обновлять данные через определенные интервалы времени, просматривать журналы за определенную дату и т. д. Встроенная интеграция с Prometheus, Grafana и K8s позволяет легко переключаться между метриками, журналами и трассировками в рамках единого пользовательского интерфейса.

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

827a0db7343b707614d6ee8fb44027f8.png

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

d034572ff7120ef30b1d315c5c47f6ba.png

Для установки нам тоже потребуется создать свою сеть в 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

a3117797d78d9b8c48f20754130c50cf.png

Далее уже можно подключать источники к компонентам стека и настраивать их взаимодействие, но это тема отдельных статей.

Заключение

В рамках данной статьи мы рассмотрели компоненты, входящие в состав стека Grafana. Совместное использование сервисов Loki, Mimir и Tempo позволяет обеспечить полноценную наблюдаемость для целевых систем.

7 ноября пройдет открытый урок на тему «Grafana Stack: закрываем все современные потребности Observability». На нем проведем обзор и настройку Grafana Stack для комплексного мониторинга и анализа данных.

Если тема для вас актуальна, записывайтесь на урок на странице курса «Observability: мониторинг, логирование, трейсинг».

© Habrahabr.ru