Маршрутизация в 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.