Как настроить перенаправление алертов в конкретные каналы в Alertmanager?

«Как настроить перенаправление алертов в конкретные каналы в Alertmanager?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моих проектах настройка маршрутизации алертов в 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:'

Как это работает в моей практике:

  1. Метки (labels) из Prometheus алертов (severity: critical, team: backend) определяют маршрут
  2. Приоритетность: первый подходящий match или match_re побеждает (если не указано continue: true)
  3. Группировка: group_by объединяет похожие алерты, чтобы не заспамить канал
  4. Троттлинг: 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 для подавления менее важных алертов при критических проблемах.