Настройка уведомлений webhook

Используйте интеграцию webhook в точках контакта, чтобы отправлять уведомления об оповещениях в ваш webhook.

Интеграция webhook — гибкий способ интеграции оповещений в вашу систему. При запуске уведомления она отправляет JSON-запрос с деталями оповещения и дополнительными данными в конечную точку webhook.

Настройка webhook для точки контакта

Чтобы создать точку контакта с интеграцией webhook, выполните следующие шаги.

  1. Перейдите в Alerts & IRM -> Alerting -> Notification configuration, затем выберите вкладку Contact points.
  2. Нажмите + Add contact point.
  3. Введите имя точки контакта.
  4. В списке Integration выберите Webhook.
  5. В поле URL вставьте ваш URL Webhook.
  6. (Необязательно) Настройте дополнительные настройки.
  7. Нажмите Save contact point.

Подробнее о точках контакта, включая их тестирование и включение уведомлений, см. в разделе Настройка точек контакта.

Настройки webhook

Опция Описание
URL URL Webhook. Это поле защищено от изменения в Grafana Cloud.

Caution

URL не является защищённым полем. Он хранится в открытом виде и не маскируется при чтении точки контакта. Включайте секреты, такие как токены или пароли, в URL на свой риск.

Для аутентификации в вашей конечной точке webhook используйте вместо этого поля авторизации в необязательных настройках, такие как Basic Authentication или заголовок запроса Authorization. Эти поля хранятся безопасно и маскируются при чтении.

Необязательные настройки

Опция Описание
HTTP Method Задаёт используемый HTTP-метод: POST или PUT.
Basic Authentication Username Имя пользователя для HTTP Basic Authentication.
Basic Authentication Password Пароль для HTTP Basic Authentication.
Authentication Header Scheme Схема для заголовка запроса Authorization. По умолчанию — Bearer.
Authentication Header Credentials Учётные данные для заголовка запроса Authorization.
Extra Headers Дополнительные HTTP-заголовки для включения в запрос. Вы также можете переопределить заголовок Content-Type: application/json по умолчанию, чтобы указать другой тип содержимого для полезной нагрузки запроса.
Max Alerts Максимальное количество оповещений для включения в уведомление. Любые оповещения, превышающие этот лимит, игнорируются. 0 означает отсутствие лимита.
TLS Параметры конфигурации TLS, включая сертификат CA, клиентский сертификат и клиентский ключ.
HMAC Signature Параметры конфигурации подписи HMAC.

Note

Вы можете настроить либо HTTP Basic Authentication, либо заголовок запроса Authorization, но не оба одновременно.

Подпись HMAC

Вы можете защитить ваши уведомления webhook с помощью подписей HMAC для проверки подлинности и целостности запросов. При включении Grafana подписывает полезную нагрузку webhook общим секретом с помощью HMAC-SHA256.

Опция Описание
Secret Общий секретный ключ, используемый для генерации подписи HMAC.
Header HTTP-заголовок, в который будет помещена подпись. По умолчанию — X-Grafana-Alerting-Signature.
Timestamp Header Необязательный заголовок для включения метки времени в вычисление подписи. Если указан, Grafana задаст Unix-метку времени в этом заголовке и включит её в вычисление HMAC. Это обеспечивает защиту от атак повторного воспроизведения.

Когда подпись HMAC настроена, Grafana генерирует подпись с помощью HMAC-SHA256 с вашим секретным ключом. Если указан заголовок метки времени, в вычисление подписи включается Unix-метка времени. Подпись вычисляется как:

HMAC(timestamp + ":" + body)

Метка времени отправляется в указанном заголовке. Если заголовок метки времени не указан, подпись вычисляется только по телу запроса. Подпись отправляется как строка в шестнадцатеричной кодировке в указанном заголовке подписи.

Проверка запроса

Чтобы проверять входящие webhook-запросы от Grafana, выполните следующие шаги:

  1. Извлеките подпись из заголовка (по умолчанию X-Grafana-Alerting-Signature).
  2. Если вы настроили заголовок метки времени, извлеките значение метки времени и проверьте, что оно недавнее, чтобы предотвратить атаки повторного воспроизведения.
  3. Вычислите ожидаемую подпись:
    • Создайте хеш HMAC-SHA256 с использованием вашего общего секрета
    • Если используются метки времени, включите метку времени, за которой следует двоеточие (:), перед телом запроса
    • Хешируйте необработанное тело запроса
    • Преобразуйте результат в строку в шестнадцатеричном виде
  4. Сравните вычисленную подпись с подписью в заголовке запроса.

Необязательные настройки с использованием шаблонов

Используйте следующие настройки, чтобы включить пользовательские данные в полезную нагрузку JSON. Обе опции поддерживают использование шаблонов уведомлений.

Опция Описание
Title Отправляет значение как строку в поле title полезной нагрузки JSON. Поддерживает шаблоны уведомлений.
Message Отправляет значение как строку в поле message полезной нагрузки JSON. Поддерживает шаблоны уведомлений.
Custom Payload Необязательно переопределяет формат полезной нагрузки по умолчанию пользовательским шаблоном.

Необязательные настройки уведомлений

Опция Описание
Disable resolved message Включите эту опцию, чтобы предотвратить уведомления при разрешении оповещения.

Полезная нагрузка JSON по умолчанию

Следующий пример показывает полезную нагрузку уведомления webhook, содержащую информацию о двух сработавших оповещениях:

JSON
{
  "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 содержит следующие пары ключ-значение:

Ключ Тип Описание
receiver string Имя точки контакта.
status string Текущий статус оповещения, firing или resolved.
orgId number ID организации, связанной с полезной нагрузкой.
alerts array of alerts Оповещения, которые срабатывают.
groupLabels object Метки, используемые для группировки, карта строковых ключей в строковые значения.
commonLabels object Метки, общие для всех оповещений, карта строковых ключей в строковые значения.
commonAnnotations object Аннотации, общие для всех оповещений, карта строковых ключей в строковые значения.
externalURL string Внешний URL экземпляра Grafana, отправляющего этот webhook.
version string Версия структуры полезной нагрузки.
groupKey string Ключ, используемый для группировки.
truncatedAlerts number Количество оповещений, которые были усечены.
state string Состояние группы оповещений (либо alerting, либо ok).

Следующие пары ключ-значение также включаются в полезную нагрузку JSON и могут быть настроены в настройках webhook с использованием шаблонов уведомлений.

Ключ Тип Описание
title string Пользовательский заголовок. Настраивается в настройках webhook с использованием шаблонов уведомлений.
message string Пользовательское сообщение. Настраивается в настройках webhook с использованием шаблонов уведомлений.

Alert

Объект Alert представляет оповещение, включённое в группу уведомлений, как предоставлено полем alerts.

Key Type Description
status string Current status of the alert, firing or resolved.
labels object Labels that are part of this alert, map of string keys to string values.
annotations object Annotations that are part of this alert, map of string keys to string values.
startsAt string Start time of the alert.
endsAt string End time of the alert, default value when not resolved is 0001-01-01T00:00:00Z.
values object Values that triggered the current status.
generatorURL string URL of the alert rule in the Grafana UI.
fingerprint string The labels fingerprint, alarms with the same labels will have the same fingerprint.
silenceURL string URL to silence the alert rule in the Grafana UI.
dashboardURL string A link to the Grafana Dashboard if the alert has a Dashboard UID annotation.
panelURL string A link to the panel if the alert has a Panel ID annotation.
imageURL string URL of a screenshot of a panel assigned to the rule that created this notification.

Custom Payload

Опция Custom Payload позволяет полностью настроить полезную нагрузку webhook с помощью шаблонов. Это даёт вам полный контроль над структурой и содержимым запроса webhook.

Подробную информацию о том, как создавать и управлять шаблонами уведомлений, см. в разделе шаблоны уведомлений.

Note

  • При использовании Custom Payload поля Title и Message игнорируются, так как вся структура полезной нагрузки определяется вашим шаблоном.
  • Custom Payload пока не является общедоступной функцией в Grafana Cloud.
Опция Описание
Payload Template Шаблон уведомления, определяющий структуру полезной нагрузки webhook.
Payload Variables Пары ключ-значение, определяющие дополнительные переменные, доступные в шаблоне как .Vars.<variable_name>.

Пример шаблона пользовательской полезной нагрузки, включающего переменные:

{
  "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:

Go
{- /* 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 }}