最推荐的做法是在发送端代码或中间件层实现消息聚合,而不是期望钉钉机器人本身提供合并功能。
先说结论:钉钉自定义机器人没有原生的消息合并开关,需要在业务侧控制发送频率和内容。
- 先定位:确认当前触发频率是否超过官方限制(通常为每分钟 20 条)。
- 先做:在发送逻辑前增加缓冲队列或时间窗口聚合。
- 再验证:观察钉钉群内消息是否减少且无漏报,同时检查发送端日志。
快速处理思路
这不是一个可以通过单条命令解决的问题,需要调整发送逻辑。如果你使用的是 Prometheus Alertmanager,可以直接配置分组;如果是自研代码,需要引入缓冲机制。
# Alertmanager 配置示例片段
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
为什么会这样
钉钉群机器人主要是为了通知,而不是为了处理高频流式数据。官方对自定义机器人 Webhook 设有频率限制,主要是为了防止滥用和保障群聊体验。如果应用侧不加控制,一旦遇到风暴告警,不仅消息会被拦截,还会导致关键信息被淹没,值班人员容易产生“告警疲劳”。
分步处理
1. 确认限制标准
查阅钉钉开放平台文档,确认当前机器人类型的频率上限。一般自定义机器人限制为每分钟 20 条消息,超过会返回错误码。
2. 实现时间窗口聚合
在代码中维护一个缓冲队列。例如,收集 30 秒内的所有告警,打包成一条 Markdown 消息发送。注意要处理“最后一批”消息的强制发送逻辑,避免延迟过高。
3. 优化消息内容
使用 Markdown 格式,将多条告警整理为列表。如果告警数量过多,只展示前 N 条并说明“还有 X 条未显示”,避免超过消息长度限制。
4. 引入中间件(可选)
如果业务代码改动困难,可以部署一个独立的 AlertManager 或 Webhook 中转服务,专门负责接收应用告警并合并转发给钉钉。
怎么验证是否生效
1. 检查发送端日志
确认没有频繁出现 HTTP 429 或钉钉返回的频率限制错误码(如 limit exceeded)。
2. 观察群消息表现
触发一次批量告警,观察钉钉群内是否只收到合并后的一条或少数几条消息,而不是刷屏。
3. 验证实时性
确认合并后的延迟在可接受范围内(例如不超过 1 分钟),避免关键故障通知滞后。
常见坑
1. 消息长度超限
钉钉 Markdown 消息有长度限制(通常 20KB 左右),合并过多内容会导致发送失败,需要做截断处理。
2. @某人功能失效
合并消息后,原有的单条告警@逻辑可能丢失,建议仅在合并消息头部@相关负责人,避免@所有人造成打扰。
3. 进程重启丢失缓冲
如果缓冲队列保存在内存中,服务重启会导致未发送的告警丢失,重要场景建议持久化缓冲队列。
参考来源
- 钉钉开放平台,自定义机器人接入文档,https://open.dingtalk.com/document/robots/custom-robot-access
原文链接:https://www.zjcp.cc/ask/10670.html
