Что можно сказать про оповещения о проблемах в графане? Ну разве что то, что они есть. Не могу сказать, что они мне действительно нравились, но они были недостаточно плохими для того, чтобы заняться их кастомизацией.
Но после обновления графаны до девятой версии всё изменилось. Я обнаружил, что сообщения превратились в малочитаемые простыни (на картинке слева):
Потратив некоторое время на поиск в гугле и чтение документации, я узнал, что теперь в графане по умолчанию используется новая подсистема 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. Очень удобно, даже не открывая телеграм видишь пришло сообщение о решении проблемы или о новой проблеме.