NPV-AM

← Все руководства

Prometheus: правила алертов

14 июля 2026 · 11 мин чтения · Средний

Алерты — критическая часть мониторинга. 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-бота

  1. Напишите @BotFather в Telegram и создайте нового бота через /newbot.
  2. Скопируйте токен бота.
  3. Добавьте бота в группу или напишите ему личное сообщение.
  4. Получите 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" . }}'