Настройка уведомлений webhook
Используйте интеграцию webhook в точках контакта, чтобы отправлять уведомления об оповещениях в ваш webhook.
Интеграция webhook — гибкий способ интеграции оповещений в вашу систему. При запуске уведомления она отправляет JSON-запрос с деталями оповещения и дополнительными данными в конечную точку webhook.
Настройка webhook для точки контакта
Чтобы создать точку контакта с интеграцией webhook, выполните следующие шаги.
- Перейдите в Alerts & IRM -> Alerting -> Notification configuration, затем выберите вкладку Contact points.
- Нажмите + Add contact point.
- Введите имя точки контакта.
- В списке Integration выберите Webhook.
- В поле URL вставьте ваш URL Webhook.
- (Необязательно) Настройте дополнительные настройки.
- Нажмите Save contact point.
Подробнее о точках контакта, включая их тестирование и включение уведомлений, см. в разделе Настройка точек контакта.
Настройки webhook
Caution
URL не является защищённым полем. Он хранится в открытом виде и не маскируется при чтении точки контакта. Включайте секреты, такие как токены или пароли, в URL на свой риск.
Для аутентификации в вашей конечной точке webhook используйте вместо этого поля авторизации в необязательных настройках, такие как Basic Authentication или заголовок запроса Authorization. Эти поля хранятся безопасно и маскируются при чтении.
Необязательные настройки
Note
Вы можете настроить либо HTTP Basic Authentication, либо заголовок запроса Authorization, но не оба одновременно.
Подпись HMAC
Вы можете защитить ваши уведомления webhook с помощью подписей HMAC для проверки подлинности и целостности запросов. При включении Grafana подписывает полезную нагрузку webhook общим секретом с помощью HMAC-SHA256.
Когда подпись HMAC настроена, Grafana генерирует подпись с помощью HMAC-SHA256 с вашим секретным ключом. Если указан заголовок метки времени, в вычисление подписи включается Unix-метка времени. Подпись вычисляется как:
HMAC(timestamp + ":" + body)
Метка времени отправляется в указанном заголовке. Если заголовок метки времени не указан, подпись вычисляется только по телу запроса. Подпись отправляется как строка в шестнадцатеричной кодировке в указанном заголовке подписи.
Проверка запроса
Чтобы проверять входящие webhook-запросы от Grafana, выполните следующие шаги:
- Извлеките подпись из заголовка (по умолчанию
X-Grafana-Alerting-Signature). - Если вы настроили заголовок метки времени, извлеките значение метки времени и проверьте, что оно недавнее, чтобы предотвратить атаки повторного воспроизведения.
- Вычислите ожидаемую подпись:
- Создайте хеш HMAC-SHA256 с использованием вашего общего секрета
- Если используются метки времени, включите метку времени, за которой следует двоеточие (
:), перед телом запроса - Хешируйте необработанное тело запроса
- Преобразуйте результат в строку в шестнадцатеричном виде
- Сравните вычисленную подпись с подписью в заголовке запроса.
Необязательные настройки с использованием шаблонов
Используйте следующие настройки, чтобы включить пользовательские данные в полезную нагрузку JSON. Обе опции поддерживают использование шаблонов уведомлений.
Необязательные настройки уведомлений
Полезная нагрузка JSON по умолчанию
Следующий пример показывает полезную нагрузку уведомления webhook, содержащую информацию о двух сработавших оповещениях:
{
"receiver": "My Super Webhook",
"status": "firing",
"orgId": 1,
"alerts": [
{
"status": "firing",
"labels": {
"alertname": "High memory usage",
"team": "blue",
"zone": "us-1"
},
"annotations": {
"description": "The system has high memory usage",
"runbook_url": "https://myrunbook.com/runbook/1234",
"summary": "This alert was triggered for zone us-1"
},
"startsAt": "2021-10-12T09:51:03.157076+02:00",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://play.grafana.org/alerting/1afz29v7z/edit",
"fingerprint": "c6eadffa33fcdf37",
"silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT2%2Cteam%3Dblue%2Czone%3Dus-1",
"dashboardURL": "",
"panelURL": "",
"values": {
"B": 44.23943737541908,
"C": 1
}
},
{
"status": "firing",
"labels": {
"alertname": "High CPU usage",
"team": "blue",
"zone": "eu-1"
},
"annotations": {
"description": "The system has high CPU usage",
"runbook_url": "https://myrunbook.com/runbook/1234",
"summary": "This alert was triggered for zone eu-1"
},
"startsAt": "2021-10-12T09:56:03.157076+02:00",
"endsAt": "0001-01-01T00:00:00Z",
"generatorURL": "https://play.grafana.org/alerting/d1rdpdv7k/edit",
"fingerprint": "bc97ff14869b13e3",
"silenceURL": "https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT1%2Cteam%3Dblue%2Czone%3Deu-1",
"dashboardURL": "",
"panelURL": "",
"values": {
"B": 44.23943737541908,
"C": 1
}
}
],
"groupLabels": {},
"commonLabels": {
"team": "blue"
},
"commonAnnotations": {},
"externalURL": "https://play.grafana.org/",
"version": "1",
"groupKey": "{}:{}",
"truncatedAlerts": 0,
"title": "[FIRING:2] (blue)",
"state": "alerting",
"message": "**Firing**\n\nLabels:\n - alertname = T2\n - team = blue\n - zone = us-1\nAnnotations:\n - description = This is the alert rule checking the second system\n - runbook_url = https://myrunbook.com\n - summary = This is my summary\nSource: https://play.grafana.org/alerting/1afz29v7z/edit\nSilence: https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT2%2Cteam%3Dblue%2Czone%3Dus-1\n\nLabels:\n - alertname = T1\n - team = blue\n - zone = eu-1\nAnnotations:\nSource: https://play.grafana.org/alerting/d1rdpdv7k/edit\nSilence: https://play.grafana.org/alerting/silence/new?alertmanager=grafana&matchers=alertname%3DT1%2Cteam%3Dblue%2Czone%3Deu-1\n"
}
Body
Полезная нагрузка JSON уведомлений webhook содержит следующие пары ключ-значение:
Следующие пары ключ-значение также включаются в полезную нагрузку JSON и могут быть настроены в настройках webhook с использованием шаблонов уведомлений.
Alert
Объект Alert представляет оповещение, включённое в группу уведомлений, как предоставлено полем alerts.
Custom Payload
Опция Custom Payload позволяет полностью настроить полезную нагрузку webhook с помощью
шаблонов. Это даёт вам полный контроль над структурой и содержимым запроса webhook.
Подробную информацию о том, как создавать и управлять шаблонами уведомлений, см. в разделе шаблоны уведомлений.
Note
- При использовании Custom Payload поля
TitleиMessageигнорируются, так как вся структура полезной нагрузки определяется вашим шаблоном.- Custom Payload пока не является общедоступной функцией в Grafana Cloud.
Пример шаблона пользовательской полезной нагрузки, включающего переменные:
{
"alert_name": "{{ .CommonLabels.alertname }}",
"status": "{{ .Status }}",
"environment": "{{ .Vars.environment }}",
"custom_field": "{{ .Vars.custom_field }}"
}
Функции шаблонов JSON
При создании пользовательских полезных нагрузок доступно несколько функций шаблонов, помогающих генерировать допустимые структуры JSON. К ним относятся функции для создания словарей (coll.Dict), массивов (coll.Slice, coll.Append) и преобразования между строками JSON и объектами (data.ToJSON, data.JSON).
Подробную информацию об этих и других функциях шаблонов см. в разделе функции шаблонов уведомлений.
Пример использования вспомогательных функций JSON:
{- /* Generates a pretty-printed JSON payload with alert group info and individual alerts metadata. */ -}}
{{ define "webhook.custom.payload" -}}
{{ coll.Dict
"receiver" .Receiver
"status" .Status
"alerts" (tmpl.Exec "webhook.custom.simple_alerts" .Alerts | data.JSON)
"groupLabels" .GroupLabels
"commonLabels" .CommonLabels
"commonAnnotations" .CommonAnnotations
"externalURL" .ExternalURL
"version" "1"
"orgId" (index .Alerts 0).OrgID
"truncatedAlerts" .TruncatedAlerts
"groupKey" .GroupKey
"state" (tmpl.Inline "{{ if eq .Status \"resolved\" }}ok{{ else }}alerting{{ end }}" . )
"allVariables" .Vars
"title" (tmpl.Exec "default.title" . )
"message" (tmpl.Exec "default.message" . )
| data.ToJSONPretty " "}}
{{- end }}
{{- /* Embed json templates in other json templates. */ -}}
{{ define "webhook.custom.simple_alerts" -}}
{{- $alerts := coll.Slice -}}
{{- range . -}}
{{ $alerts = coll.Append (coll.Dict
"status" .Status
"labels" .Labels
"startsAt" .StartsAt
"endsAt" .EndsAt
) $alerts}}
{{- end -}}
{{- $alerts | data.ToJSON -}}
{{- end }}