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