详解for语句

上一节,当检测到node exporter挂掉后,会立刻将状态更新为Firing :

image-20210510151711151 这种方式有一个问题,假设某一刻由于网络波动, node exporter和prometheus server之间不能通讯。此时如果检测到状态异常,依然会触发报警逻辑——比如半夜收到告警电话。当你起床后,却发现node exporter状态是正常的,因为此时网络又恢复正常。

所以,在生产环境中,触发报警通常的条件会有持续时间的设定,只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。如果你对AWS服务比较熟悉,会发现target group、 ELB等服务的状态检测都是基于这种机制。

FOR子句( For Clause)测试

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

image-20210510154009444 将node exporter手动停止,并不断刷新Alerts菜单。当检测到node exporter状态异常后, prometheus不会立刻标记为Firing,而是将其放到pending队列:

image-20210510154406398 当持续1m内检测到node exporter状态依然为异常时,才会进入Firng 状态:

image-20210510154215862