Grafana - Telagram Alert Template

Источники

Установка Grafana описана в данной статье.

Настройка связи с Telegram

К этому моменту предполагается, что вы уже создали бота через @BotFather

Переходим в AlertingContact points (http://**grafana_host**/alerting/notifications)

Создаем новый поинт:

Разворачиваем вкладку Optional Telegram settings

  • Message – {{ template "alert_list" . }}
  • Parse Mode – HTML

Настройка шаблона

Переходим в AlertingContact pointsNotification Templates+ Add notification template

Далее нужно создать шаблон состоящий из 2 частей. alert_list, на который сослались в настройках Contact points. Эта часть будет описывать список (группу) алертов. И alert_template, отвечающая за внешний вид самого алерта. Я приведу несколько вариантов шаблонов, и покажу какой результат вы получите.

Группировка алертов в списки настраивается в Notification policies. Там же можно найти настройки периодичности сообщений. Разные группы будут отправляться отдельными сообщениями.

Вариант 1

Начнем с очень распространенного шаблона, который можно встретить в интернете:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{{ define "alert_list" }}
  {{ if gt (len .Alerts.Firing) 0 }}
    {{ len .Alerts.Firing }} firing:
    {{ range .Alerts.Firing }} {{ template "alert_template" .}} {{ end }}
  {{ end }}
  {{ if gt (len .Alerts.Resolved) 0 }}
    {{ len .Alerts.Resolved }} resolved:
    {{ range .Alerts.Resolved }} {{ template "alert_template" .}} {{ end }}
  {{ end }}
{{ end }}


{{ define "alert_template" }}
  [{{.Status}}] {{ .Labels.alertname }}

  Labels:
  {{ range .Labels.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}

  {{ if gt (len .Annotations) 0 }}
  Annotations:
  {{ range .Annotations.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{ end }}
  {{ end }}

  {{ if gt (len .SilenceURL ) 0 }}
    Silence alert: {{ .SilenceURL }}
  {{ end }}
  {{ if gt (len .DashboardURL ) 0 }}
    Go to dashboard: {{ .DashboardURL }}
  {{ end }}
{{ end }}

В некоторых статьях я видел советы разделять данный код на 2 шаблона. Это будет работать, однако при этом не получится полноценно пользоваться вкладкой Preview (Она будет выдавать ошибку при редактировании части alert_template). Я советую все писать в одном шаблоне.

Стоит учитывать, что Grafana использует названия шаблонов указанное в теге {{ define "name" }}. А поле Template name только для пользователя.

Итоговый результат получился настолько крупным, что я решил скрыть его под спойлер:

Пример сообщения от Telegram бота
2 firing:

  [firing] Temp

  Labels:

    alertname: Temp

    device: aqara_zigbee_thermostat

    devicename: bedroom_thermostat

    grafana_folder: climate

    host: hspc

    sensor: WSDCGQ11LM

    topic: pushinfluxdb/bedroom/thermostat

    user: hspc





    Silence alert: http://192.168.10.192:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DTemp&matcher=device%3Daqara_zigbee_thermostat&matcher=devicename%3Dbedroom_thermostat&matcher=grafana_folder%3Dclimate&matcher=host%3Dhspc&matcher=sensor%3DWSDCGQ11LM&matcher=topic%3Dpushinfluxdb%2Fbedroom%2Fthermostat&matcher=user%3Dhspc&orgId=1


    Go to dashboard: http://192.168.10.192:3000/d/3zrU4gU7k?orgId=1


  [firing] CO2

  Labels:

    alertname: CO2

    device: esp32

    devicename: aircheck

    grafana_folder: climate

    host: hspc

    sensor: senseair

    topic: pushinfluxdb/bedroom/co2

    user: hspc





    Silence alert: http://192.168.10.192:3000/alerting/silence/new?alertmanager=grafana&matcher=alertname%3DCO2&matcher=device%3Desp32&matcher=devicename%3Daircheck&matcher=grafana_folder%3Dclimate&matcher=host%3Dhspc&matcher=sensor%3Dsenseair&matcher=topic%3Dpushinfluxdb%2Fbedroom%2Fco2&matcher=user%3Dhspc&orgId=1


    Go to dashboard: http://192.168.10.192:3000/d/3zrU4gU7k?orgId=1

Мне не нравится большое количество пустых строк, длинные ссылки и значения метрик.

Вариант 2

Скорректируем часть alert_template следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{{ define "alert_template" }}
  [{{.Status}}] {{ .Labels.alertname }}
  <b>Metric:</b> {{ range $k, $v := .Values }} {{ $k }}: {{ $v }}
  {{- end }}

  <b>Labels:</b>
  {{- range .Labels.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{- end }}

  {{- if gt (len .Annotations) 0 }}
  <b>Annotations:</b>
  {{- range .Annotations.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{- end }}
  {{- end }}

  {{ if gt (len .SilenceURL ) 0 -}}
  <a href="{{ .SilenceURL }}">Silence alert</a>
  {{- end }}
  {{ if gt (len .DashboardURL ) 0 -}}
  <a href="{{ .DashboardURL }}">Go to dashboard</a>
  {{- end }}
{{ end }}

Пример сообщения от Telegram бота:

2 firing:

  [firing] Temp
  Metric:  B: 64.8 C: 1

  Labels:
    alertname: Temp
    device: aqara_zigbee_thermostat
    devicename: bedroom_thermostat
    grafana_folder: climate
    host: hspc
    sensor: WSDCGQ11LM
    topic: pushinfluxdb/bedroom/thermostat
    user: hspc
  Annotations:
    description: test description
    summary: test summary
    test_castom_annotation: text_castom_annotation

  Silence alert
  Go to dashboard

  [firing] CO2
  Metric:  B: 1420 C: 1

  Labels:
    alertname: CO2
    device: esp32
    devicename: aircheck
    grafana_folder: climate
    host: hspc
    sensor: senseair
    topic: pushinfluxdb/bedroom/co2
    user: hspc

  Silence alert
  Go to dashboard

Silence alert и Go to dashboard являются ссылками, и уже не занимают столько места. Нет лишних переносов строк. Labels и Annotations будут выделены жирным шрифтом. А так же, теперь видно значения метрик.

Добавление минусов убирает пробелы и пропуски строк. Их можно расположить как вначале {{-, так и в конце тегов -}}. Подробнее про оформление можно почитать в этой статье.

Результат уже значительно лучше, однако часть информации может быть лишней. Предлагаю рассмотреть вариант, с адресным обращением к лейблам.

Вариант 3

Снова редактируем лишь часть alert_template. Выберем для вывода только ту информацию, что нам необходима. Поскольку алерты имеют разные поля данных, будем проверять их наличие. Во время редактирование шаблона советую подгрузить один из ваших алертов в поле Payload data, нажав на кнопку Select alert instances. Это отобразит все поля алерта, а так же сразу будет выводить итоговое* сообщение в окно Preview. К сожалению подгрузить можно лишь сработавшие алерты. При необходимости, временно скорректируйте пороги алерта, чтобы заставить его сработать.

* – Во вкладке Preview не применяется html парсинг. Необработанные теги, это норма. Сообщение в telegram должно прийти уже отформатированным.

Дополнительно предлагаю окрасить сообщение с помощью эмодзи. Зеленым выделив Resolved, а красным Firing. А из метрик удалить все, кроме значения B, так как именно она по умолчанию хранит проверяемое значение.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{{ define "alert_template" }}
  {{ if eq .Status "firing" }}🟥{{ else }}🟩{{ end }} {{ .Labels.grafana_folder }} - <b>{{ .Labels.alertname }}</b>
  <b>Metric:</b> {{ .Values.B }}

  {{- if .Labels.host }}
  <b>Host:</b> {{ .Labels.host }}
  {{- end }}
  {{- if .Labels.devicename }}
  <b>Device name:</b> {{ .Labels.devicename }}
  {{- end }}
  {{- if .Labels.device }}
  <b>Device:</b> {{ .Labels.device }}
  {{- end }}
  {{- if .Labels.path }}
  <b>Path:</b> {{ .Labels.path }}
  {{- end }}
  {{- if .Labels.location }}
  <b>Location:</b> {{ .Labels.location }}
  {{- end }}

  {{- if gt (len .Annotations) 0 }}
  <b>Annotations:</b>
  {{- range .Annotations.SortedPairs }}
    {{ .Name }}: {{ .Value }}
  {{- end }}
  {{- end }}
{{ end }}

Пример сообщения от Telegram бота:

2 firing:

  🟥 climate - Temp
  Metric: 64.69
  Host: hspc
  Device name: bedroom_thermostat
  Device: aqara_zigbee_thermostat
  Annotations:
    description: test description
    summary: test summary
    test_castom_annotation: text_castom_annotation

  🟥 service - HDD6 Free Space
  Metric: 130.95
  Host: hspc
  Device: sdc
  Path: /media/hdd6

Итоговое сообщение достаточно компактно, для чтения на смартфоне, содержит только выбранную вами информацию и использует цветовые маркеры, которые так кринжово озвучивает Siri. Что еще нужно?

Надеюсь данная статья вам помогла. Всем красивых алертов, и чтоб побольше.