← Все руководства
Prometheus: правила алертов
Алерты — критическая часть мониторинга. Prometheus умеет оценивать PromQL-выражения и отправлять уведомления через Alertmanager. В этом руководстве настроим алерты, Alertmanager и Telegram-уведомления.
Шаг 1: PromQL основы для алертов
Перед написанием правил необходимо понять базовые PromQL-выражения:
# CPU загрузка (процент за 5 минут)
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Использование памяти (процент)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Дисковое пространство (процент использования)
(1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
# Количество запущенных процессов
count by(instance) (process_running)
# HTTP коды 5xx (rate за 5 минут)
rate(http_requests_total{code=~"5.."}[5m])
Шаг 2: Alerting rules
Создайте файл alerts.yml:
# alerts.yml
groups:
- name: host
rules:
- alert: HighCPU
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU on {{ $labels.instance }}"
description: "CPU usage is {{ $value | printf \"%.1f\" }}% for more than 5 minutes."
- alert: HighMemory
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory on {{ $labels.instance }}"
description: "Memory usage is {{ $value | printf \"%.1f\" }}%."
- alert: DiskSpaceLow
expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
for: 10m
labels:
severity: critical
annotations:
summary: "Disk space low on {{ $labels.instance }}"
description: "Root filesystem usage is {{ $value | printf \"%.1f\" }}%."
- alert: InstanceDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} is down"
description: "{{ $labels.instance }} has been unreachable for more than 2 minutes."
- name: application
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{code=~"5.."}[5m]) > 0.05
for: 5m
labels:
severity: warning
annotations:
summary: "High 5xx error rate on {{ $labels.instance }}"
description: "Error rate is {{ $value | printf \"%.2f\" }} req/s."
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "High latency on {{ $labels.instance }}"
description: "95th percentile latency is {{ $value | printf \"%.2f\" }}s."
Подключите файл в prometheus.yml:
# prometheus.yml
rule_files:
- "alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
Шаг 3: Конфигурация Alertmanager
# alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram'
routes:
- match:
severity: critical
receiver: 'telegram-critical'
repeat_interval: 1h
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: "YOUR_BOT_TOKEN"
chat_id: YOUR_CHAT_ID
parse_mode: "HTML"
message: |
{{ range .Alerts }}
{{ .Annotations.summary }}
{{ .Annotations.description }}
Status: {{ .Status }}
{{ end }}
- name: 'telegram-critical'
telegram_configs:
- bot_token: "YOUR_BOT_TOKEN"
chat_id: YOUR_CHAT_ID
parse_mode: "HTML"
message: |
🔴 CRITICAL ALERT
{{ range .Alerts }}
{{ .Annotations.summary }}
{{ .Annotations.description }}
{{ end }}
Загрузите конфигурацию:
amtool check-config alertmanager.yml
Шаг 4: Настройка Telegram-бота
- Напишите
@BotFatherв Telegram и создайте нового бота через/newbot. - Скопируйте токен бота.
- Добавьте бота в группу или напишите ему личное сообщение.
- Получите chat_id через API:
https://api.telegram.org/botYOUR_TOKEN/getUpdates.
Шаг 5: Тестирование правил
Проверьте, что правила корректно загружаются:
# Проверка PromQL выражений
curl -s 'http://localhost:9090/api/v1/query?query=up' | jq .
# Просмотр активных алертов
curl -s 'http://localhost:9090/api/v1/alerts' | jq .
# Просмотр правил через веб-интерфейс
# http://localhost:9090/rules
Шаг 6: Тестирование доставки уведомлений
Отправьте тестовый алерт через amtool:
# Отправка тестового алерта
amtool alert add \
--alertmanager.url=http://localhost:9093 \
TestAlert \
alertname=TestAlert \
severity=warning \
summary="Test alert" \
description="This is a test alert from amtool"
Убедитесь, что сообщение пришло в Telegram. Затем подтвердите алерт:
# Просмотр активных алертов
amtool alert --alertmanager.url=http://localhost:9093
# Подтверждение алерта
amtool alert acknowledge alertname=TestAlert
Используйте for: 5m в правилах, чтобы избежать ложных срабатываний при кратковременных всплесках нагрузки.
Шаг 7: Шаблон сообщений
Для более информативных уведомлений создайте шаблон:
# alertmanager.tmpl
{{ define "telegram.custom" }}
{{ range .Alerts }}
*{{ .Annotations.summary }}*
{{ .Annotations.description }}
Labels: {{ range .Labels.SortedPairs }}{{ .Name }}={{ .Value }} {{ end }}
{{ end }}
{{ end }}
# В alertmanager.yml
templates:
- '/etc/alertmanager/templates/*.tmpl'
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: "YOUR_BOT_TOKEN"
chat_id: YOUR_CHAT_ID
parse_mode: "HTML"
message: '{{ template "telegram.custom" . }}'