Алертинг метрик Pilot в Prometheus

от автора

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

Для своевременного оповещения о возможных проблемах с системой 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *