钉钉
钉钉集成今天只支持通知方向(把触发的告警推到钉钉群)。IM-bridge 双向模式已规划但未发布;校验器在 stream/webhook 模式接受 dingtalk 是为向前兼容。
| 模式 | 状态 |
|---|---|
| Notification | 支持。自定义群机器人,带签名。 |
| IM bridge | 框架在;生产支持延后。 |
载荷
钉钉自定义机器人接受标准 text-message 形态:
{
"msgtype": "text",
"text": {"content": "[CRITICAL] node-01 swap_high\nswap_in_pages > 1000 for 5m\nsource: alert\ndedupe: alert:swap_high:device=7"}
}body 本身不签名。钉钉是通过 URL query 参数鉴权 —— 见签名。
这和飞书、企微 sender 用的是同一个扁平文本格式化函数,由 formatText 产出。
签名
自定义机器人开启 加签 后,钉钉要求请求带 timestamp 和 sign URL query 参数:
timestamp = milliseconds since epoch
stringToSign = timestamp + "\n" + secret
sign = base64(HMAC-SHA256(key=secret, message=stringToSign))签名 key 是 secret 本身(不像飞书里 secret 还参与 string-to-sign)。signDingTalkURL helper 把两个 query 参数都拼上去:
POST https://oapi.dingtalk.com/robot/send?access_token=…×tamp=1717012345000&sign=…body 保持纯 JSON。钉钉鉴权的对象是签名后的 URL + body。
用毫秒时间戳
钉钉签名期望毫秒,不是秒。signer 用 time.Now().UnixMilli()。秒精度时间戳会得到 310000 "sign invalid"。
配置
- 在目标钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义。给名字和头像。
- 选 安全设置 → 加签,复制 secret。(你也可以改选 IP 白名单或关键词过滤;Ongrid sender 都支持,但推荐加签。)
- 复制 webhook URL —— 长得像
https://oapi.dingtalk.com/robot/send?access_token=<token>。 - 在 Ongrid:Settings → Channels → New → Provider =
dingtalk→ Endpoint = webhook URL → Secret = 第 2 步的签名 secret(选了关键词或 IP 模式就不用填)。
测试消息要符合群"安全设置"
选了关键词过滤的话,测试消息正文里必须包含那个关键词,否则钉钉拒收。Ongrid 默认测试消息是 [INFO] Ongrid test。要么把关键词配成能匹配的(Ongrid 就行),要么选加签模式。
小坑
不支持 at
当前 sender 只发纯 msgtype: text。@特定用户(atMobiles / atUserIds / isAtAll)还没进 payload builder。今天要用的话改用通用 webhook;原生支持留作未来增强。
4xx 重试是有意的
钉钉对协议层错误(签名不匹配、消息过长、bot 限流)也返 HTTP 200,把错误塞在 JSON body 的 errcode 里。sender 把任何 2xx 当成功,只暴露非 2xx HTTP 状态码。如果 bot 静默不投递了,检查 manager 日志里的 dingtalk: send_text: code=… —— 飞书和钉钉共用"200 OK + errcode 在 body 里"这种模式。
钉钉消息速率限制
钉钉自定义机器人每个 bot 每分钟 20 条。告警流水线的降噪(默认每 dedupe key 5 分钟一条)通常远低于这个数;高基数集群可能要加大降噪窗口或者按规则分通道路由。
与飞书对比
| 方面 | 钉钉 | 飞书 |
|---|---|---|
| 签名放在哪 | URL query(timestamp、sign) | body 字段(timestamp、sign) |
| 时间戳单位 | 毫秒 | 秒 |
| 签名 key | secret | timestamp + "\n" + secret |
| HMAC 算法 | SHA-256 | SHA-256 |
| 签的是空 body 吗 | 否(sign 对 stringToSign 算) | 是(HMAC message 为空) |
表面相似的两套协议,三个真实差异。它们存在两个独立 Sender 正是为此。