Alerting: настройка оповещений
Alerting — автоматическая отправка уведомлений (Slack, email, PagerDuty) при нарушении пороговых значений метрик: высокий error rate, большая latency, недоступность сервиса.
Зачем нужно
Мониторинг без алертов бесполезен: дашборды никто не смотрит 24/7. Алерты сообщают команде о проблеме до того, как её заметят пользователи. Правильно настроенный alerting — разница между «узнали о проблеме через 2 минуты» и «пользователи пишут в поддержку час».
Где используется
- Оповещение в Slack при error rate > 1%
- PagerDuty-звонок дежурному при недоступности сервиса
- Email при превышении биллинга AWS
- Webhook при деградации производительности (latency P99 > 2s)
Основной контент
Alertmanager (часть стека Prometheus)
# alertmanager.yml
global:
slack_api_url: 'https://hooks.slack.com/services/T.../B.../xxx'
route:
receiver: slack-alerts
group_by: [alertname, severity]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: slack-alerts
slack_configs:
- channel: '#alerts'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'
send_resolved: true
Правила алертов в Prometheus
# alerts.yml
groups:
- name: api-alerts
rules:
# Высокий error rate
- alert: HighErrorRate
expr: |
rate(http_requests_total{status=~"5.."}[5m])
/ rate(http_requests_total[5m]) > 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "High error rate on {{ $labels.instance }}"
description: "Error rate is {{ $value | humanizePercentage }}"
# Высокая latency
- alert: HighLatency
expr: |
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: warning
annotations:
description: "P99 latency is {{ $value }}s"
# Сервис недоступен
- alert: ServiceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
description: "{{ $labels.instance }} is down"
Простой Uptime-мониторинг с оповещением
// healthcheck.js — cron-скрипт каждые 5 минут
const https = require('https');
async function checkHealth(url) {
return new Promise((resolve) => {
const req = https.get(url, (res) => {
resolve(res.statusCode === 200);
});
req.setTimeout(5000, () => { req.destroy(); resolve(false); });
req.on('error', () => resolve(false));
});
}
async function alertSlack(message) {
// POST к Slack Incoming Webhook
const body = JSON.stringify({ text: message });
// ... fetch к SLACK_WEBHOOK_URL
}
async function main() {
const healthy = await checkHealth('https://myapp.com/health');
if (!healthy) {
await alertSlack(':red_circle: myapp.com is DOWN!');
}
}
main;
Уровни алертов
| Уровень | Когда | Реакция |
|---|---|---|
| info | Информационные события | Slack-канал, никого не будит |
| warning | Деградация производительности | Slack, можно подождать |
| critical | Сервис упал, данные теряются | PagerDuty, звонок дежурному |
Частые ошибки
- Alert fatigue: слишком много ложных алертов — команда перестаёт на них реагировать
- Алертить на симптомы, а не на причины (лучше: error rate > 1%, а не CPU > 80%)
- Отсутствие
for:в Prometheus правилах — алерт срабатывает на кратковременные флуктуации - Нет on-call ротации — все алерты приходят одному человеку
Связанные темы
- _MOC DevOps
- Мониторинг -- Prometheus и Grafana
- Health Checks -- проверка состояния
- Логи -- просмотр и анализ