Alerting (Алертинг)
Алертинг — это система автоматических оповещений, которая срабатывает при критических событиях или отклонениях показателей от нормальных значений. Алертинг позволяет командам быстро реагировать на проблемы и минимизировать время простоя сервисов.
Типы алертов
- Симптомные алерты — основаны на пользовательском опыте
- Причинные алерты — показывают конкретные проблемы инфраструктуры
- Пороговые алерты — срабатывают при превышении лимитов
- Аномальные алерты — обнаруживают отклонения от нормы
Уровни критичности
- P0/Critical — полная недоступность сервиса
- P1/High — серьезное влияние на пользователей
- P2/Medium — частичное влияние на функциональность
- P3/Low — предупреждения и информационные алерты
Настройка алертинга
1# Пример конфигурации алертов в Prometheus
2groups:
3 - name: web-service-alerts
4 rules:
5 - alert: HighErrorRate
6 expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
7 for: 5m
8 labels:
9 severity: critical
10 annotations:
11 summary: "High error rate detected"
12 description: "Error rate is {{ $value }} errors per second"
13
14 - alert: HighLatency
15 expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
16 for: 2m
17 labels:
18 severity: warning
19 annotations:
20 summary: "High latency detected"
21 description: "95th percentile latency is {{ $value }}s"
22
23 - alert: ServiceDown
24 expr: up{job="web-service"} == 0
25 for: 1m
26 labels:
27 severity: critical
28 annotations:
29 summary: "Service is down"
30 description: "{{ $labels.instance }} is not responding"
Каналы уведомлений
- Email — для некритичных уведомлений
- SMS — для критичных алертов
- Slack/Teams — для командной коммуникации
- PagerDuty — для эскалации и дежурств
- Webhooks — для интеграции с другими системами
Best practices алертинга
- Алертить на симптомы — не на причины
- Минимизировать false positives — избегать ложных тревог
- Группировка алертов — объединять связанные проблемы
- Эскалация — автоматическая передача выше при неотвечении
- Документирование — runbook для каждого алерта
Пример Python-интеграции
1# Интеграция с системой алертинга
2import requests
3import json
4from datetime import datetime
5
6class AlertManager:
7 def __init__(self, webhook_url):
8 self.webhook_url = webhook_url
9
10 def send_alert(self, severity, title, message, tags=None):
11 """Отправка алерта через webhook"""
12 payload = {
13 "timestamp": datetime.utcnow().isoformat(),
14 "severity": severity,
15 "title": title,
16 "message": message,
17 "tags": tags or []
18 }
19
20 try:
21 response = requests.post(
22 self.webhook_url,
23 data=json.dumps(payload),
24 headers={'Content-Type': 'application/json'},
25 timeout=10
26 )
27 response.raise_for_status()
28 return True
29 except requests.RequestException as e:
30 print(f"Failed to send alert: {e}")
31 return False
32
33 def check_service_health(self, service_url):
34 """Проверка здоровья сервиса и отправка алерта при проблемах"""
35 try:
36 response = requests.get(service_url, timeout=5)
37 if response.status_code != 200:
38 self.send_alert(
39 severity="high",
40 title="Service Health Check Failed",
41 message=f"Service returned status {response.status_code}",
42 tags=["health-check", "service-down"]
43 )
44 except requests.RequestException:
45 self.send_alert(
46 severity="critical",
47 title="Service Unreachable",
48 message=f"Cannot connect to {service_url}",
49 tags=["health-check", "service-unreachable"]
50 )
51
52# Установка через pip
53pip install requests alertmanager-api
54
55# Установка через poetry
56poetry add requests alertmanager-api
FAQ
Какие бывают алерты?
Основные типы: симптомные (на основе пользовательского опыта), причинные (конкретные проблемы), пороговые (превышение лимитов) и аномальные (отклонения от нормы).
Как избежать alert fatigue?
Настраивай алерты только на действительно важные события, группируй связанные алерты, используй правильные пороги и регулярно пересматривай настройки.