Делаем нотификации графаны снова читаемыми
Что можно сказать про оповещения о проблемах в графане? Ну разве что то, что они есть. Не могу сказать, что они мне действительно нравились, но они были недостаточно плохими для того, чтобы заняться их кастомизацией.
Но после обновления графаны до девятой версии всё изменилось. Я обнаружил, что сообщения превратились в малочитаемые простыни (на картинке слева):
Потратив некоторое время на поиск в гугле и чтение документации, я узнал, что теперь в графане по умолчанию используется новая подсистема unified alerting (оно же ngalert, оно же с недавних пор просто alerting). Для каждого канала нотификации можно установить свой шаблон сообщений. Для описания шаблонов используется Go Template, в документации описаны доступные из темплейта данные и функции, в исходниках есть стандартный шаблон. В общем, информации для создания своего шаблона вполне достаточно.
После некоторых экспериментов у меня получился вот такой вариант:
{{ define "tgshortbody" }}{{ range . }} {{ or .Annotations.message .Labels.alertname }}
{{ range .Annotations.SortedPairs }}{{ if ne .Name "message" }}{{ .Name }}: {{ .Value }}
{{ end }}{{ end }}
{{ with .ValueString }}{{ reReplaceAll "[[][^]]*metric='{?([^}']*)}?'[^]]*value=([0-9]*([.][0-9]{,3})?)[^]]*](, )?" "$1: $2\n" . }}
{{ end }}{{ with .PanelURL }}Chart {{ end }}{{ with .DashboardURL }}@Dashboard {{ end }}{{ with .GeneratorURL }} Edit {{ end }}{{ with .SilenceURL }} Mute {{ 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. Очень удобно, даже не открывая телеграм видишь пришло сообщение о решении проблемы или о новой проблеме.