На главную

DevOps и серверы

Правила оповещений Prometheus

Правила оповещений Prometheus: сервер не отвечает, кончается диск и память, ошибки 5xx, медленные ответы, истекающий сертификат, упавший юнит, давно не было бэкапа — с порогами, задержкой и понятным текстом. И конфиг Alertmanager к ним.

Какие правила нужны

К ней добавится имя правила

alerts.yml

groups:
  - name: infra
    rules:
      - alert: InstanceDown
        expr: 'up == 0'
        for: 5m
        labels:
          severity: critical
          team: ops
        annotations:
          summary: 'Цель {{ $labels.instance }} не отвечает'
          description: 'Prometheus не может снять метрики с {{ $labels.job }} на {{ $labels.instance }} уже {{ $value }}.'

      - alert: Memory
        expr: 'node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10'
        for: 10m
        labels:
          severity: warning
          team: ops
        annotations:
          summary: 'Память на {{ $labels.instance }} на исходе'
          description: 'Доступно {{ $value | printf "%.1f" }} % памяти.'

      - alert: Disk
        expr: 'node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} * 100 < 10'
        for: 10m
        labels:
          severity: critical
          team: ops
        annotations:
          summary: 'Диск {{ $labels.mountpoint }} на {{ $labels.instance }} заканчивается'
          description: 'Свободно {{ $value | printf "%.1f" }} %.'

      - alert: CertExpiry
        expr: 'probe_ssl_earliest_cert_expiry - time() < 14 * 24 * 3600'
        for: 1h
        labels:
          severity: warning
          team: ops
        annotations:
          summary: 'Сертификат {{ $labels.instance }} скоро истечёт'
          description: 'Осталось {{ $value | humanizeDuration }}.'

      - alert: SystemdUnit
        expr: 'node_systemd_unit_state{state="failed"} == 1'
        for: 5m
        labels:
          severity: critical
          team: ops
        annotations:
          summary: 'Юнит {{ $labels.name }} на {{ $labels.instance }} в состоянии failed'
          description: 'Посмотрите journalctl -u {{ $labels.name }}.'

Alertmanager

Например адрес топика ntfy

alertmanager.yml

route:
  receiver: default
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  routes:
    - matchers: [severity="critical"]
      receiver: urgent
      repeat_interval: 1h

receivers:
  - name: default
    # добавьте получателя
  - name: urgent
    # добавьте получателя

inhibit_rules:
  - source_matchers: [severity="critical"]
    target_matchers: [severity="warning"]
    equal: ['instance']

Правило без задержки (for) срабатывает от одного случайного замера. Правило без инструкции будят человека, который не знает, что делать, — поэтому у каждого есть текст и ссылка.