Правила записи и алертинга

Урок про два вида правил Prometheus: предрасчёт метрик и описание алертов.

Правило (rule) в Prometheus — это заранее заданное PromQL-выражение, которое Prometheus периодически вычисляет: либо чтобы сохранить результат как новую метрику, либо чтобы поднять алерт.

Тяжёлые запросы на дашбордах тормозят, а условия алертов хочется описать декларативно. Обе задачи решают правила, которые подключаются в конфиг через rule_files.

Recording rules

Recording rule заранее вычисляет выражение и сохраняет его как новый ряд. Дашборд потом читает готовую метрику — быстро и без повторного тяжёлого расчёта.

groups:
  - name: http.rules
    rules:
      - record: job:http_requests:rate5m
        expr: sum by (job) (rate(http_requests_total[5m]))

Alerting rules

Alerting rule описывает условие, при котором поднимается алерт. Ключевое поле for требует, чтобы условие держалось заданное время, — это гасит ложные срабатывания на мгновенных всплесках.

groups:
  - name: availability.rules
    rules:
      - alert: HighErrorRate
        expr: |
          sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))
            / sum by (job) (rate(http_requests_total[5m])) > 0.05
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "Высокая доля ошибок в {{ $labels.job }}"
          description: "5xx превышают 5% уже 10 минут"

Состояния алерта

Алерт проходит через состояния: inactive (условие ложно), pending (условие истинно, но ещё не прошло время for) и firing (условие держится дольше for). Только firing-алерты уходят в Alertmanager.

inactive --условие истинно--> pending --держится for--> firing
   ^------------------ условие снова ложно ----------------+

Как работает под капотом

Каждые evaluation_interval секунд Prometheus вычисляет все правила. Для recording rule результат записывается в TSDB как обычная метрика. Для alerting rule проверяется выражение: если оно вернуло ряды, для них стартует таймер for; когда он истекает, алерт переходит в firing и отправляется в Alertmanager. Метки и аннотации позволяют параметризовать сообщение через шаблоны {{ $labels.job }}.

Частые ошибки

  • Алерт без for. Сработает на любой одиночный пик и завалит дежурного шумом.
  • Сравнение, которое никогда не возвращает ряды. Если выражение пустое, алерт не сработает даже при реальной проблеме — тестируйте expr вручную.
  • Тяжёлые запросы прямо в alerting rule. Лучше вынести расчёт в recording rule и алертить по готовой метрике.

Итог

  • Recording rule предрассчитывает метрику для скорости дашбордов.
  • Alerting rule описывает условие; for отсекает короткие всплески.
  • Алерт идёт inactive → pending → firing; в Alertmanager уходит только firing.
Проверьте себя
1. Зачем нужна recording rule?
AЧтобы отправлять уведомления
BЧтобы заранее вычислить выражение и сохранить как метрику для скорости
CЧтобы удалять старые данные
DЧтобы перезапускать цели
2. Что делает поле for в alerting rule?
AЗадаёт получателя уведомления
BТребует, чтобы условие держалось заданное время до перехода в firing
CОграничивает число лейблов
DУказывает интервал scrape
3. Какие алерты уходят в Alertmanager?
Ainactive
Bpending
Cfiring
Dвсе сразу