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

Но после обновления графаны до девятой версии всё изменилось. Я обнаружил, что сообщения превратились в малочитаемые простыни (на картинке слева):

Потратив некоторое время на поиск в гугле и чтение документации, я узнал, что теперь в графане по умолчанию используется новая подсистема unified alerting (оно же ngalert, оно же с недавних пор просто alerting). Для каждого канала нотификации можно установить свой шаблон сообщений. Для описания шаблонов используется Go Template, в документации описаны доступные из темплейта данные и функции, в исходниках есть стандартный шаблон. В общем, информации для создания своего шаблона вполне достаточно.

После некоторых экспериментов у меня получился вот такой вариант:

{{ define "tgshortbody" }}{{ range . }} <b>{{ or .Annotations.message .Labels.alertname }}</b>
{{ range .Annotations.SortedPairs }}{{ if ne .Name "message" }}{{ .Name }}: {{ .Value }}
{{ end }}{{ end }}
{{ with .ValueString }}{{ reReplaceAll "[[][^]]*metric='{?([^}']*)}?'[^]]*value=([0-9]*([.][0-9]{,3})?)[^]]*](, )?" "$1: <b>$2</b>\n" . }}
{{ end }}{{ with .PanelURL }}<a href="{{ . }}">Chart</a> {{ end }}{{ with .DashboardURL }}@<a href="{{ . }}">Dashboard</a> {{ end }}{{ with .GeneratorURL }} <a href="{{ . }}">Edit</a> {{ end }}{{ with .SilenceURL }} <a href="{{ . }}">Mute</a> {{ end }}
{{ end }}{{ end }}
{{ define "tgshort" }}{{ with .Alerts.Firing }}⚠️{{ template "tgshortbody" . }}{{ end }}{{ with .Alerts.Resolved }}✅{{ template "tgshortbody" . }}{{ end }}{{ end }}

Как видите, всего несколько строчек. Самым сложным оказалось переделать ValueString из нечитаемого нечто наподобие [ var='B0' metric='Zombie' labels={} value=10.85 ] в что-то, похожее на выдававшееся старой графаной. Так как это строка, пришлось воспользоваться чёрной магией регулярных выражений. Скажу честно, мне такое решение не нравится, слишком оно ненадёжное (например, появление одинарной кавычки в имени тега сломает регулярное выражение), да и нечитаемое, но особого выбора не было. FR на добавление нетекстового представления создал.

Небольшие пояснения по возможной адаптации шаблона: в шаблоне используются понимаемые телеграмом html-теги, может быть, для других каналов оповещения их придётся выкинуть или заменить на что-то другое. Тексты сообщений после обновления графаны у нас оказались в полеmessageаннотаций, поскольку лень — самое главное качество сисадмина, я решил это не менять. Если у вас текст сообщения хранится в другом поле, придётся подправить шаблон.

Прописываются шаблоны в веб-интерфейсе графаны в разделе alerting/notifications: нажимаем «New template» и вводим новый шаблон.

Дальше на той же странице нужно для используемых каналов оповещений (contact points) указать, что будет использоваться наш шаблон: заходим в настройки нужного канала и прописываем там в в поле Message:

{{ template "tgshort" . }}

Ну вот и всё. Новый вариант сообщения можете видеть на КПДВ справа. Смайлик, увы, не идёт в комплекте с шаблоном.

P. S. идею использовать юникодные значки для отображения статуса сообщения подсмотрел на @HetznerStatusChannel. Очень удобно, даже не открывая телеграм видишь пришло сообщение о решении проблемы или о новой проблеме.

Комментарии (3)


  1. Alexsey
    07.07.2022 04:14

    Разрабы графаны конечно совсем неправильно поступили что какое-то непотребство по дефолту сделали вместо того чтобы перенести старую логику на новый движок.

    Разбираться самому что и как честно говоря было лениво так что спасибо что показали в какую сторону копать.


  1. Mnemonik
    07.07.2022 10:49
    +1

    если .ValueString это "[ var='B0' metric='Zombie' labels={} value=10.85 ]" то скорее всего все эти данные доступны либо как .Value.metric/.Value.value либо .Values.B0.metric/.Values.B0.value и так далее.

    Как минимум в алертах это работает (там через $, как {{ $values.B0.value }})

    Основная проблема новых алертов в графане не запутанность, а то что это абсолютно новая система, к которой если начать читать документацию, то дойти до раздела где будет описано то что тебе нужно почти нереально (а часто это будет вообще один абзац который можно запросто пропустить) и гугл ещё не набрал достаточное количество людей с такой же проблемой как у тебя. Раскопать что-то быстро чтобы узнать как это выписать практически невозможно сейчас.


    1. edo1h Автор
      07.07.2022 15:44

      скорее всего все эти данные доступны либо как .Value…

      разумеется, это я полез проверять первым делом, первой мыслью было «забыли написать в документации»
      https://github.com/grafana/grafana/blob/ecf080825e77f36a86f1278db41d1d9cd101c722/pkg/services/ngalert/notifier/channels/template_data.go#L20