Долгое общение с коллегами по работе и вопросы в гелегоканале девопсов помогли разрулить вопрос.
Самое смешное, что практически у всех вебхуком оправляется в программу-посредник-телеграмобот, который уже ТАКИМ ЖЕ вебхуком отправляет в API телеграма. На вопрос, а почему сразу напрямую не слать в телеграм? Отвечают одно - не получилось изначально победить, решили накостылить. Лишний трафик, лишняя точка отказа, лишний риск где то по дороге что то потерять. Не наш путь. Показываю, как делать это правильно.
1. Создаем правило в прометее. Правило простейшее, просто для примера
# cat /etc/prometheus/rules/alert.rules.yml
groups:
- name: alert.rules
rules:
- alert: InstanceDown
expr: up == 0
for: 0m
labels:
severity: critical
annotations:
description: "Server down {{ $labels.instance }} or service {{ $labels.job }}"
instancename: "{{ $labels.instance }}"
summary: "Instance down"
В labels можем напихать любых тегов, которые потом доступны в алертах alertmanager-а. Но только статика. Засунуть переменную типа
instancename: {{ $labels.instance }}
У меня не получилось, прометей все время валится и не стартует.
2. Потом в alertmanager-е настраиваем нативный метод отправки. Можно и через веб-хук с GET-запросом, но там ограничение на длину строки. Придется быть очень лаконичным. Вот простейший проверенный конфиг:
# cat /etc/alertmanager/alertmanager.yml
global:
# Отсюда читаем все шаблоны:
- '/etc/alertmanager/templates/*.tmpl'
route:
# Группировка алертов
group_by: ['alertname', 'cluster', 'service']
# время ожидания перед отправкой уведомления для группы
group_wait: 10s
# время отправки повторного сообщения для группы
group_interval: 10s
# время до отправки повторного сообщения
repeat_interval: 10s
receiver: 'telega'
receivers:
- name: 'telega'
telegram_configs:
- bot_token: '<Здесь указываем ваш bot_token>'
api_url: 'https://api.telegram.org'
chat_id: <Здесь указываем ваш chat_id <b>БЕЗ КАВЫЧЕК!!!</b>>
message: "Alertname: {{ .GroupLabels.alertname }}\n Severity: {{ .CommonLabels.severity }}\n {{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"
<b> parse_mode: ''</b>
Код присылает уведомления такого вида:
monitoring_bot, [02.04.2022 14:38]
Alertname: InstanceDown
Severity: critical
Server down 192.168.0.210:8300 or service Consul SD 192.168.0.211
Важно!!!
1. chat_id указываем без кавычек
2. Мои параметры отправки - тестовые, для ускорения дебага. Такие параметры увидеть в реальном мониторинге вы точно не захотите, меняйте сразу.
3. По умолчанию метод telegram_configs: парсит параметры из прометея и отсылает сообщения только если там был голый текст. Как только попадаются переменные - сообщений не будет. Поэтому парсинг указываем обязательно. Если метод парсинга указан пустой, то передаваемые данные не парсятся и все отправляется.
4. В прометее, в разделе аннотации, вы можете наплодить любые свои метки типа таких:
annotations:
description: "Server down {{ $labels.instance }} or service {{ $labels.job }}"
instancename: "{{ $labels.instance }}"
summary: "Instance down"
aaaaaaaaa: 'XXXXXXXX'
bbbbbbbb: 'XXXXXXXX'
cccccccccc: 'XXXXXXXX'
А в alertmanager-е обращаться к ним вот так:
{{ range .Alerts }}{{ .Annotations.aaaaaaaaa }}