1. 报警规则允许您基于Prometheus expression语言表达式定义警报条件,并向外部服务发送有关触发警报的通知。每当报警表达式在给定时间内,有一个或多个指标符合报警表达式,则就可以视为这条规则处于活跃的状态(也就是触发了报警)。

定义警报规则

警报规则在Prometheus中的配置方式与记录规则相同。
带有警报的示例规则文件为:

  1. groups:
  2. - name: example
  3. rules:
  4. - alert: HighRequestLatency
  5. expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
  6. for: 10m
  7. labels:
  8. severity: page
  9. annotations:
  10. summary: High request latency
  1. 其中`for`字句的意思是:该条报警在第一次遇到符合报警表达式的指标,需要再等待一定的持续时间。这种情况下,Prometheus发出报警之前,会查看该条报警规则时候10分钟内一直都处于活跃状态,只有一直是活跃状态才会触发报警。而10分钟内,处于活跃状态并不会报警,此时的状态是pending 状态。(总结来说就是报警持续了10分钟才会真的发送报警,10分钟之内就是pending状态,并不会报警)。<br />`labels`子句允许指定一组附加到警报的附加标签。任何现有的冲突标签都将被覆盖。标签值可以模板化(可以使用模板template)。<br />`annotations`子句指定了一组信息标签,可用于存储更长的附加信息,例如警报描述或运行手册链接。注释值可以模板化(可以使用模板template)。

模板化 templating

标签和注解值可以使用控制台模板进行模板化。该$labels变量保存警报实例的标签键/值对。可以通过$externalLabels变量是访问外部标签的(不是用于metrics数据,当prometheus使用thanos集群时,就需要使用external_lables)。该$value变量保存触发报警的值。

  1. # To insert a firing element's label values:
  2. {{ $labels.<labelname> }}
  3. # To insert the numeric expression value of the firing element:
  4. {{ $value }}
  1. 示例:
  1. groups:
  2. - name: example
  3. rules:
  4. # Alert for any instance that is unreachable for >5 minutes.
  5. - alert: InstanceDown
  6. expr: up == 0
  7. for: 5m
  8. labels:
  9. severity: page
  10. annotations:
  11. summary: "Instance {{ $labels.instance }} down"
  12. description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
  13. # Alert for any instance that has a median request latency >1s.
  14. - alert: APIHighRequestLatency
  15. expr: api_http_request_latencies_second{quantile="0.5"} > 1
  16. for: 10m
  17. annotations:
  18. summary: "High request latency on {{ $labels.instance }}"
  19. description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

查看已经触发的报警

要手动检查哪些警报处于活动状态(待处理或触发pending or firing),请访问Prometheus实例的”Alerts”选项卡。这将为您显示当前所有报警规则的状态信息。
对于待处理和触发警报,Prometheus还存储了一个时间序列:ALERTS{alertname="<alert name>", alertstate="<pending or firing>", <additional alert labels>},只要报警处于活动(待处理或触发)状态,他的值就为1,当不再是活跃状态时,它将标记为陈旧。

发送报警通知

  1. Prometheus的警报规则擅长于确定_当前已发生的问题_,但它们并不是完整的通知解决方案。需要另外一层来在简单警报定义的基础上添加摘要,通知速率限制,静默和警报依赖性。在Prometheus的生态系统中,[Alertmanager](https://www.yuque.com/qinjunhang/cn-prometheus/gz5l0v)担当了这个角色。因此,Prometheus可以配置为定期将有关警报状态的信息发送到Alertmanager实例,该实例随后负责调度正确的通知。<br /> 可以将Prometheus[配置](https://www.yuque.com/qinjunhang/cn-prometheus/zcf8b0)为通过其服务发现集成自动 发现可用的Alertmanager实例。