跳转至

自定义告警规则

在 Prometheus 中,告警规则允许您依据 PromQL 表达式来设定告警的触发条件。Prometheus 后端会周期性地对这些触发规则进行计算,一旦满足触发条件,就会触发告警通知。通常情况下,用户能够通过 Prometheus 的 Web 界面查看这些告警规则以及告警的触发状态。当 Prometheus 与 Alertmanager 相关联后,便可将告警发送至外部服务,例如 Alertmanager 中,并且通过 Alertmanager 能够对这些告警进行更进一步的处理。

规则语法检查

快速检查规则文件在语法上是否正确,请安装并运行 Prometheus 的promtool命令行工具:
promtool check rules /path/to/example.rules.yml

定义告警规则

在告警规则文件中,我们能够将一组相关的规则设置定义在同一个 group 之下。在每一个 group 中,我们可以定义多条告警规则(rule)。一条告警规则主要由以下几个部分构成:
groups:
- name: example
  rules:
  # 告警名称。必须是合法的数据指标名称
  - alert: HighErrorRate 

    # 要执行的 PromQL 表达式。每隔执行周期的时间,表达式都会在当前时间进行执行,所有结果时间序列都会变成  pending/firing 告警
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5

    # 一旦持续返回告警多长时间,则将其视为 firing 告警
    # 尚未触发足够长时间的告警被视为 pending
    for: 10m

    # 自定义标签,允许用户指定一组要附加到告警上的额外标签。为每个告警添加或覆盖的标签。
    labels:
      severity: page

    # 指定附加信息,描述告警详细信息的文字等。告警时,annotations 内容会一同作为参数发送到 Alertmanager。
    annotations:
      summary: High request latency
      description: description info

为了使 Prometheus 能够启用所定义的告警规则,我们需要在 Prometheus 的全局配置文件中,通过 rule_files 来指定一组告警规则文件的访问路径。在 Prometheus 启动后,它会自动扫描这些路径下规则文件中定义的内容,并根据这些规则来判断是否向外部发送通知。

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

默认情况下Prometheus会每分钟对这些告警规则进行计算,如果用户想定义自己的告警计算周期,则可以通过evaluation_interval来覆盖默认的计算周期:

global:
  [ evaluation_interval: <duration> | default = 1m ]

模板化

标签和注解值可以使用控制台模板模板化。$labels 变量保存告警实例的标签键/值对。可以通过 $externalLabels 变量访问已配置的扩展标签。$value 变量保存告警实例执行的值。

# 输入告警实例的标签值
{{ $labels.<labelname> }}
# 输入触发告警元素的标志表达式的值
{{ $value }}
groups:
- name: example
  rules:

  # Alert for any instance that is unreachable for >5 minutes.
  - 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."

  # Alert for any instance that has a median request latency >1s.
  - 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)"

在运行时检查告警

要手动检查哪些告警处于活动状态(挂起或触发),请导航到 Prometheus 实例的 "Alerts" 选项卡。该页面将向您展示每个定义的的告警当前处于活动状态的确切标签集。

对于挂起和触发的告警,Prometheus 存储格式为ALERTS{alertname="<alert name>", alertstate="pending|firing", <additional alert labels>}的时间序列。只要警报处于活动(挂起或触发)状态,样本值就设置为1;如果不再是这种情况,则将该系列标记为过时。

发送告警通知

Prometheus 的告警规则擅长确定当前已经发生的问题,但它并不是完美的通知解决方案。在简单的告警定义之上,还需要另一层来添加摘要,通知速率限制,静默和告警依赖。在 Prometheus 生态系统中,Alertmanager 扮演了这个角色。因此,Prometheus 可以配置为定期将有关告警状态的信息发送到 Alertmanager 实例,该实例随后负责调度正确的通知。

可以将 Prometheus 配置为通过其服务发现集成自动发现可用的 Alertmanager 实例。