Сповіщення без продуманої методології перетворюються на шум: 200 повідомлень за ніч, половина з яких «resolved» через 2 хвилини. Команда перестає реагувати — і саме тоді приходить реальна проблема. На одному з проектів ми отримали 150 сповіщень за годину через невірно налаштований поріг CPU. Після впровадження методології burn rate їх стало 5. Мета налаштування — сповіщення лише на ситуації, що вимагають дій людини. Правильно налаштоване сповіщення — це не просто нотифікація, а система, яка дозволяє виявити проблеми до того, як вони вплинуть на користувачів. Ми займаємося цим завданням більше 5 років і налаштували моніторинг для 50+ веб-додатків — від стартапів до enterprise. Нижче — інженерний підхід без води.
Які метрики потрібно моніторити в першу чергу?
Починайте з чотирьох золотих сигналів, описаних у Site Reliability Engineering: latency, traffic, errors, saturation. Для веб-додатку достатньо latency (P95), errors (5xx), traffic (RPS) та saturation (CPU, пам'ять). Додатково — черга завдань, SSL-сертифікат, бізнес-метрики (конверсія, реєстрації). SLO (Service Level Objective) — цільовий рівень доступності, наприклад 99.9% часу. SLI (Service Level Indicator) — фактична метрика, яку ми вимірюємо. Сповіщення з burn rate дозволяють швидко реагувати, коли відхилення від SLO загрожує бюджету.
Принципи ефективного сповіщення
Alerting on symptoms, not causes. Сповіщення на «сайт недоступний для користувачів» важливіше, ніж «CPU > 80%». Високий CPU — причина, яка може і не впливати на користувачів. Цей принцип описаний у Google SRE Book.
Правило чотирьох золотих сигналів: latency, traffic, errors, saturation. Починайте з перших трьох. Burn rate замість порогів: «Error rate > 5% протягом 5 хвилин» краще, ніж «1 помилка за 1 хвилину». Burn rate показує, як швидко ви спалюєте SLO-бюджет помилок, і дозволяє виявити аномалії на ранній стадії.
Чому burn rate кращий за порогові значення?
Порогові сповіщення дають багато хибних спрацьовувань. Приклад: помилка на одному з сотні запитів — 1%, але якщо це триває годину, бюджет помилок (SLO 99.9%) закінчиться за 4 дні. Burn rate = 10. Сповіщення з таким значенням спрацює за 5 хвилин, а не через годину. Це знижує шум у 10 разів.
Як уникнути шумних сповіщень?
Використовуйте burn rate, групування та дедуплікацію в Alertmanager. Налаштуйте group_wait (30s), group_interval (5m), repeat_interval (4h). Сповіщення мають бути на симптоми, а не на причини. Якщо CPU > 80% не впливає на користувачів — це не сповіщення.
Налаштування стеку: Prometheus + Alertmanager + Grafana
Приклад docker-compose.yml
services:
prometheus:
image: prom/prometheus:v2.51.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./rules:/etc/prometheus/rules
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
ports:
- "9090:9090"
alertmanager:
image: prom/alertmanager:v0.27.0
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- "9093:9093"
grafana:
image: grafana/grafana:11.0.0
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
volumes:
prometheus_data:
grafana_data:
Метрики з додатку (Laravel) та конфігурація
Для Laravel встановлюємо пакет spatie/laravel-prometheus та реєструємо кастомні метрики:
// app/Providers/AppServiceProvider.php
use Prometheus\CollectorRegistry;
public function boot(): void
{
$registry = app(CollectorRegistry::class);
// Counter — кількість HTTP-запитів
$httpRequests = $registry->getOrRegisterCounter(
'app', 'http_requests_total', 'Total HTTP requests', ['method', 'route', 'status']
);
// Histogram — час відповіді
$httpDuration = $registry->getOrRegisterHistogram(
'app', 'http_request_duration_seconds', 'HTTP request duration', ['method', 'route'],
[0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
);
// Gauge — черга завдань
$queueSize = $registry->getOrRegisterGauge(
'app', 'queue_size', 'Current queue size', ['queue']
);
}
Конфігурація Prometheus:
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- 'rules/*.yml'
scrape_configs:
- job_name: 'web-app'
static_configs:
- targets: ['app:9000']
metrics_path: /metrics
Приклад правил сповіщення
# rules/web-app.yml
groups:
- name: web-app
rules:
# Високий відсоток помилок (5xx)
- alert: HighErrorRate
expr: |
sum(rate(app_http_requests_total{status=~"5.."}[5m]))
/
sum(rate(app_http_requests_total[5m])) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Error rate {{ $value | humanizePercentage }}"
description: "5xx rate exceeded 5% for 2 minutes"
# Повільні відповіді (P95 > 2 секунди)
- alert: HighLatencyP95
expr: |
histogram_quantile(0.95,
sum by (le) (rate(app_http_request_duration_seconds_bucket[5m]))
) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "P95 latency {{ $value | humanizeDuration }}"
# Відсутність трафіку (аномальне падіння)
- alert: TrafficDrop
expr: |
sum(rate(app_http_requests_total[5m])) < 0.1
and sum(rate(app_http_requests_total[1h] offset 1h)) > 1
for: 5m
labels:
severity: critical
annotations:
summary: "Traffic almost zero — possible outage"
# Велика черга завдань
- alert: QueueBacklog
expr: app_queue_size{queue="default"} > 1000
for: 10m
labels:
severity: warning
annotations:
summary: "Queue backlog: {{ $value }} jobs"
# SSL сертифікат закінчується
- alert: SSLCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 14 * 24 * 3600
for: 1h
labels:
severity: warning
annotations:
summary: "SSL cert expires in {{ $value | humanizeDuration }}"
Маршрутизація та дедуплікація в Alertmanager
# alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram-critical'
routes:
- match:
severity: critical
receiver: 'telegram-critical'
continue: false
- match:
severity: warning
receiver: 'telegram-warning'
group_interval: 15m
repeat_interval: 12h
receivers:
- name: 'telegram-critical'
telegram_configs:
- bot_token: 'your_bot_token'
chat_id: -1001234567890
message: |
🔴 *{{ .CommonLabels.alertname }}*
{{ range .Alerts }}
{{ .Annotations.summary }}
{{ if .Annotations.description }}{{ .Annotations.description }}{{ end }}
{{ end }}
- name: 'telegram-warning'
telegram_configs:
- bot_token: 'your_bot_token'
chat_id: -1001234567890
message: |
⚠️ *{{ .CommonLabels.alertname }}*
{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname']
Порівняння Prometheus та хмарних сервісів
| Критерій | Prometheus + Alertmanager | Хмарні сервіси (CloudWatch, Stackdriver) |
|---|---|---|
| Гнучкість | Повний контроль, будь-які метрики | Обмежені можливості |
| Вартість | Безкоштовно, тільки залізо | Оплата за кожну метрику |
| Прив'язка до вендора | Ні | Повна |
Prometheus + Alertmanager дає гнучкість та контроль. На відміну від CloudWatch чи Stackdriver, ви не прив'язані до вендора, і при масштабуванні вартість значно нижча. На одному з проектів ми знизили витрати на моніторинг в 3 рази, перейшовши з Datadog на самописний стек. Така конфігурація окупається за кілька місяців за рахунок зниження витрат на інфраструктуру.
Процес роботи та орієнтовні терміни
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика | 0.5–1 день | Список золотих сигналів, SLO/SLI |
| Проектування | 0.5 день | Схема сповіщень, burn rate, маршрути |
| Реалізація | 1–2 дні | Prometheus, Alertmanager, Grafana |
| Тестування | 0.5–1 день | Симуляція, хаос-тести |
| Деплой | 0.5 день | Продакшен, навчання команди |
Базове налаштування (8–12 правил) займає 1–2 робочих дні. Якщо потрібні кастомні метрики та складна маршрутизація — до 4 днів.
Що входить в роботу
- Аудит поточних метрик додатку (APM, логи, інфраструктура)
- Розгортання Prometheus + Alertmanager + Grafana
- Написання 8–12 alert rules з burn rate
- Інтеграція з Telegram, Slack або email
- Базові дашборди Grafana (error rate, latency, RPS, queue)
- Документація та навчання команди
- Гарантія на результат та підтримка 1 місяць
Якщо у вас схожа задача — зв'яжіться з нами для консультації. Оцінимо обсяг робіт за 1 день. Замовте налаштування моніторингу, щоб позбутися шуму та спати спокійно. Отримайте консультацію з налаштування сповіщень — це безкоштовно.







