跳到主要内容

重试与投递状态

通知发送失败只对「连不上」自动重试,参数按发送类型各不相同;每条消息的投递结果在通知记录里可查,记录保留 7 天。

这页办完你会知道:一条通知从「决定要发」到「对方收到」中间可能卡在哪, 哪些失败会自动重试、哪些不会,以及事后去哪儿翻这一条到底发生了什么。

消息是怎么发出去的​

发送路径按媒介的发送类型(request_type)分三条:

发送类型怎么发并发控制
http(钉钉、企业微信、飞书卡片、Telegram、回调、自建 webhook)进这个媒介自己的队列,异步发媒介上的并发数
smtp(邮件)同步发,走邮件连接池媒介上的批量发送(一次连接里发几封)
flashduty / pagerduty / script直接调用,同步无

HTTP 队列满的时候消息会被丢弃,并写一条失败记录: failed to enqueue notify task, queue is full。看到它说明目标端太慢或者并发数配得太小。

重试只覆盖「连不上」​

这是最容易误解的一点。HTTP 媒介的重试循环是这样的:

  • 请求根本发不出去(DNS 解析失败、连接被拒、超时)→ 等一个重试间隔再来一次, 最多重试重试次数遍;全失败后写一条 all retries failed, last error: <最后一次的错误>。
  • 对方返回了任何 HTTP 响应 → 立刻返回,不重试。200 记成功,非 200 记失败, 记录里是 status_code:<码>, response:<响应体>。

也就是说,钉钉返回 400「关键词不匹配」、企业微信返回 45009「超频」, 都不会重试。这是有意的:重发一条对方已经明确拒绝的消息没有意义, 而且对下游的去重不友好。

还有一个边界:重试次数填 0 等于一条都不发——循环体一次都不进, 记录里是一条 all retries failed,错误信息还是空的。别把它当限流开关用。

每种发送类型的重试参数不一样​

参数httpflashduty / pagerduty
超时超时时间(毫秒),内置媒介 10000超时时间(毫秒),内置 FlashDuty 5000
重试次数重试次数,内置媒介 3重试次数,不填按 3
重试间隔重试间隔(毫秒),内置媒介 100重试等待时间(毫秒),不填按 1000
实际尝试次数等于重试次数重试次数 + 1

新建媒介时表单给的默认值和内置媒介不完全一样(超时 10000、并发 3、重试 3、间隔 3000), 按需要改。

对「对方回了个错误状态码」这件事,三条路径的态度也不一样:

  • http:只有 200 算成功,其余状态码记失败,但不重试;
  • pagerduty:200 和 202 算成功,其余状态码会按重试次数再试一轮;
  • flashduty:只要请求发出去了就算成功,状态码只记录不判断——重发会破坏对方的去重。

发之前就被丢掉的几种情况​

这几种情况下请求压根没发出去,但通知记录里有一条失败记录:

记录里的文字原因怎么修
message_template not found这条通知配置没选消息模板回通知规则补上模板。FlashDuty、PagerDuty 和「回调」类媒介不需要模板,界面上也不显示这一项
notify_channel not found媒介被删了,或者被停用了——引擎侧的缓存只装启用中的媒介把媒介启用回来,或换一个
failed to enqueue notify task, queue is fullHTTP 发送队列满提高媒介的并发数,或者查目标端为什么慢

另外两种情况连记录都不会有,因为事件根本没走到通知这一步: 通知规则上挂的事件处理工作流把事件丢弃了,或者恢复事件遇上「不通知恢复」的规则。

在哪儿看送没送到​

开源版没有独立的「通知记录」菜单页,记录挂在事件上: 告警通知 → 告警事件 → 点开一条事件 → 通知记录 → 查看详情。

抽屉里分告警规则通知和订阅规则通知两张表,列是通知规则 ID、通知渠道、 通知对象、通知目标、通知状态。三点值得注意:

  • 同一个(渠道 + 目标)的多条记录会被合并成一行,状态取更差的那个, 说明文字拼接在一起。所以一行里可能同时看到成功和失败的片段。
  • 通知目标默认打码,末 8 位变成星号。只有邮件、短信、语音、脚本和屏蔽记录 显示完整值——这几类的目标本来就是收件人自己看得到的信息。
  • 记录是异步入库的(内存队列每 100 毫秒批量落一次),刚发完立刻刷新可能还看不到。

状态有三种:成功、失败,以及被屏蔽——最后一种来自「只屏蔽通知」的屏蔽规则, 渠道显示成 mute,目标是 id=<屏蔽规则 id>,说明文字里带屏蔽规则的名字。 用它可以回答「这段时间到底屏蔽掉了什么」,详见屏蔽规则。

通知记录只留 7 天​

notification_record 是持续高频写入的大表,中心端每天凌晨 1 点清理一次, 默认只保留 7 天。想改保留天数,在中心端配置文件的 [Center] 段里加:

[Center]
# 通知记录保留天数,默认 7
CleanNotifyRecordDay = 30

要长期留存就自己往外导,不要靠加大这个值——这张表的写入量跟告警量成正比。

下一步​