ADR 0034 — Use AlertManager for Alerting
Status
Accepted
Context
Con Prometheus recolectando métricas de infraestructura (ADR 0031), necesitamos un sistema para:
- Definir reglas de alertas basadas en métricas.
- Agrupar y deduplicar alertas.
- Enrutar notificaciones a diferentes canales (Slack, email, etc.).
- Silenciar alertas durante mantenimiento.
Decision
Utilizaremos Prometheus AlertManager para gestionar las alertas del sistema.
Reglas implementadas:
- ServiceDown: Servicio caído por >1 minuto (crítico).
- HighErrorRate: Tasa de errores 5xx >1% durante 5 minutos (warning).
- HighLatency: Latencia P95 >2 segundos durante 5 minutos (warning).
Estructura de archivos:
alertmanager/
├── alertmanager.yml # Configuración de rutas y receptores
└── alert_rules.yml # Reglas de alertas (cargado por Prometheus)
Consequences
- Pros:
- Nativa de Prometheus, sin dependencias adicionales.
- Grouping y deduplicación evitan “alert fatigue”.
- Soporta múltiples canales (Slack, PagerDuty, email, webhooks).
- Interfaz web para silenciar alertas.
- Cons / Trade-offs:
- Configuración YAML puede ser verbosa.
- Requiere servicio adicional en docker-compose.
- Sin historial de alertas persistente (solo activas).
Alternatives considered
- Grafana Alerting: Integrado en Grafana 8+, pero menos flexible para rutas complejas.
- PagerDuty/Opsgenie: Más potentes pero propietarios y costosos.
- Alertmanager silences via API: Más automatizable que UI manual.
Implementation
# docker-compose.yml
alertmanager:
image: prom/alertmanager:latest
ports:
- "9094:9093"
volumes:
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
# prometheus.yml
rule_files:
- /etc/prometheus/alert_rules.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# alertmanager/alert_rules.yml
groups:
- name: service_health
rules:
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
References
- https://prometheus.io/docs/alerting/latest/alertmanager/
- https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/