告警分级落地:日报降噪、夜间静默与同类去重

举报
yd_254065487 发表于 2026/10/30 05:20:57 2026/10/30
【摘要】 把每天必推的日报改成有条件的告警,用 state 去重、夜间白名单和风暴抑制,让真正需要人介入的消息不被淹没。

先说那个被淹掉的夜晚

凌晨 2:47,订单服务 5xx 从 0.3% 跳到 27%。值班同学手机在 90 秒内震了 41 次:30 条是上游服务超时,8 条是数据库连接池告警,2 条是容器重启,最后 1 条才是根因——主库磁盘写满。他花了 11 分钟往上翻,找到那条 P0 时,故障已经持续了 13 分钟。

这不是推送通道的问题,是分级的问题。告警系统的失败通常不是“没发出来”,而是“发得太多,等于没发”。

日报为什么必然被忽略

很多团队每天早上 9:00 推一条运行日报,内容涵盖接口耗时、任务成功率、库存同步条数。前 21 天数据都正常,第 22 天日报里有一行“库存同步失败 1842 条”,没人点开——因为前 21 天已经把这套肌肉记忆训练好了:这条消息不需要动作。

一条通知的价值大致可以写成 P(需要人行动) × 后果严重度 ÷ 打断成本。日报的问题在于第一项长期接近 0。更糟的是,它破坏了“收到消息”和“系统异常”之间的对应关系——当通道里永远有消息,你就无法再用“有没有消息”判断系统状态。

正确的做法不是把日报做漂亮,而是把它拆开:趋势类指标进面板,不进推送;只有越过阈值、且有人能处理的项,才允许变成一条通知。

timeSensitive 与 active 的取舍

iOS 的通知中断级别有 passive、active、timeSensitive、critical 四档,timeSensitive 能穿透专注模式,critical 需要单独申请权限且审核很严。Android 各厂商通道也有类似的强弱分级。分级滥用的代价是真实的:用户可以在系统设置里单独关掉你的 timeSensitive 权限,一旦关掉,之后所有 P0 都只能当普通横幅。

判断标准只有一条:这条消息发出去,对方是否需要在 5 分钟内做决策?

  • 服务不可用、资金或库存越界 → timeSensitive,必要时叠加电话;
  • 可用性下降但可自愈、容量水位接近阈值 → active;
  • 日报、趋势、周报 → 不推送,进面板。

很多团队把“严重”和“紧急”混为一谈。磁盘跑到 85% 很严重,但不需要凌晨 3 点处理;接口 5xx 到 27% 才是紧急。分级表应该按“要求响应时间”排,而不是按“看起来多吓人”排。

同一天同类告警只推一次:state 去重

同一个磁盘写满的告警,五分钟一次推了 40 遍,本质上是一条信息重复了 40 次。用 fingerprint 做状态去重,成本极低:

fp = sha1(f"{rule_id}:{resource_id}:{level}")

写入 Redis,当天首次出现才推送:

SET alert:sent:20261029:{fp} 1 NX EXAT 1793378700

用 EXAT 指定到次日 00:05 的绝对时间戳,不要用固定 EX 86400,否则任务重启会跨天漂移,出现“今天下午的告警被昨天的 key 挡掉”。NX 返回成功才发消息,失败直接返回。

两个必须保留的例外:级别升高要重推(fingerprint 里带了 level,天然会重推),恢复通知要发。去重只压重复,不压升级和恢复,否则值班同学永远不知道事情结束了没有。

推送本身走华为云 SMN 的发布消息接口即可,一个 topic 订阅多个终端:

POST /v2/{project_id}/notifications/topics/{topic_urn}/publish

请求头带 X-Auth-Token(由 IAM 的 POST /v3/auth/tokens 换取,取响应头 X-Subject-Token),请求体里 subject 控制在 100 字符内,time_to_live 给 3600,避免设备离线后半夜突然补推一堆过期告警。

夜间静默:只放两类过去

23:30 到 07:30 之间,白名单只留两类:

  • 可用性:探针连续 3 次失败、核心接口 5xx 超 5%、主库不可连;
  • 库存与资金:库存跌破安全线、支付对账差额超阈值。

其余告警不要丢弃,而是入队,07:30 合并成一条早报,按 rule_id 分组计数:“夜间折叠 12 类共 208 条,其中超时类 176 条,最长持续 42 分钟”。丢掉和折叠是两件事:丢掉会让团队彻底失去“昨晚出过事”的感知,折叠只是延后了打扰时间。

压住风暴:聚合、抑制与令牌桶

三层防线,缺一层都会漏:

  • 同源聚合:同一 service 加同一 rule 在 300 秒窗口内只发首条,正文附“同类 37 条”。
  • 依赖抑制:主库不可用期间,抑制依赖它的 30 个服务的“接口超时”,只保留根因那条。规则写在拓扑里,不要写在人脑里。
  • 通道令牌桶:单通道每分钟上限 5 条,超出后只发一条汇总并附详情链接。SMN 侧本身对流控有限制,超频会被限流返回 429,客户端如果不做退避,重试反而会加重堵塞。

风暴抑制最容易被忽略的一点是抑制本身要可见。每抑制一次就要留一条计数,否则下次排查时你会怀疑是告警没配对,而不是被拦了。

分级的终点是一句话

每加一条规则,先问:这条消息发出去,收到的人第一个动作是什么?如果答案是“看一眼然后关掉”,那它就不该是告警,应该是面板上的一个数字。分级不是一张配置表,是深夜里有人被叫醒之后要执行的动作序列。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。