事件聚合与去重
同一规则 + 同一标签集只对应一个事件,重复判定不会再建一条;聚合视图按表达式把上百条活跃事件折成几张卡片。
这页办完你会知道:为什么同一个故障不会每个判定周期发一条,以及一屏几百条活跃事件时 怎么把它们折成几张卡片看。
去重是天然的:一个事件 = 规则 + 标签集
事件的身份由规则和标签集共同决定,算出来就是详情里那个 Hash。
- 同一条规则、同一组标签,只会有一个活跃事件。规则每个周期都在跑,条件一直成立, 更新的是这条事件的触发时间和触发时值,不会每个周期新建一条;
- 同一条规则跑在 5 台机器上,是 5 个事件(
ident不同),各自触发、各自恢复; - 恢复之后再次触发,才算新的一条。
所以「重复告警」在夜莺里通常不是同一个事件发了很多次,而是标签维度太细——
一条规则按 device 展开出十几个序列,就有十几个独立事件。想少几条,
先看能不能在规则里把维度聚合掉(PromQL 里 sum by (...)),
见指标规则。
同一条事件反复通知,则由告警规则上的两个字段控制:重复通知间隔(分钟) —— 持续未恢复时隔多久再提醒一次;最大发送次数 —— 0 表示不限制。 这两个是最直接的「一个故障别发一百条」开关。
把上百条活跃事件折成几张卡片
告警通知 → 告警事件 → 活跃告警,列表上方有一个 聚合规则 下拉。 选中一条聚合规则后,事件按规则算出的字符串归类,表格上方出现一排卡片, 每张卡片是一类;点某张卡片,下方表格只显示这一类的事件。
选择框旁边会显示「N 个聚合结果」,一眼看出这一屏其实只有几类问题。
常用的聚合表达式
点下拉里的 新增规则,填两个字段:规则名称(下拉里显示的名字)和 聚合规则(Go 模板,算出来的字符串就是卡片标题)。管理员还能把它设为公开, 给所有人用;不公开就只有自己看得到。
| 想按什么归类 | 聚合规则填 |
|---|---|
| 按告警规则 | {{.RuleName}} |
| 按业务组 + 级别 | Group:{{.GroupName}} Severity:{{.Severity}} |
| 按机器 | {{.TagsMap.ident}} |
| 按实例标签 | {{.TagsMap.instance}} |
| 按服务 | {{.TagsMap.service}} |
能用的字段:.RuleName、.GroupName、.Severity、.TagsMap.<标签名> 等事件字段。
值班时最有用的是 {{.RuleName}} 和 {{.TagsMap.ident}}:前者回答「哪条规则在刷屏」,
后者回答「是不是就那一台机器出问题」。
聚合规则只影响这一页怎么显示,不改事件本身,也不影响通知。
想减少通知条数,用这三招
看完聚合卡片、确认某一类确实不用每条都发之后:
- 规则上调重复通知间隔和最大发送次数——针对「同一个事件一直响」;
- 屏蔽规则——针对「这段时间这类别吵」,见屏蔽规则;
- 工作流的事件丢弃处理器——针对「这类根本不该发」,见事件 Pipeline。
三者的先后顺序见降噪与路由模型; 成套的场景化配法见降噪模式。