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

    @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 }}
    Ответ написан
    5 комментариев