Практикум Prometheus — Alertmanager и Grafana Alerting
Практикум, шаг 6 из 9. Назад — экспортёры. Дальше — Loki, Tempo, Mimir.
Два контура алертинга
| Контур | Где правила | Куда летят уведомления |
|---|---|---|
| Prometheus + Alertmanager | rules/*.yml в Prometheus | Alertmanager → email, Slack, Telegram |
| Grafana Unified Alerting | UI Grafana или provisioning | Contact points, notification policies |
Оба могут сосуществовать. Классический cloud-native путь — Prometheus rules → Alertmanager.
Документация — Alertmanager, Tutorial alerting. Готовые expr для алертов (диск, error rate, P99) с разбором — галерея PromQL, раздел 6.
Alerting rule в Prometheus
rules/alerts.yml:
groups:
- name: host
rules:
- alert: HostDown
expr: up{job="node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Node {{ $labels.instance }} down"
description: "Target unreachable more than 2 minutes."
- alert: DiskSpaceLow
expr: |
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}
/ node_filesystem_size_bytes) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "Disk >90% on {{ $labels.instance }}"
Подключение в prometheus.yml:
rule_files:
- /etc/prometheus/rules/*.yml
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
Проверка:
promtool check rules rules/alerts.yml
В UI Prometheus — вкладка Alerts (Pending → Firing после for).
Alertmanager в Compose
alertmanager:
image: prom/alertmanager:v0.27.0
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
alertmanager.yml — минимальная маршрутизация:
route:
receiver: default
group_by: ['alertname', 'job']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: default
webhook_configs:
- url: 'http://127.0.0.1:5001/' # тестовый webhook или Alertmanager Bot
UI Alertmanager — http://localhost:9093 — silences, grouping, status.
Inhibition и grouping
Grouping — одно письмо на пачку алертов HostDown по кластеру.
Inhibition — если HostDown, подавить DiskSpaceLow на том же instance:
inhibit_rules:
- source_matchers:
- alertname = HostDown
target_matchers:
- alertname = DiskSpaceLow
equal: ['instance']
Grafana Unified Alerting
Alerting → Alert rules → New alert rule
- Query A — PromQL, например
avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.1. - Condition — порог.
- Contact point — Slack, email, Telegram (настройте в Contact points).
- Notification policy — маршрут по label
severity.
Плюс Grafana — алерты по Loki и Tempo, не только Prometheus.
Минус дублирования — держите один источник правды для prod (либо Prometheus rules, либо Grafana, с документированным исключением).
Практическое упражнение
- Остановите
node_exporter:docker compose stop node_exporter. - Дождитесь Pending → Firing для
HostDown. - Откройте Alertmanager — группа алертов.
- Создайте Silence на 1 час для maintenance.
- Запустите exporter снова — алерт Resolved.
Runbook в annotations
annotations:
summary: "High error rate on {{ $labels.job }}"
runbook_url: "https://wiki.example.com/runbooks/high-5xx"
Grafana может показывать ссылку в notification template.
Чек-лист
-
promtool check rulesбез ошибок - Alertmanager в Targets Prometheus (status → alertmanagers)
- Тестовый алерт переходит в Firing
- Silence работает в UI Alertmanager
Дальше — логи, трейсы, Mimir.