Как проверить алерт до аварии: тесты правил с promtool

Порог в правиле выглядит правильно, но поведение во времени трудно проверить чтением YAML. Когда начинается pending? Что произойдёт после короткого восстановления? Не затронула ли правка labels ожидаемое уведомление? Для этих вопросов удобен небольшой воспроизводимый набор samples, который вычисляет сам Prometheus через promtool.

Возьмём доступность одного target. Он работает на нулевой минуте, затем четыре минуты не опрашивается успешно и на пятой восстанавливается. Правило должно перейти в firing после двух минут непрерывно наблюдаемого нулевого up. Все интервалы в примере равны минуте, чтобы границы легко проверялись.

Сохраним правило отдельно

Файл rules.yml содержит обычную группу:

groups:
  - name: availability
    rules:
      - alert: ApiDown
        expr: up{job="api"} == 0
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "API target недоступен"

Само сравнение возвращает подходящую серию со значением 0. Для активности алерта важно её присутствие в результирующем векторе. Модификатор bool здесь не нужен. Теперь создадим рядом tests.yml:

rule_files:
  - rules.yml
evaluation_interval: 1m
tests:
  - interval: 1m
    input_series:
      - series: 'up{job="api",instance="api:9100"}'
        values: '1 0 0 0 0 1'
    alert_rule_test:
      - eval_time: 2m
        alertname: ApiDown
        exp_alerts: []
      - eval_time: 3m
        alertname: ApiDown
        exp_alerts:
          - exp_labels:
              job: api
              instance: api:9100
              severity: warning
            exp_annotations:
              summary: "API target недоступен"
      - eval_time: 5m
        alertname: ApiDown
        exp_alerts: []

Разберём ожидаемое время

Первый sample относится к 0m. На 1m up впервые равен нулю, и начинается pending. На 2m прошла только одна минута ожидания: firing-алертов нет. На 3m условие выдержано две минуты, поэтому ожидается один алерт с заданными labels и annotation. На 5m up снова равен единице, и выражение больше не возвращает эту серию.

Тест на 2m особенно полезен: если случайно убрать for, он завершится ошибкой, хотя проверка только на 3m могла бы остаться зелёной. Проверка 5m подтверждает завершение при восстановлении. exp_alerts описывает firing-алерты; пустой список не доказывает отсутствие pending.

Запустим проверку в проекте

promtool check rules rules.yml
promtool test rules tests.yml

Запускайте команды из каталога с обоими файлами. Первая проверяет правила, вторая вычисляет заданные временные случаи и сравнивает ожидаемые результаты. Успех теста означает совпадение этой модели с ожиданием. Версию promtool удобно согласовать с используемым Prometheus, чтобы изменения языка и возможностей не расходились между CI и сервером.

В expected labels перечислены labels результирующего алерта без метки alertname: имя алерта уже задано в alertname тестового случая. Если выражение агрегирует instance, ожидаемый набор также меняется. Проверка полного набора labels полезна: случайно добавленная группировка может раздробить одно событие на несколько или удалить поле, по которому Alertmanager выбирает получателя.

Добавим сценарий, который действительно меняет решение

Следующим тестом можно задать краткое восстановление до границы for. Например, последовательность с единицей на 2m прерывает ожидание, и firing на 3m уже не должен появляться. Отсутствующие samples и stale-маркеры проверяются отдельно: они моделируют другую ситуацию, чем явно записанный нулевой up.

Не заменяйте все случаи одним длинным рядом. У каждого сценария должен быть собственный вопрос: раньше срока, после срока, после восстановления, при исчезновении данных. Тогда провал теста сразу указывает, какой контракт изменился.

Promtool не проверяет маршрут Alertmanager, credentials webhook и реальную доставку сообщения. Эти границы испытывают отдельно на тестовом получателе. Проверка правил закрывает более узкий и важный участок: при заданных данных алерт начинает и заканчивает firing в ожидаемые моменты.

Ещё по теме

Продолжить изучение

Хотите построить мониторинг, который помогает находить причины сбоев? Метрики, дашборды и оповещения входят в программу «Prometheus и Grafana: мониторинг и observability».

Продолжить на практике

  • Prometheus и Grafana: мониторинг и observability ↗

    Замечайте сбои до жалоб пользователей. Соберите мониторинг приложения: метрики Prometheus, запросы PromQL, дашборды Grafana и алерты, по которым понятно, что делать. Итог — наблюдаемый сервис и разбор учебного инцидента.