上一节,当检测到node exporter挂掉后,会立刻将状态更新为Firing :
这种方式有一个问题,假设某一刻由于网络波动, node exporter和prometheus server之间不能通讯。此时如果检测到状态异常,依然会触发报警逻辑——比如半夜收到告警电话。当你起床后,却发现node exporter状态是正常的,因为此时网络又恢复正常。
所以,在生产环境中,触发报警通常的条件会有持续时间的设定,只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。如果你对AWS服务比较熟悉,会发现target group、 ELB等服务的状态检测都是基于这种机制。
FOR 子句 表示从 表达式第一次可以产生 alert 开始,让 Prometheus 等待多长时间,并且在此期间表达式一直可以产生 alert, alert 才会被firing。
在上一节的myrules.yml
加入for子句:
groups:
- name: my-rules
rules:
- alert: NodeExporterDown
expr: up{job='node_exporter'} == 0
for: 1m # 持续检测到异常超过1m后才触发firing
重新启动prometheus和node exporter以应用最新配置。
通过Prometheus WEB界面中的Alerts菜单查看当前Prometheus的告警规则,以及其当前所处的活动状态。此时node exporter正常运行,所以状态为Inactive:
将node exporter手动停止,并不断刷新Alerts菜单。当检测到node exporter状态异常后, prometheus不会立刻标记为Firing,而是将其放到pending队列:
当持续1m内检测到node exporter状态依然为异常时,才会进入Firng 状态: