Ни одна система не может функционировать без сбоев, всегда могут возникнуть ситуации, когда в работе софта возникают проблемы. И здесь важное значение имеет 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)
fedorro
31.10.2024 17:02В случае успешной установки Tempo будет доступен по адресу ttp://localhost:16686
А на скрине Jeager, а в графане, вроде, свой интерфейс для просмотра трассировок. H в HTTP забыли, ссылки на yaml-ы не рабочие ну и тд...
Elaugaste
31.10.2024 17:02Уровень материала оставляет желать лучшего. Не сказали почти ничего полезного. Значительную часть сервисов оставили за бортом. Про мимир толком вообще не пояснили зачем нужен.
selivanov_pavel
Я правильно понимаю, что если для тех же логов nginx я хочу посмотреть все запросы по определённому URL - это будет по скорости как обычный grep?
Elaugaste
И да и нет. Лейблы индексируются, плюс локи вытащит из с3 только нужные чанки. Плюс локи умеет параллелитьзадачи фильтрации. В итоге как привило все работает шустро. Само собой пока вы не попросите его погрепать пару десятков гб.
Mmefko
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
DANic
Если вы все uri сделаете инднексами, то почти наверняка ваш локи взорвётся уже на 500rps. Либо вам придётся залить его тонной ресурсов. Динамические лейблы являются антипатеном для loki и прямо в доке разработчики об этом пишут. Можно сделать метрику на основе логов в promtail, не забыв после стейджа с созданием метрики удалить лишние лейблы, вот только такая метрика тоже будет весьма объёмной. Я последнюю неделю пытаюсь победить эту задачу чтобы поучить график rps by Hostname, URI, status code глубиной в две недели на 1000 rps и не купить Безосу яхту