Как стать автором
Обновить

Делаем нотификации графаны снова читаемыми

Время на прочтение2 мин
Количество просмотров17K

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

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

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

Теги:
Хабы:
Всего голосов 9: ↑9 и ↓0+9
Комментарии4

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
14 сентября
Конференция Practical ML Conf
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн