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?

Настраивай алерты только на действительно важные события, группируй связанные алерты, используй правильные пороги и регулярно пересматривай настройки.