恢复条件使用场景
夜莺 v9 告警恢复条件详解:三种恢复判定方式、用自定义恢复条件防止告警抖动、留观时长,以及无数据时是否恢复的取舍。
概述
告警规则除了「什么情况下触发」,还需要定义「什么情况下恢复」。默认情况下,触发条件不再满足时告警就自动恢复——这对大多数场景够用,但有两类问题:
- 阈值附近抖动:指标在阈值上下反复跳动,导致告警「触发 → 恢复 → 又触发」反复横跳,通知刷屏。
- 无数据该不该恢复:采集中断、查询查不到数据时,到底应该把告警当成「已恢复」还是「继续告警」?不同数据源、不同业务的答案不一样。
「恢复条件」就是用来精细控制恢复时机的。配置入口:告警规则编辑页 → 触发条件区域 → 高级设置 → 恢复条件。它对简单模式和表达式模式都生效,且每个触发条件($A、$B…对应的每个阈值判断)可以单独配置。
三种恢复方式
恢复条件是一个下拉选项,共三种:
| 恢复方式 | 含义 | 查不到数据时 |
|---|---|---|
| 查不到数据就恢复 | 触发条件不再满足或查询查不到数据 → 恢复 | 恢复 |
| 必须查到数据且不满足告警条件才恢复 | 必须查到数据、且数据不满足触发条件 → 才恢复 | 不恢复(继续告警) |
| 结果满足自定义条件才算恢复 | 必须查到数据、且数据满足你写的恢复表达式 → 才恢复 | 不恢复(继续告警) |
三者最关键的区别在于**「查不到数据时怎么办」**:
- 查不到数据就恢复:把「没数据」也当作恢复信号。适合日志类告警——查不到错误日志,通常就说明问题没了。
- 后两种:「没数据」不算恢复,告警会持续,直到真正查到一条「正常」的数据。适合指标类告警——采集中断时你往往不希望告警被误判为恢复而悄悄消失。
默认值:新建规则时,日志类数据源默认「查不到数据就恢复」,其它数据源(Prometheus 等指标源)默认「必须查到数据且不满足告警条件才恢复」。通常保持默认即可。
自定义恢复条件:防止告警抖动(最常用的进阶场景)
选择「结果满足自定义条件才算恢复」后,会多出一个恢复表达式输入框(占位提示 e.g. $A < 50)。它的语法和触发表达式完全一致(参见 告警表达式语法),只是用来判定「恢复」而非「触发」。
这正是解决阈值抖动的标准手段——让触发阈值和恢复阈值拉开一段距离。
例子:CPU 使用率防抖动
| 配置 | 表达式 |
|---|---|
| 触发条件 | $A > 90 |
| 恢复条件 | $A < 80 |
效果:
- CPU 超过 90% → 触发告警;
- 之后只要还在 80%~90% 之间,既不再触发、也不恢复,告警保持;
- 直到跌破 80% 才真正恢复。
这样就避免了 CPU 在 90% 附近小幅波动时告警反复横跳。
更多自定义恢复的例子:
| 场景 | 触发条件 | 恢复条件 |
|---|---|---|
| 错误率防抖 | $A.error_rate > 0.05 |
$A.error_rate < 0.01 |
| 队列积压防抖 | $A.pending > 10000 |
$A.pending < 1000 |
| 多条件恢复(更严格) | $A.qps > 1000 |
$A.qps < 500 && $B.error_rate < 0.01 |
恢复表达式可以引用和触发条件相同的多个查询变量,组合出比「触发条件取反」更严格或更宽松的恢复逻辑。
留观时长:恢复前再观察一段时间
「恢复条件」决定满足什么才算恢复,而留观时长决定恢复后还要再稳定多久才真正发恢复通知。两者互补,可同时使用。
- 配置入口:告警规则编辑页 → 通知配置 → 留观时长(秒),默认
0。 - 含义:满足恢复条件后,还要持续 N 秒没有再次触发阈值,才判定为恢复并发送恢复通知。
- 作用:进一步抑制「刚恢复又触发」的短时抖动。
举例:留观时长 = 300,则告警满足恢复条件后,必须连续 5 分钟都不再触发,才会真正恢复。
留观时长和恢复条件是两道独立的闸:先满足恢复条件,再熬过留观时长,才最终恢复。
怎么选
| 你的诉求 | 推荐配置 |
|---|---|
| 普通指标告警,低于阈值就该恢复 | 必须查到数据且不满足告警条件才恢复(默认) |
| 日志告警,查不到日志就算恢复 | 查不到数据就恢复(日志源默认) |
| 指标在阈值附近反复抖动、通知刷屏 | 结果满足自定义条件才算恢复,恢复阈值比触发阈值更宽松 |
| 采集可能中断,但中断时不想让告警自动消失 | 避开「查不到数据就恢复」 |
| 采集中断本身就意味着问题已解决 | 查不到数据就恢复 |
| 恢复后想再观察一段时间防抖 | 任意方式 + 设置「留观时长」 |
常见问题
Q1:恢复条件和触发条件取反有什么不同?
A:默认行为就近似「触发条件不满足即恢复」。自定义恢复条件的价值在于让恢复阈值和触发阈值不对称,或加入额外变量,这是简单取反做不到的。比如触发 $A > 90、恢复 $A < 80,中间 80~90 的「灰区」既不触发也不恢复。
Q2:选了「必须查到数据……」,采集中断后告警为什么一直不恢复?
A:这是预期行为。这两种方式下「查不到数据」不算恢复,告警会持续到查到一条满足恢复条件的数据为止。如果你希望采集中断时自动恢复,请改选「查不到数据就恢复」;如果希望对「无数据」单独告警,请配置规则的「无数据告警」选项。
Q3:恢复表达式写错了会怎样?
A:表达式无法正确求值时会被视为「恢复条件不满足」,即不会恢复(界面无明显报错)。配置后建议结合数据预览确认恢复阈值合理。恢复表达式的语法细节见 告警表达式语法。
Q4:恢复表达式里能用字符串、时间等类型吗?
A:可以,规则和触发表达式完全一致——值字段是数值、标签字段是字符串、支持 date()/now() 等。详见 告警表达式语法。