跳到主要内容

判定周期与恢复

规则上的四个时间字段——执行频率、持续时长、留观时长、恢复判定——共同决定事件何时产生、何时恢复、何时重复通知。

这页办完你会得到:能有意识地设规则上那四个时间字段,而不是一路默认; 并且分得清哪几个决定「事件存不存在」,哪几个只决定「消息发不发」。

这些字段背后的状态机在判定、恢复与状态变化里讲。 这一页讲的是字段本身。

四个字段分别在哪儿​

字段步骤默认
执行频率第 3 步,查询列表下面@every 60s
持续时长 (s)第 3 步,紧挨着60
留观时长(秒)第 4 步 通知配置0
启用恢复通知第 4 步 通知配置开

执行频率​

秒级精度的 cron 表达式。常见写法是 @every 30s;下拉里给了常用间隔, 需要「每天 09:00」这种也可以写标准 cron。

有两条约束,方向正好相反:

  • 别跑得比数据来得还快。 Categraf 默认 15 秒采一次。5 秒判一次只是把同样的三个点 重读一遍,负载翻三倍,一点收益没有。
  • 别跑得比你能容忍的发现时间还慢。 执行频率是发现时间的下限,持续时长还要往上加。

还有一条,很多人是花了代价才发现的:执行频率是按数据源算的。一条匹配十个实例的规则设成 @every 15s,一小时就是 2400 次查询。放宽数据源筛选会悄悄把这个数乘上去—— 见按业务组与数据源划定范围。

SQL 类规则还要拿执行频率和语句本身的耗时对一下。跑一次要八秒的查询,别设 15 秒一跑。

持续时长​

条件要连续成立多久才产生事件。0 表示第一次命中就报。

它是按序列判的:同一条序列要在连续几次判定里都被返回,直到累计时间覆盖持续时长; 只出现过一次就消失的序列永远不会产生事件。而因为压根没产生过事件, 它也不会产生恢复——一个抖动的指标配上持续时长之后是真的安静,不是被悄悄去重了。

几条经验:

  • 0:留给二元、没有歧义的东西——进程没了、证书过期了。
  • 2~3 个执行周期:留给一切采样出来的量——CPU、内存、延迟、错误率。这是最常见的情况, 也是默认值为什么是 60 秒执行频率配 60 秒持续时长。
  • 比这东西自愈时间还长:如果一个队列两分钟就自己排空了,两分钟的持续时长意味着 你永远不会知道那些能自己排空的。

发现时间大致是 持续时长 + 一个执行周期。按这个算预算。

留观时长​

判定恢复之前的观察窗口。默认 0——条件一不成立就恢复。

告警抖动的时候就该动这个字段。设成 300 之后,条件不再成立时规则会继续盯五分钟; 这期间条件又成立了,什么都不会发生,告警就保持在告警中。

注意它到底管的是什么:这个窗口里根本不产生恢复事件。告警在事件列表里仍然是活跃的, 不只是安静。对一个来回横跳的指标来说,这通常才是诚实的呈现。

恢复到底是怎么判的​

对 Prometheus 类规则,恢复只有一个含义:查询不再返回那条序列了。 因为阈值写在 PromQL 里,一条序列掉回阈值以下就不再被返回, 这和 exporter 挂掉在结果上没法区分。两种情况都会让告警恢复。

日志类和 SQL 类规则的阈值判定是在夜莺里做的,不在数据源里,所以它们能分清这两件事, 于是在每条判定条件上多出一个恢复条件下拉:

选项什么时候恢复查询查不到数据时
查不到数据就恢复条件不再成立,或查询没返回任何东西恢复
必须查到数据且不满足告警条件才恢复查到了一行,且这行不满足条件继续告警
结果满足自定义条件才算恢复查到了一行,且满足你写的那个表达式继续告警

默认选中哪一个,取决于数据源类型。 被归为日志类的那些——Elasticsearch、OpenSearch、 VictoriaLogs、Loki、ClickHouse、Doris——默认是第一个,因为没查到错误日志通常就真的说明 问题过去了。其余类型默认是第二个,因为一个连不上的数据库不等于一个健康的数据库。

ClickHouse 和 Doris 在这里算日志类,哪怕你对它们写的是 SQL 规则也一样, 所以别想当然,去看一眼那个下拉。

不对称阈值​

第三个选项要填一条恢复表达式,语法和触发条件一样。这是防抖动的标准做法, 而且它能做到留观时长做不到的事:把两个阈值拉开。

触发 $A.value > 90
恢复 $A.value < 80

在 80 到 90 之间,告警既不再次触发也不恢复——就保持原样,直到指标往一边站队为止。 恢复表达式写错时会被当成「恢复条件不满足」,界面上没有明显报错, 所以配完用模拟触发验一下。

对「数据消失」告警​

日志类和 SQL 类规则在告警条件那一步还有一个独立的数据缺失开关: 之前查到过的数据现在查不到了就告警,重新查到就恢复。它有自己的级别和自己的自动恢复时长。

Prometheus 类规则没有这个开关。单写一条规则来做——用 up == 0, Categraf 环境用 target_up == 0。

恢复通知与重复通知​

第 4 步还有三个字段,决定事件产生之后会怎样:

字段默认作用
启用恢复通知开恢复时到底发不发消息。关掉不会让事件不恢复,只是恢复得悄无声息
重复通知间隔(分钟)60一直不恢复的告警隔多久再提醒一次。0 表示不重复
最大发送次数0一条事件总共最多发多少条通知。0 表示不限

一个值得记住的坑:把一条正在告警的规则停用,你就永远收不到那条恢复通知了, 因为停用的规则不产生任何事件。想临时静音,用屏蔽规则。

怎么选一组值​

三组经得起用的组合:

某个东西挂了。 执行频率 @every 30s,持续时长 0,留观时长 0。 你要立刻知道,也要立刻知道它好了。

资源有压力。 执行频率 @every 60s,持续时长 180,留观时长 300。 持续三分钟的压力值得发一条;平静五分钟再宣布结束。

某个比率越线。 执行频率 @every 60s,持续时长 120, 然后在支持的规则类型上用不对称的恢复条件,而不是留观时长。

数字的行为和你预期对不上时,答案在判定执行记录里: 每个周期都记着条件有没有成立、事件停在了哪个阶段。

下一步​