配置 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 签名验证。如果不经过中间件转换和签名计算,钉钉服务器会直接拒绝请求并返回错误码。
分步处理
第一步:创建钉钉机器人
在钉钉群组设置中添加自定义机器人,勾选“加签”安全设置,记录 Webhook 地址和密钥。不要泄露密钥,避免他人冒充机器人发送消息。
第二步:部署 Webhook 适配服务
下载并运行社区通用的 prometheus-webhook-dingtalk 适配程序。配置参数需包含上一步获取的 Webhook URL 和密钥。确保适配服务与 Alertmanager 网络互通。
第三步:修改 Alertmanager 配置
编辑 alertmanager.yml 文件,在 receivers 段落添加 webhook 配置,url 指向适配服务的监听地址。在 route 段落将默认接收器指向新配置的 name。
第四步:重载配置
发送 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