Skip to content
imarch.dev
Назад в блог
· 7 мин чтения

Observability 3.0. Метрики и дашборды - Prometheus, Grafana и всё остальное

DevOps мониторинг 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 решает, что с этим делать.

Как работает

  1. В Prometheus настраиваются правила. Например - если CPU больше 90% дольше 5 минут, сработай
  2. Prometheus отправляет алерт в Alertmanager
  3. Alertmanager решает, кому отправить, в какой канал, группировать ли с другими алертами

Куда отправляет

  • Slack
  • Email
  • 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 минут. Просто, понятно, полезно.

Как всё это связано

Поток данных выглядит так

  1. Экспортёры (Node Exporter, cAdvisor, PostgreSQL Exporter) собирают метрики на серверах
  2. Prometheus забирает метрики с экспортёров с заданным интервалом и хранит их
  3. Alertmanager получает от Prometheus сработавшие правила и отправляет уведомления
  4. 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.

Поделиться:

Похожие статьи