Перейти к содержимому

Отправка алертов из Prometheus на вебхук

Чтобы получать алерты Prometheus в Telegram, на Email или в Пачке через Депешер, настройте webhook receiver в Alertmanager. Prometheus проверяет правила и передаёт алерты Alertmanager, а тот отправляет HTTP POST с JSON на адрес входящего канала Депешера. Эта схема описана в обзоре уведомлений Prometheus.

text
Правило Prometheus → Alertmanager → Вебхук Депешера → Telegram / Email / Пачка

Ниже используются обычные файлы конфигурации уже установленных Prometheus и Alertmanager. Адреса и пути замените своими; для контейнеров они должны быть доступны из соответствующего контейнера.

Подготовьте каналы Депешера

  1. Создайте и подтвердите нужные исходящие каналы.
  2. Создайте входящий канал, например «Prometheus».
  3. Свяжите его с подготовленными получателями и скопируйте публичный URL вида https://depesher.ru/w/ВАШ_PUBLIC_ID.
  4. Проверьте доставку по инструкции «Первое уведомление».

Депешер принимает application/json. Без шаблона получатель увидит исходное тело; ниже настроим его оформление. Рабочий URL и токен канала не публикуйте в репозитории.

Настройте получателя в Alertmanager

Минимальный alertmanager.yml для отправки всех алертов в Депешер:

yaml
route:
  receiver: depesher
  group_by: [alertname, job]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

receivers:
  - name: depesher
    webhook_configs:
      - url: "https://depesher.ru/w/ВАШ_PUBLIC_ID"
        send_resolved: true

Если Alertmanager уже обслуживает другие уведомления, добавьте receiver depesher в существующий список и направьте к нему нужный маршрут; целиком заменять рабочую конфигурацию этим примером не нужно.

group_by объединяет алерты по имени и заданию. group_wait задаёт ожидание первой отправки, group_interval — интервал проверки изменений группы, repeat_interval — повтор неизменившегося уведомления. send_resolved: true включает уведомления о восстановлении. Формат POST-запроса задаёт стандартный webhook receiver Alertmanager.

Если канал Депешера защищён токеном, дополните элемент webhook_configs:

yaml
receivers:
  - name: depesher
    webhook_configs:
      - url: "https://depesher.ru/w/ВАШ_PUBLIC_ID"
        send_resolved: true
        http_config:
          authorization:
            type: Bearer
            credentials_file: /etc/alertmanager/secrets/depesher-token

Файл должен содержать только токен, без префикса Bearer, и быть доступен процессу Alertmanager. Заголовок Authorization сформирует настройка HTTP-клиента. Для канала без токена блок http_config не нужен.

Подключите Prometheus к Alertmanager

В prometheus.yml добавьте файл правил и адрес Alertmanager. Существующие scrape_configs сохраните; если rule_files или alerting уже есть, дополните их:

yaml
rule_files:
  - /etc/prometheus/depesher-alerts.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - "alertmanager:9093"

Здесь alertmanager:9093 — пример сетевого адреса Alertmanager, доступного из Prometheus. URL Депешера указывается только в webhook_configs Alertmanager. Подробнее — в конфигурации Prometheus.

Создайте /etc/prometheus/depesher-alerts.yml с правилом недоступности наблюдаемого объекта:

yaml
groups:
  - name: depesher-alerts
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Не удаётся собрать метрики с {{ $labels.instance }}"
          description: "Задание {{ $labels.job }}: сбор метрик неуспешен более двух минут."

Правило относится к объектам, которые Prometheus уже опрашивает. up == 0 означает неуспешный сбор метрик: причиной может быть как сам сервис, так и сеть или exporter. for: 2m требует, чтобы условие сохранялось две минуты; до этого алерт находится в состоянии pending. Подстановки $labels вычисляет Prometheus в аннотациях правила.

Оформите JSON шаблоном Депешера

Создайте шаблон в формате «Обычный текст» и привяжите его к входящему каналу:

text
Prometheus: {{json.status}}
Алерт: {{json.commonLabels.alertname}}
Задание: {{json.commonLabels.job}}

События:
{{json.alerts}}

Такой шаблон использует поддерживаемые Депешером пути в JSON. Массив alerts вставляется целиком компактным JSON, поэтому текст содержит все полученные события группы.

Для короткого уведомления о первом событии можно использовать:

text
Prometheus: {{json.status}}
Первое событие: {{json.alerts.0.annotations.summary}}
Описание: {{json.alerts.0.annotations.description}}
Объект: {{json.alerts.0.labels.instance}}
Статус первого события: {{json.alerts.0.status}}

Этот вариант показывает только элемент с индексом 0. Для группы из нескольких алертов используйте первый шаблон или добавьте в короткий вариант {{json.alerts}}.

В стандартном JSON commonLabels содержит общие метки группы; индивидуальные метки и аннотации находятся в alerts. Групповой status равен firing, пока хотя бы один алерт активен, и resolved, когда все разрешены. Структура данных описана в справочнике уведомлений Alertmanager. Отсутствующее поле Депешер заменяет пустой строкой. Обычный текст позволяет избежать влияния символов из меток на Markdown-разметку.

Проверьте всю цепочку

Проверьте конфигурации утилитами из установленных Prometheus и Alertmanager:

bash
promtool check rules /etc/prometheus/depesher-alerts.yml
promtool check config /etc/prometheus/prometheus.yml
amtool check-config /etc/alertmanager/alertmanager.yml

Примените изменения перезапуском соответствующих служб или штатной перезагрузкой конфигурации. Для Prometheus перезагрузка через HTTP требует включённого --web.enable-lifecycle; также поддерживается SIGHUP. См. загрузку конфигурации Prometheus и Alertmanager.

Чтобы проверить отправку без остановки сервиса, временно добавьте в список rules того же файла:

yaml
- alert: DepesherWebhookTest
  expr: vector(1)
  for: 1m
  labels:
    severity: info
    job: depesher-test
  annotations:
    summary: "Проверка вебхука Депешера"
    description: "Тестовое правило Prometheus, можно удалить после проверки."

После проверки файла и перезагрузки Prometheus:

  1. Найдите DepesherWebhookTest на странице Alerts в Prometheus. Дождитесь перехода из pending в firing.
  2. Убедитесь, что алерт появился в Alertmanager. Отправка учитывает интервал вычисления правил и group_wait, поэтому она не мгновенная.
  3. Откройте историю входящего канала Депешера и проверьте JSON, затем сообщение у получателя.
  4. Для проверки восстановления замените тестовое выражение на vector(1) == 0 и перезагрузите правила. После обработки изменения группы ожидайте уведомление resolved.
  5. Удалите тестовое правило и снова примените конфигурацию.

Если уведомление не пришло

  • Нет алерта в Prometheus: проверьте загрузку файла правил, результат выражения и время for.
  • Нет алерта в Alertmanager: проверьте адрес в alerting.alertmanagers и доступность Alertmanager из Prometheus.
  • Алерт есть, POST не приходит: проверьте маршрут к receiver depesher, silences, inhibition и интервалы группировки. Посмотрите ошибки отправки в логах Alertmanager.
  • Вебхук отклоняет запрос: сверьте URL и Bearer-токен. HTTP 413 может означать превышение лимита JSON Депешера в 1 048 576 байт; уменьшите размер групп. max_alerts в Alertmanager обрезает список, а не разбивает его на отдельные сообщения.
  • Запрос есть в истории, сообщения у получателя нет: проверьте подтверждение и привязку исходящего канала по инструкции диагностики доставки.

История Депешера помогает отделить приём вебхука от доставки в выбранный канал. Состояние самого инцидента проверяйте в Prometheus и Alertmanager.