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 ротации — все алерты приходят одному человеку

Связанные темы

Ресурсы