Prometheus: OpsGenie и Alertmanager – уведомления в почту/SMS/телефон

By | 08/09/2018
 

OpsGenie – сервис, позволяющий настроить отправку уведомлений на почту, в Slack, SMS и умеющий выполнять звонки при возникновении алерта.

Кроме того – у него есть мобильные приложения для Android и iOS.

Сейчас у нас нотификации отправляются только в Slack, через slack_configs Alertmanager-а, но этого явно мало, особенно если ночью упадёт какой-то критичный сервис.

Собственно, задачей будет настроить отправку из Alertmanager нотификаций по различным уровням важности:

  • только в Slack при уровне info
  • в Slack, на почту и в приложение на телефоне – при уровне warning
  • и везде, плюс звонок на мобильный – при уровне critical

У OpsGenie, как по мне, немного запутанный интерфейс, но если с ним разобраться – то его возможности приятно радуют.

Кроме того – много ограничений связано с планом подписки. Самый дешёвый ариант стоит 19 уе/мес за 1 пользователя, более адекватный – 29 уе/мес за 1 пользователя. Цены и описание пакетов есть тут>>>.

Примеры ниже созданы в пакете Standard.

Документация>>>

OpsGenie

Notifications

Регистрируемся в системе, и настраиваем профиль.

После первоначальной настройки – переходим в Notifications, и задаём номер мобильного для SMS и звонков:

Там же есть ссылка на мобильное приложение – устанавливаем его, логинимся, используя почту и свой пароль, и устройство появится в Mobile App.

На телефоне оно выглядит так:

При установке приложения – оно запросит разрешение на нотификации в беззвучном режиме телефона, что категорически рекомендуется, дабы не проспать алерты.

Notification Rules

Далее прокручиваем ниже, и в Notification Rules задаём правила уведомлений.

Alertmanager будет слать все уведомления в Slack + OpsGenie.

В OpsGenie опять сталкиваемся с ограничениями пакетов – что бы иметь возможность создавать несколько правил – требуется план минимум Standart, в Essentials вы ограничены одним правилом.

У меня будет два правила – одно при уровне алерта warning (P3) будет слать уведомление в приложение на телефон + почта:

И второе правило – при уровне critical (P1) – будет дополнительно выполнять звонок на мобильный, если в течении 10 минут алерт не был закрыт:

Всё вместе:

Team

Далее – создаём Team:

Во вкладке Members добавляем обоих пользователей:

Prometheus integration

Переходим в Intergrations, находим Prometheus:

Получаем API ключ:

Escalation

После создания Team OpsGenie создаёт правила по умолчанию. Редактируем их под свои нужды.

Эскалация описывает правила по отправке уведомлений:

Тут сначала уведомления об алертах отправляются мне (юзер Mobile), если в течении 15 минут я не среагировал (проспал, например) – то будет отправлено уведомление нашему бекенд-девелоперу.

Далее в On-Call Schedules задаём Rotations – кто будет ответственным за алерты.

В данном случае – большой группы саппорта у нас нет, поэтому добавляем обоих пользователей “навечно”.

Жмём Add rotation, добавляем первого пользователя:

И второго пользователя во втором правиле:

Вместе все правила команды выглядят сейчас так:

Alertmanager и роуты

alert.rules

Используем тестовые правила:

- alert: NodeLowRootDiskInfoTest
  expr: ((node_filesystem_size_bytes{mountpoint="/rootfs"} - node_filesystem_free_bytes{mountpoint="/rootfs"} ) / node_filesystem_size_bytes{mountpoint="/rootfs"} * 100) < 50
  for: 1s
  labels:
    severity: info
  annotations:
    summary: 'Low root disk space'
    description: '{{$labels.env}}: Data disk usage is above 50%. Current value is {{ $value | humanize }}%.'

- alert: NodeLowRootDiskWarningTest
  expr: ((node_filesystem_size_bytes{mountpoint="/rootfs"} - node_filesystem_free_bytes{mountpoint="/rootfs"} ) / node_filesystem_size_bytes{mountpoint="/rootfs"} * 100) < 75
  for: 1s
  labels:
    severity: warning
  annotations:
    summary: 'Low root disk space'
    description: '{{$labels.env}}: Data disk usage is above 75%. Current value is {{ $value | humanize }}%.'

- alert: NodeLowRootDiskCriticalTest
  expr: ((node_filesystem_size_bytes{mountpoint="/rootfs"} - node_filesystem_free_bytes{mountpoint="/rootfs"} ) / node_filesystem_size_bytes{mountpoint="/rootfs"} * 100) < 95
  for: 1s
  labels:
    severity: critical
  annotations:
    summary: 'Low root disk space'
    description: '{{$labels.env}}: Data disk usage is above 95%. Current value is {{ $value | humanize }}%.'

От реальных правил их отличает проверка условия – “<” вместо “>“.

В самом условии ((node_filesystem_size_bytes{mountpoint="/rootfs"} - node_filesystem_free_bytes{mountpoint="/rootfs"} ) / node_filesystem_size_bytes{mountpoint="/rootfs"} * 100) вычисляется % занятого места на корневом диске, и если это значение меньше 50, 75 и 95 (для теста, в нормальных тестах наоборот – если % занятого больше порога) – то в Prometheus будет срабатывать alert, который будет отправляться в Slack и OpsGenie.

Routes и receivers

Далее настраиваем alertmanager_config.yml:

global:
  slack_api_url: https://hooks.slack.com/services/T08***vMb
  opsgenie_api_key: e50***106

route:

  group_by: ['alertname', 'cluster', 'job', 'env']
  repeat_interval: 1h
  group_interval: 5m

  # default - send 'info' to Slack only
  receiver: 'default'

  routes:

    # all 'warning' to the 'warning' receiver with P3
    - match:
        severity: warning
      receiver: warning

    # all 'critical' to the 'critical' receiver with P1
    - match:
        severity: critical
      receiver: critical

receivers:

  - name: 'default'
    slack_configs:
      - send_resolved: true
        title: ":scream: {{ .CommonAnnotations.summary }}"
        text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

  - name: 'warning'
    slack_configs:
      - send_resolved: true
        title: ":scream: {{ .CommonAnnotations.summary }}"
        text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
    opsgenie_configs:
      - priority: P3

  - name: 'critical'
    slack_configs:
      - send_resolved: true
        title: ":scream: {{ .CommonAnnotations.summary }}"
        text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
    opsgenie_configs:
      - priority: P1

Документация по Alertmanager – тут>>>, пример конфига – тут>>>.

Тут:

  • info: шлём только в Slack
  • warning: Slack + OpsGenie с уровнем P3
  • critical: Slack + OpsGenie с уровнем P1

Комментируем алерт рулы warning и critical, проверям info.

Алерт в Alertmanager:

Уведомление в Slack:

В OpsGenie ничего не пришло.

ОК, комментируем alert NodeLowRootDiskInfoTest, активируем NodeLowRootDiskWarningTest – теперь уведомление должно придти в Slack и OpsGenie с уровнем P3.

Сам алерт:

Slack:

OpsGenie:

Приложение на телефоне:

Почта:

И повторяем проверку, но теперь включаем алерт NodeLowRootDiskCriticalTest – что бы пришёл звонок:

OpsGenie:

Звонок идёт в Viber 🙂

Если звонок сбросить – то третий-четвёртый уже пойдут на обычный телефон.

Собственно, на этом и всё.

В целом OpsGenie крайне интересный и полезный сервис, но стоимость и немного запутанный инфтерфейс – его минусы.