Prometheus 报警管理器配置钉钉 webhook 怎么操作?

文章导读
配置 Prometheus Alertmanager 发送钉钉报警需要通过 webhook 接收器配合中间件适配协议,适用于需要即时通知运维团队的场景,风险在于钉钉签名验证失败会导致消息投递丢失。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

配置 Prometheus Alertmanager 发送钉钉报警需要通过 webhook 接收器配合中间件适配协议,适用于需要即时通知运维团队的场景,风险在于钉钉签名验证失败会导致消息投递丢失。

先说结论:必须使用 webhook 适配器转换数据格式并处理签名,直接配置钉钉 URL 无法通过验证。

  • 适合:需要将 Prometheus 监控报警实时推送至钉钉群组的运维场景
  • 先准备:钉钉自定义机器人 Webhook 地址、签名密钥以及 webhook 适配服务
  • 验收:手动触发测试报警后,钉钉群组能在秒级内收到格式正常的卡片消息

命令速用版

以下配置片段可直接用于 alertmanager.yml 的 receivers 部分,前提是已部署 webhook 适配服务:

receivers:\n- name: 'dingtalk'\n  webhook_configs:\n  - url: 'http://localhost:8060/dingtalk/webhook1/send'\n    send_resolved: true

适配服务启动命令参考(以 prometheus-webhook-dingtalk 为例):

./prometheus-webhook-dingtalk `--ding`.webhook.url="https://oapi.dingtalk.com/robot/send?access_token=XXX" `--ding`.secret="SECXXX"

为什么会这样

Alertmanager 原生 webhook 输出格式不符合钉钉机器人接口规范,且钉钉要求请求携带时间戳和签名。

Prometheus Alertmanager 设计的 webhook 接收器是通用的,它发送标准的 JSON 负载,而钉钉开放平台要求特定的 JSON 结构(msgtype 为 markdown 或 text)以及基于密钥的 HMAC-SHA256 签名验证。如果不经过中间件转换和签名计算,钉钉服务器会直接拒绝请求并返回错误码。

分步处理

第一步:创建钉钉机器人

Prometheus 报警管理器配置钉钉 webhook 怎么操作?

在钉钉群组设置中添加自定义机器人,勾选“加签”安全设置,记录 Webhook 地址和密钥。不要泄露密钥,避免他人冒充机器人发送消息。

第二步:部署 Webhook 适配服务

下载并运行社区通用的 prometheus-webhook-dingtalk 适配程序。配置参数需包含上一步获取的 Webhook URL 和密钥。确保适配服务与 Alertmanager 网络互通。

第三步:修改 Alertmanager 配置

编辑 alertmanager.yml 文件,在 receivers 段落添加 webhook 配置,url 指向适配服务的监听地址。在 route 段落将默认接收器指向新配置的 name。

第四步:重载配置

Prometheus 报警管理器配置钉钉 webhook 怎么操作?

发送 SIGHUP 信号给 Alertmanager 进程或通过 API 重载配置。检查 Alertmanager 日志确认配置加载成功,无 YAML 语法错误。

怎么验证是否生效

通过 Alertmanager 接口触发测试报警,观察钉钉群组是否收到消息。

使用 curl 命令向 Alertmanager 发送测试警报,或临时修改 Prometheus 规则触发阈值。检查钉钉群组消息内容是否包含报警名称、severity 级别和恢复状态。查看适配服务日志,确认返回状态码为 200 且钉钉接口返回 errcode 为 0。

常见坑

  • 签名不匹配:适配服务配置的密钥与钉钉机器人设置不一致,导致钉钉返回 signature error。
  • 时间不同步:服务器系统时间与标准时间偏差超过允许范围,钉钉会拒绝签名验证。
  • 网络隔离:适配服务无法访问外网钉钉 API 地址,需检查防火墙或代理设置。
  • 消息截断:报警内容过长超过钉钉限制,需在适配层配置内容截取或折叠。

常见问题

钉钉收不到报警消息怎么办?

首先检查适配服务日志是否有连接错误或签名错误,其次确认 Alertmanager 是否成功发出了 webhook 请求。

可以直接在 Alertmanager 里配置钉钉 URL 吗?

不可以,Alertmanager 原生不支持钉钉的签名算法和消息格式,必须经过中间件转换。

如何区分不同级别的报警消息?

在适配服务模板中配置不同 severity 对应不同的钉钉消息颜色或@不同的人员。

参考来源

  • Prometheus Alertmanager Configuration: https://prometheus.io/docs/alerting/latest/configuration/
  • 钉钉自定义机器人接入文档:https://open.dingtalk.com/document/robots/custom-robot-access
  • prometheus-webhook-dingtalk 项目说明:https://github.com/timonwong/prometheus-webhook-dingtalk