Ответ
В моих проектах настройка маршрутизации алертов в Alertmanager выглядит так:
Базовый конфигурационный файл alertmanager.yml:
global:
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alerts@company.com'
slack_api_url: 'https://hooks.slack.com/services/...'
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default-email'
routes:
# Критические алерты в Slack и PagerDuty
- match:
severity: critical
receiver: 'critical-team'
continue: false # остановить дальнейшую маршрутизацию
# Алерты от баз данных только DBA-команде
- match_re:
service: '(postgres|mysql|redis)'
receiver: 'dba-team'
group_by: ['database']
# Алерты по конкретному приложению
- match:
app: 'payment-service'
environment: production
receiver: 'payment-team-slack'
receivers:
- name: 'default-email'
email_configs:
- to: 'devops@company.com'
- name: 'critical-team'
slack_configs:
- channel: '#alerts-critical'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}n{{ end }}'
pagerduty_configs:
- service_key: 'your-pagerduty-key'
- name: 'dba-team'
webhook_configs:
- url: 'http://dba-webhook:9095/alert'
- name: 'payment-team-slack'
slack_configs:
- channel: '#team-payment'
icon_emoji: ':credit_card:'
Как это работает в моей практике:
- Метки (labels) из Prometheus алертов (
severity: critical,team: backend) определяют маршрут - Приоритетность: первый подходящий
matchилиmatch_reпобеждает (если не указаноcontinue: true) - Группировка:
group_byобъединяет похожие алерты, чтобы не заспамить канал - Троттлинг:
repeat_intervalпредотвращает частые повторные уведомления
Для тестирования маршрутизации:
# Проверка конфига
alertmanager --config.file=alertmanager.yml --check-config
# Отправка тестового алерта
curl -H "Content-Type: application/json" -d '[{"labels":{"alertname":"TestAlert","severity":"critical"}}]' http://alertmanager:9093/api/v1/alerts
В production я всегда добавляю inhibit_rules для подавления менее важных алертов при критических проблемах.