菜单
Grafana Cloud 企业版 开源

配置 Webhook 通知

在联系点中使用 Webhook 集成将告警通知发送到您的 Webhook。

Webhook 集成是一种灵活的方式,可以将告警集成到您的系统中。当通知触发时,它会向 Webhook 端点发送一个包含告警详细信息和附加数据的 JSON 请求。

配置联系点的 Webhook

要创建具有 Webhook 集成的联系点,请完成以下步骤。

  1. 导航到 告警和 IRM -> 告警 -> 联系点
  2. 点击 + 添加联系点
  3. 输入联系点的名称。
  4. 集成 列表中,选择 Webhook
  5. URL 字段中,复制您的 Webhook URL。
  6. (可选) 配置附加设置
  7. 点击 保存联系点

有关联系点的更多详细信息,包括如何测试和启用通知,请参阅配置联系点

Webhook 设置

选项描述
URLWebhook URL。

可选设置

选项描述
HTTP 方法指定使用的 HTTP 方法:POSTPUT
基本认证用户名HTTP 基本认证的用户名。
基本认证密码HTTP 基本认证的密码。
认证 Header SchemeAuthorization 请求头的 Scheme。默认是 Bearer
认证 Header CredentialsAuthorization 请求头的 Credentials。
额外 Headers请求中包含的附加 HTTP 头。
最大告警数通知中包含的最大告警数。超出此限制的任何告警将被忽略。0 表示无限制。
TLSTLS 配置选项,包括 CA 证书、客户端证书和客户端密钥。
HMAC 签名HMAC 签名配置选项。

注意

您可以配置 HTTP 基本认证或 Authorization 请求头中的任意一种,但不能同时配置两者。

HMAC 签名

您可以使用 HMAC 签名来保护您的 Webhook 通知,以验证请求的真实性和完整性。启用后,Grafana 会使用共享密钥通过 HMAC-SHA256 对 Webhook 有效载荷进行签名。

选项描述
密钥用于生成 HMAC 签名的共享密钥。
Header设置签名的 HTTP 头。默认是 X-Grafana-Alerting-Signature
时间戳 Header可选的 header,用于在签名计算中包含时间戳。指定后,Grafana 将在此 header 中设置一个 Unix 时间戳,并将其包含在 HMAC 计算中。这可以防止重放攻击。

配置 HMAC 签名后,Grafana 会使用您的密钥通过 HMAC-SHA256 生成签名。如果指定了时间戳 header,则签名计算中会包含一个 Unix 时间戳。签名计算方式如下:

HMAC(timestamp + ":" + body)

时间戳会发送到指定的 header 中。如果没有指定时间戳 header,签名仅根据请求体计算。签名会作为十六进制编码字符串发送到指定的签名 header 中。

验证请求

要验证来自 Grafana 的入站 Webhook 请求,请按照以下步骤操作:

  1. 从 header 中提取签名(默认是 X-Grafana-Alerting-Signature)。
  2. 如果您配置了时间戳 header,提取时间戳值并验证其是否最近,以防止重放攻击。
  3. 计算预期签名
    • 使用您的共享密钥创建一个 HMAC-SHA256 哈希
    • 如果使用时间戳,在请求体之前包含时间戳,后跟一个冒号 (:)
    • 对原始请求体进行哈希计算
    • 将结果转换为十六进制字符串
  4. 将计算出的签名与请求 header 中的签名进行比较。

使用模板的可选设置

使用以下设置在JSON 有效载荷中包含自定义数据。这两个选项都支持使用通知模板

选项描述
标题将值作为字符串发送到JSON 有效载荷title 字段中。支持通知模板
消息将值作为字符串发送到JSON 有效载荷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"
}

有效载荷

Webhook 通知中的 JSON 有效载荷包含以下键值对

类型描述
receiverstring联系点的名称。
statusstring告警的当前状态,firing (触发) 或 resolved (已解决)。
orgIdnumber与有效载荷相关的组织 ID。
alerts告警数组正在触发的告警。
groupLabelsobject用于分组的标签,字符串键到字符串值的映射。
commonLabelsobject所有告警共有的标签,字符串键到字符串值的映射。
commonAnnotationsobject所有告警共有的标注,字符串键到字符串值的映射。
externalURLstring发送此 Webhook 的 Grafana 实例的外部 URL。
versionstring有效载荷结构的版本。
groupKeystring用于分组的键。
truncatedAlertsnumber被截断的告警数量。
statestring告警组的状态(alertingok)。

以下键值对也包含在 JSON 有效载荷中,并可以使用通知模板在 Webhook 设置中进行配置

类型描述
titlestring自定义标题。可在Webhook 设置中使用通知模板进行配置
messagestring自定义消息。可在Webhook 设置中使用通知模板进行配置

Alert

Alert 对象表示通知组中包含的一个告警,由alerts 字段提供。

类型描述
statusstring告警的当前状态,firing (触发) 或 resolved (已解决)。
labelsobject此告警的标签,字符串键到字符串值的映射。
annotationsobject此告警的标注,字符串键到字符串值的映射。
startsAtstring告警开始时间。
endsAtstring告警结束时间,未解决时的默认值为 0001-01-01T00:00:00Z
valuesobject触发当前状态的值。
generatorURLstringGrafana UI 中告警规则的 URL。
fingerprintstring标签指纹,具有相同标签的告警将拥有相同的指纹。
silenceURLstring在 Grafana UI 中静默此告警规则的 URL。
dashboardURLstring如果告警具有 Dashboard UID 标注,则指向 Grafana 仪表盘的链接。
panelURLstring如果告警具有 Panel ID 标注,则指向面板的链接。
imageURLstring创建此通知的规则所关联的面板的屏幕截图 URL。

自定义有效载荷

“自定义有效载荷”选项允许您使用模板完全自定义 Webhook 有效载荷。这使您可以完全控制 Webhook 请求的结构和内容。

选项描述
有效载荷模板定义 Webhook 有效载荷结构的模板字符串。
有效载荷变量定义在模板中 .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 助手函数示例

{{ 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 }}