Привет, друзья!

Для своевременного оповещения о возможных проблемах с системой Pilot мы будем использовать инструмент AlertManager, который будет отправлять нам алерты на основе метрик с Pilot-Server из Prometheus.

Из официальной документации к системе Pilot мы знаем, что есть серверное расширение, позволяющее использовать Prometheus в качестве базы данных для метрик Pilot-Server. Используя это расширение, Prometheus и AlertManager мы настроим отправку алертов в телеграм канал.

Теперь обо всём по порядку. Задача - отправить оповещение (алерт) при отключении компонента Pilot-BIM-Server в телеграм канал.

1. Для отслеживания отключения Pilot-BIM-Server будем мониторить взятую лицензию этого компонента. Чуть откорректируем исходный код модуля для сбора метрик (PilotServer.PrometheusMetrics). В MetricsApi.cs в словарь ProductLabels добавим код лицензии и имя компонента: {91, "pilot-bim-server" } и собираем решение;

2. Переходим к собранному решению и пакуем всё в zip архив. Далее подключаем модуль как указано в справке к Pilot;
3. Теперь давайте зарегистрируем телеграм бота. Ищем в телеграме бота @BotFather, запускаем его и создаем токен (/start -> /newbot -> "name_bot"). Получем токен вида 73829261811:AJu4kdK2321_EKrbqS. Далее создаем группу в телеграме, добавляем туда нашего бота как админа. Пишем любое сообщение от себя в группе и делаем запрос (можно в браузере) по адресу https://api.telegram.org/bot73829261811:AJu4kdK2321_EKrbqS/getUpdates. Только обязательно после "bot" указываем свой токен, который получили. У нас отобразится json ответ, в нём мы ищем id чата, это как раз и есть id нашей группы, в которую будут приходить алерты;

4. Ставим AlertManager, он будет оповещать нас об отключении Pilot-BIM-Server. Можем через команду docker, либо через docker-compose. Я сделаю это через docker-compose. Переходим в удобную директорию, у меня это /opt/docker/monitoring/alertmanager и кладем туда docker-compose. Для удобства лучше использовать одну общую сеть docker у alertmanager и prometheus, в данном композе у меня alertmanager поднимается в уже имеющейся сети monitoring, в этой же сети развернут и prometheus.

 version: '3.7'

services:
  alertmanager:
    image: bitnami/alertmanager
    container_name: alertmanager
    hostname: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml  #путь к конфигурации
      - alertmanager_data:/data 
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/data'
      - '--web.route-prefix=/'
    ports:
      - 9093:9093
    networks:
      - monitoring

volumes:
  alertmanager_data:

networks:
  monitoring:
    external: true

5. Рядом размещаем файл конфигурации alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  repeat_interval: 30m
  group_interval: 1m
  receiver: 'telegram'

receivers:
- name: telegram
  telegram_configs:
  - api_url: 'https://api.telegram.org'
    bot_token: '73829261811:AJu4kdK2321_EKrbqS'
    chat_id: -4785827869
    message: "{{ .Status | toUpper }}\nWarning: {{ .GroupLabels.alertname }}\n{{range .Alerts}}{{ .Annotations.summary }}\n{{ .Annotations.description}}{{ end }}"
    parse_mode: 'HTML'
    send_resolved: True

resolve_timeout - время, в течение которого Alertmanager ожидает подтверждения, что alert был решён;
route - маршрут отправления оповещений;
group_by отвечает за группировку оповещений перед их отправкой. Мы указываем alertname - группировка по имени алертов из rule_files конфигурации Prometheus (дальше станет более понятно);
group_interval - этот параметр определяет как часто будут отправляться уведомления для одной и той же группы алертов.
Например: У нас есть два Pilot-BIM-Server и один из них отключается, то alertmanager ждет указанное время (1m) и, если в течение этого времени отключится второй Pilot-BIM-Server, то эти два события сгруппируются в один алерт и мы получим одно общее оповещение об отключении эти двух компонентов.
repeat_interval - как часто будут повторно приходить оповещения об активных событиях (опциональный параметр);
receiver - куда будут приходить оповещения, в соответствии с блоком receivers;
recivers - имя и конфигурация способа отправки. В bot_token и chat_id указываем наш токен и айди чата (шаг 3);
message - текст оповещения, включает в себя обычный текст и переменные, связанные с алертами;
send_resolved - отправляет уведомление при разрешении алерта (true).
6. Переходим к интеграции alertmanager с prometheus, для этого слегка откорректируем конфиг prometheus.yml

global:
  scrape_interval: 15s

rule_files:
  - "/etc/prometheus/alerts/*"

scrape_configs:
  - job_name: 'Pilot-Server'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.10.167:1234']

alerting:
  alert_relabel_configs: []
  alertmanagers:
    - static_configs:
      - targets: ["192.168.10.168:9093"]

Добавляем секцию rule_files и блок alerting. В rule_files указываем путь до всех алертов, которые будут формироваться из метрик prometheus. Этот путь указывается внутри docker-контейнера, отсюда следует, что при запуске контейнера с prometheus не забудьте смонтировать нужный volume. В моем случае это /opt/docker/monitoring/prometheus/alerts:/etc/prometheus/alerts.
В alerting указываем targets - адрес нашего alertmanager. В примере я указал ip-адрес, но корректнее указывать адрес из docker-сети (alertmanager:9093).
7. Создаем алерт pilot-server.yml в папке /opt/docker/monitoring/prometheus/alerts со следующим содержимым:

groups:
- name: pilot-server
  rules:
  - alert: Status_Pilot-BIM-Server
    expr: pilot_server_consumed_licenses {licenseType="pilot-bim-server"} < 1
    for: 1m
    labels:
      severity: critical
    annotations:
       summary: "pilot-bim-server disconnect"
       description: 'Pilot-Bim-Server disconnected from {{ $labels.job }}'
       instance_ip: '{{ $labels.instance }}'

В условие expr прописываем условие, при котором срабатывает алерт. Это условие как раз и есть запрос в prometheus.


В блоке annotations мы указали атрибуты, которые можем использовать в конфиге alertmanager.yml в секции message (шаг 5).
8. Перезапускаем prometheus с обновленным конфигом и новым volume, запускаем alertmanager. На prometheus в разделе Alerts, появится наш алерт.


9. Для тестирования намеренно выключаем Pilot-BIM-Server и видим, что у алерта поменялся статус на PENDING.


Ждем еще и теперь статус FIRING.


После этого в нашу группу telegram придет оповещение со статусом FIRING.


При включении Pilot-BIM-Server получаем уже RESOLVED.

Заключение

Мы рассмотрели пример настройки алерта, событие для которого взяли из prometheus и отправили в telegram. Алертинг может быть настроен с другими событиями и для других мессенджеров, всё зависит от возможностей и задач, которые вы для себя решаете.

Комментарии (0)