Маршрутизация в Alertmanager: уведомления в Telegram с правилами ингибиции

Published: 2026-03-20

Alertmanager получает алерты от Prometheus и маршрутизирует их получателям. Без продуманного дерева маршрутов вы получите 200 уведомлений там, где упал один узел. С правилами ингибиции и группировкой — срабатывает один алерт, остальные заглушаются автоматически.


Структура конфигурации

yamlalertmanager:
  config:
    global:
      resolve_timeout: 5m

    route:
      receiver: "null"
      group_by: [alertname, cluster, namespace]
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 12h
      routes:
        - matchers: [severity=critical]
          receiver: telegram-critical
          repeat_interval: 4h
        - matchers: [severity=warning]
          receiver: telegram-warnings
          repeat_interval: 24h
        - matchers: [alertname=Watchdog]
          receiver: "null"

    inhibit_rules:
      - source_matchers: [severity=critical]
        target_matchers: [severity=warning]
        equal: [alertname, namespace]
      - source_matchers: [alertname=KubeNodeNotReady]
        target_matchers: [alertname=KubePodNotRunning]
        equal: [node]

    receivers:
      - name: "null"
      - name: telegram-critical
        telegram_configs:
          - bot_token: "${TELEGRAM_BOT_TOKEN}"
            chat_id: -100XXXXXXXXX
            message: |
              🔴 *{{ .GroupLabels.alertname }}*
              {{ range .Alerts }}
              *Namespace:* {{ .Labels.namespace }}
              *Summary:* {{ .Annotations.summary }}
              {{ end }}
      - name: telegram-warnings
        telegram_configs:
          - bot_token: "${TELEGRAM_BOT_TOKEN}"
            chat_id: -100XXXXXXXXX
            message: |
              ⚠️ *{{ .GroupLabels.alertname }}*
              {{ range .Alerts }}
              *Namespace:* {{ .Labels.namespace }}
              {{ .Annotations.description }}
              {{ end }}

Настройка Telegram-бота

1. Создать бота через @BotFather, сохранить токен
2. Добавить бота в группу
3. Получить chat_id: curl https://api.telegram.org/bot<TOKEN>/getUpdates
4. chat_id группы — отрицательное число (-100XXXXXXXXX)

Храните токен в SealedSecret, ссылайтесь на него:

yamlalertmanager:
  alertmanagerSpec:
    configSecret: alertmanager-secret

Правила ингибиции

Ингибиция подавляет target-алерты, когда срабатывает source-алерт.

yaml- source_matchers: [alertname=KubeNodeNotReady]
  target_matchers: [alertname=KubePodNotRunning]
  equal: [node]

Если KubeNodeNotReady сработал для node=worker-1, все KubePodNotRunning с node=worker-1 подавляются. Про падение узла уже известно — 20 алертов по подам не нужны.

yaml- source_matchers: [severity=critical]
  target_matchers: [severity=warning]
  equal: [alertname, namespace]

Критический алерт подавляет warning с тем же именем в том же неймспейсе.


Пояснение группировки

  • group_wait: 30s — подождать 30 с после первого алерта, собирая остальные
  • group_interval: 5m — минимальный интервал между уведомлениями одной группы
  • repeat_interval: 12h — повторное уведомление каждые 12 ч, пока алерт активен. Для critical — 4 ч, для warning — 24 ч

Заглушение алертов на время обслуживания

bashamtool --alertmanager.url=http://alertmanager.monitoring.svc:9093 \
  silence add \
  alertname=KubeNodeNotReady \
  --duration=2h \
  --comment="Плановое обслуживание worker-1"

Тестирование маршрутизации

bash# Проверить какой receiver обрабатывает алерт
amtool --alertmanager.url=http://alertmanager.monitoring.svc:9093 \
  config routes test \
  --verify.receivers=telegram-critical \
  alertname="KubeNodeNotReady" severity="critical"

# Список всех активных алертов
amtool --alertmanager.url=http://alertmanager.monitoring.svc:9093 \
  alert query

# Проверить ингибиции
amtool --alertmanager.url=http://alertmanager.monitoring.svc:9093 \
  alert query --inhibited

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

Все алерты идут в "null": неправильный синтаксис matchers или отсутствует маршрут. Используйте amtool config routes test.

Telegram-бот не доставляет сообщения: бот должен быть администратором группы. Проверьте знак chat_id (у групп он отрицательный).

Алерты не переходят в resolved: см. resolve_timeout: 5m в global. Если Prometheus перестаёт отправлять алерт, Alertmanager ждёт 5 минут, прежде чем пометить его как resolved.