Ни одна система не может функционировать без сбоев, всегда могут возникнуть ситуации, когда в работе софта возникают проблемы. И здесь важное значение имеет 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: мониторинг, логирование, трейсинг».

Комментарии (7)


  1. selivanov_pavel
    31.10.2024 17:02

    Loki ... не индексирует содержимое журналов, а представляет собой набор меток для каждого потока журналов.

    Я правильно понимаю, что если для тех же логов nginx я хочу посмотреть все запросы по определённому URL - это будет по скорости как обычный grep?


    1. Elaugaste
      31.10.2024 17:02

      И да и нет. Лейблы индексируются, плюс локи вытащит из с3 только нужные чанки. Плюс локи умеет параллелитьзадачи фильтрации. В итоге как привило все работает шустро. Само собой пока вы не попросите его погрепать пару десятков гб.


    1. Mmefko
      31.10.2024 17:02

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

      Второй момент, это querier инстансы, которые могут скейлится горизонтально и вычитывать чанки с логами параллельно, ускоряя поиск.

      Вот здесь хорошо описаны эти моменты:

      https://grafana.com/blog/2023/12/20/the-concise-guide-to-grafana-loki-everything-you-need-to-know-about-labels/?utm_source=grafana_news&utm_medium=rss

      https://grafana.com/blog/2023/12/28/the-concise-guide-to-loki-how-to-get-the-most-out-of-your-query-performance/?utm_source=grafana_news&utm_medium=rss


    1. DANic
      31.10.2024 17:02

      Если вы все uri сделаете инднексами, то почти наверняка ваш локи взорвётся уже на 500rps. Либо вам придётся залить его тонной ресурсов. Динамические лейблы являются антипатеном для loki и прямо в доке разработчики об этом пишут. Можно сделать метрику на основе логов в promtail, не забыв после стейджа с созданием метрики удалить лишние лейблы, вот только такая метрика тоже будет весьма объёмной. Я последнюю неделю пытаюсь победить эту задачу чтобы поучить график rps by Hostname, URI, status code глубиной в две недели на 1000 rps и не купить Безосу яхту


  1. fedorro
    31.10.2024 17:02

    В случае успешной установки Tempo будет доступен по адресу ttp://localhost:16686

    А на скрине Jeager, а в графане, вроде, свой интерфейс для просмотра трассировок. H в HTTP забыли, ссылки на yaml-ы не рабочие ну и тд...


  1. Elaugaste
    31.10.2024 17:02

    Уровень материала оставляет желать лучшего. Не сказали почти ничего полезного. Значительную часть сервисов оставили за бортом. Про мимир толком вообще не пояснили зачем нужен.


  1. Ymrs
    31.10.2024 17:02

    Одна вода