@sergey_privacy
Админ со стажем, начинающий DevOps

Как из alertmanager передать текст с переменными по web-hook?

Из Prometheus улетает алерт вида:
- name: alert.rules
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      description: 'Недоступен сервер {{ $labels.instance }} или сервис {{ $labels.job }} более чем 1 минуту'
      summary: Instance {{ $labels.instance }} down

Сделал тестовый вебхук в Alertmanager типа такого:
receivers:
- name: 'webhook'
  webhook_configs:
    - url: 'https://api.telegram.org/bot[ТОКЕН_БОТА]/sendMessage?chat_id=@[USERNAME_КАНАЛА]&text=тест'

Сделал канал в Telegram. Текст в него через API отсылается.

Все ОК, правило отрабатывает, тестовое сообщение отправляется. Теперь сам вопрос:
А не заморачиваясь с темплейтами отсылаемых сообщений, просто в самом файле конфига Alertmanager я могу как-то указать переменные, полученные из Prometheus? Вместо "тест" я бы хотел подставить
- url: 'https://api.telegram.org/bot[ТОКЕН_БОТА]/sendMessage?chat_id=@[USERNAME_КАНАЛА]&text=Упал сервер {{ $labels.instance }}'


Кто подскажет, как засунуть переменные в отдаваемую строку?
  • Вопрос задан
  • 6918 просмотров
Решения вопроса 1
@sergey_privacy Автор вопроса
Админ со стажем, начинающий DevOps
Долгое общение с коллегами по работе и вопросы в гелегоканале девопсов помогли разрулить вопрос.

Самое смешное, что практически у всех вебхуком оправляется в программу-посредник-телеграмобот, который уже ТАКИМ ЖЕ вебхуком отправляет в 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 }}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
karabanov
@karabanov
Системный администратор
Можешь воспользоваться prometheus_bot там есть шаблоны.
Ответ написан
@Zenin-Dmitry
Возможно кому то пригодится :
message: |
  {{ range .Alerts }}
  <b>alertname</b> {{ .Labels.alertname }}
  <b>instance</b> {{ .Labels.instance }}
  <b>job</b> {{ .Labels.job }}
  <b>severity</b> {{ .Labels.severity }}
  <b>description</b> {{ .Annotations.description }}
  <b>summary</b> {{ .Annotations.summary }}
  <b>status</b> {{ .Status }}
  <b>StartsAt</b> {{ .StartsAt }}
  <b>EndsAt</b> {{ .EndsAt }}
  {{ end }}
parse_mode: 'HTML'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы