警报规则允许您根据 Prometheus 表达式语言的表达式定义警报条件,并向外部服务发送有关触发警报的通知。每当警报表达式在给定时间点产生一个或多个矢量元素时,警报对这些元素的标签集都视为激活。
警报规则在 Prometheus 中的配置方式与记录规则相同。下面是一个带有警报的规则的示例:
groups: - name: example rules: - alert: HighRequestLatency expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 for: 10m labels: severity: page annotations: summary: High request latency
上面的配置中,有一个可选的 for 子句会使 Prometheus 在首次遇到新的表达式输出向量元素时等待一定时间,并将此元素的警报视为触发(firing)。在这种情况下,Prometheus 将检查警报是否在每次评估期间持续激活 10 分钟,然后才触发警报。处于活动状态但尚未触发的元素处于待触发状态。没有 for 子句的警报规则将在第一次评估时处于激活状态。
labels 子句允许指定一组附加到警报上的标签。任何现有的冲突标签都将被覆盖。标签值可以是模板化的(后续介绍模板)。
annotations 子句指定了一组信息标签,可用于存储较长的附加信息,如警报说明或运行手册链接,注释值也可以模板化。
标签(labels)和注释(annotation)值可使用控制台模板进行模板化。$labels 变量保存警报实例的标签键/值对。可通过 $externalLabels 变量访问配置的外部标签。$value 变量保存警报实例的评估值。例如:
# 插入 firing 元素的标签值: {{ $labels.<labelname> }} # 插入 firing 元素的数字表达式值: {{ $value }}
示例:
groups: - name: example rules: # 对超过 5 分钟无法访问的任何实例发出警报 - alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes." # 对请求延迟中值大于 1 秒的任何实例发出警报 - alert: APIHighRequestLatency expr: api_http_request_latencies_second{quantile="0.5"} > 1 for: 10m annotations: summary: "High request latency on {{ $labels.instance }}" description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
要手动检查哪些警报处于活动状态(挂起 pending 或 触发 firing),请导航至 Prometheus 实例的“Alerts”选项卡,这将显示每个已定义警报当前处于活动状态的确切标签集。
对于挂起(pending)和触发(firing)的警报,Prometheus 还会存储形式为 ALERTS{alertname="<alert name>", alertstate="<pending or firing>", <additional alert labels>} 的合成时间序列。只要警报处于指定的活动(待处理或触发)状态,样本值就会设为 1,而当不再处于活动状态时,序列就会被标记为过时。
Prometheus 的警报规则能够很好地找出目前存在的问题,但并不是一个完全成熟的通知解决方案。在简单的警报定义基础上,还需要另一层来添加汇总、通知速率限制、静音和警报依赖性。在 Prometheus 的生态系统中,Alertmanager 就扮演了这一角色。因此,可以配置 Prometheus 定期向 Alertmanager 实例发送有关警报状态的信息,然后由 Alertmanager 负责发送正确的通知。
可以对 Prometheus 进行配置,使其通过服务发现集成自动发现可用的 Alertmanager 实例。