Observability 3.0. Метрики и дашборды - Prometheus, Grafana и всё остальное
Это вторая статья из серии Observability 3.0 простыми словами. Здесь разберём первый и самый важный слой - метрики и дашборды.
Метрики - это числа. CPU 85%. Память 2 из 4 GB. 347 запросов в секунду. 12 ошибок за минуту. Сами по себе эти числа мало что значат. Но когда вы видите, что вчера ошибок было 0, а сегодня 12, это уже сигнал.
Prometheus. Сборщик метрик
Prometheus - основа всего стека. Это программа, которая с заданным интервалом (по умолчанию раз в минуту, но обычно ставят 15-30 секунд) обходит все ваши серверы и приложения и забирает с них числа.
Как это работает
Представьте обход охранника. Каждую минуту охранник заходит в каждую комнату и записывает показания - температура, влажность, количество людей. Prometheus делает то же самое, только с серверами.
Технически это выглядит так. На каждом сервере работает маленькая программа (exporter), которая выставляет HTTP-эндпоинт /metrics. Prometheus ходит на этот адрес и забирает данные. Это называется pull-модель - Prometheus сам тянет данные, а не ждёт, пока ему пришлют.
Что вы увидите на практике
В интерфейсе Prometheus есть вкладка Targets. Там список всех целей с их статусом
- UP (зелёный) - Prometheus успешно забирает данные. Всё хорошо
- DOWN (красный) - связи нет. Либо сервер упал, либо exporter не работает, либо проблема с сетью
Если видите DOWN - это уже повод для расследования. Начните с простого. Сервер вообще доступен? Пингуется? Exporter запущен?
PromQL. Язык запросов
У Prometheus свой язык запросов - PromQL. Выглядит непривычно, но базовые вещи простые.
Несколько примеров, которые пригодятся в работе
up == 0
Покажет все цели, которые сейчас недоступны. Самый полезный запрос при инциденте.
rate(http_requests_total{status="500"}[5m])
Количество ошибок 500 в секунду за последние 5 минут. Если было 0 и стало 50 - проблема.
node_filesystem_avail_bytes / node_filesystem_size_bytes * 100 < 10
Серверы, на которых осталось меньше 10% свободного места на диске.
Не обязательно запоминать всё. В Grafana есть визуальный конструктор запросов, а с AI-слоем можно просто спросить - покажи серверы с забитым диском.
Grafana. Визуальная панель
Grafana сама по себе ничего не собирает и не хранит. Она берёт данные из Prometheus и других источников и показывает их красиво.
Что умеет
- Дашборды с графиками, счётчиками и таблицами. Один взгляд и вы видите состояние всей инфраструктуры
- Drill-down. Видите аномалию на графике - кликаете и проваливаетесь в детали. От обзора всех серверов до конкретного контейнера
- Период времени. Можно выбрать любой диапазон. Последние 15 минут, вчерашний день, прошлая неделя. Полезно при разборе инцидентов
- Алерты. Grafana может сама отправлять уведомления, но чаще для этого используют Alertmanager
Источники данных
Grafana подключается к десяткам систем. В нашем стеке она работает с тремя
- Prometheus - метрики, то есть числа
- Loki - логи, то есть текст
- Tempo - трейсы, то есть путь запроса через сервисы
Это главная сила Grafana. В одном дашборде вы видите график CPU из Prometheus, рядом логи приложения из Loki, и можете кликнуть на трейс из Tempo, чтобы увидеть, как конкретный запрос прошёл через все сервисы. Всё в одном месте.
Готовые дашборды
Не надо строить дашборды с нуля. На grafana.com/grafana/dashboards тысячи готовых дашбордов от сообщества. Вводите ID дашборда в Grafana и он импортируется со всеми графиками.
Популярные для начала
- 1860 - Node Exporter Full. Всё о Linux-сервере
- 14282 - cAdvisor. Контейнеры Docker
- 9628 - PostgreSQL Database
Агенты-экспортёры. Кто собирает данные
На каждом сервере работают агенты, которые выставляют метрики в формате Prometheus.
Node Exporter
Устанавливается на каждый Linux-сервер. Собирает всё о железе и ОС
- CPU - загрузка по ядрам, iowait (ожидание диска), system/user time
- Память - общая, свободная, используемая, кэш, swap
- Диск - занято/свободно, скорость чтения/записи, iops
- Сеть - трафик входящий/исходящий, ошибки, dropped пакеты
- Системная нагрузка - load average за 1, 5 и 15 минут
Это базовый набор. Если Node Exporter показывает CPU 95% и load average 20, сервер перегружен. И не важно, что говорят приложения.
cAdvisor
Запускается на серверах с Docker. Автоматически находит все контейнеры и собирает по каждому
- CPU и память контейнера отдельно от хоста
- Сетевой трафик контейнера
- Дисковый I/O контейнера
Зачем это нужно. Node Exporter показывает, что сервер загружен на 90%. Но какой именно контейнер виноват? cAdvisor ответит - контейнер order-service использует 70% CPU всего хоста.
PostgreSQL Exporter
Подключается к PostgreSQL и вытаскивает метрики базы данных
- Активные соединения - сколько подключений к базе сейчас
- Статистика запросов - через расширение pg_stat_statements можно получить время выполнения и частоту вызовов. Требует отдельной настройки
- Кэш - hit rate, то есть процент данных, найденных в кэше без обращения к диску
- Блокировки - запросы, которые ждут друг друга
- Репликация - отставание реплики от мастера
Практический пример. Cache hit rate упал с 99% до 70%. Это значит, что база стала чаще лезть на диск вместо кэша. Запросы замедлились. Причина может быть в нехватке памяти или в новых тяжёлых запросах.
Есть аналогичные экспортёры для MySQL, MongoDB, Redis, MSSQL и других баз. Полный список на prometheus.io/docs/instrumenting/exporters.
Alertmanager. Оповещения
Prometheus умеет определять, что что-то пошло не так. Alertmanager решает, что с этим делать.
Как работает
- В Prometheus настраиваются правила. Например - если CPU больше 90% дольше 5 минут, сработай
- Prometheus отправляет алерт в Alertmanager
- Alertmanager решает, кому отправить, в какой канал, группировать ли с другими алертами
Куда отправляет
- Slack
- PagerDuty
- Telegram через webhook
- Любой HTTP-эндпоинт, то есть вебхук
Умная группировка
Главная ценность Alertmanager - он не заваливает вас уведомлениями. Если упал кластер из 20 серверов, вы получите одно сообщение вместо 20 отдельных алертов.
Ещё можно настроить
- Silences - подавление алертов на время плановых работ
- Inhibition - если сработал критический алерт, подавить все warning-алерты от того же сервиса
- Routing - разные алерты разным командам. Алерт о переполнении базы идёт DBA, алерт о падении пода идёт DevOps
Пример правила
groups:
- name: disk
rules:
- alert: DiskSpaceLow
expr: node_filesystem_avail_bytes / node_filesystem_size_bytes * 100 < 10
for: 5m
labels:
severity: warning
annotations:
summary: "Мало места на диске ({{ $labels.instance }})"
description: "Осталось {{ $value | printf \"%.1f\" }}% свободного места"
Этот алерт сработает, если на любом сервере останется меньше 10% диска в течение 5 минут. Просто, понятно, полезно.
Как всё это связано
Поток данных выглядит так
- Экспортёры (Node Exporter, cAdvisor, PostgreSQL Exporter) собирают метрики на серверах
- Prometheus забирает метрики с экспортёров с заданным интервалом и хранит их
- Alertmanager получает от Prometheus сработавшие правила и отправляет уведомления
- Grafana читает данные из Prometheus и показывает дашборды
Быстрый старт. Docker Compose
Весь минимальный стек можно поднять одним файлом. Создайте docker-compose.yml
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
restart: unless-stopped
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
restart: unless-stopped
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stopped
alertmanager:
image: prom/alertmanager:latest
ports:
- "9093:9093"
restart: unless-stopped
volumes:
prometheus-data:
grafana-data:
И файл конфигурации prometheus.yml рядом
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
Запуск
docker compose up -d
После запуска
- Prometheus на
http://localhost:9090(проверьте Status → Targets, все должны быть UP) - Grafana на
http://localhost:3000(логин admin/admin) - В Grafana добавьте Data Source → Prometheus → URL
http://prometheus:9090 - Импортируйте дашборд 1860 (Node Exporter Full) через Dashboards → Import → ID 1860
Весь стек занимает около 500 MB RAM и работает на любом ноутбуке.
Это минимальный стек. Он уже даёт огромное преимущество перед ручным мониторингом через SSH. Добавление логов и трейсов - следующий шаг, который разберём в отдельной статье.
Часть серии Observability 3.0 простыми словами. На основе материалов Cumhur M. Akkaya.


