Привет, друзья!
Для своевременного оповещения о возможных проблемах с системой 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. Алертинг может быть настроен с другими событиями и для других мессенджеров, всё зависит от возможностей и задач, которые вы для себя решаете.