如何编写 Promethus 的规则(rules)

如何编写 prometheus 的 Recording rules 和 Alerting rules

如何编写 Promethus 的规则(rules)

Promethus 的规则简介

什么是规则?

规则是我们预先定义的一组来完成复杂工作的表达式的合集。规则以 YAML 格式书写。

promethus 定义了2种类型的规则:

  • Recoding rules
  • Alerting rules

规则会被定期求值,并且可以在 prometheus.yml 内部引用。引用方式如下:

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

然后我们我们就可以在 prometheus.yml 同级目录下创建 prometheus.rules.yml 文件,并以 YAML 格式编写我们的规则了。

Recoding rules

当我们有频繁使用的复杂查询时,如果直接将语句写在 grafana 的 query 中,grafana 每次刷新都对 promethus 提交实时查询,会增加 prometheus 的性能消耗并且降低了响应速度。 这时候我们就可以用到 Recoding rules 了。

记录规则允许我们预先计算经常使用或计算成本高的表达式,并将其结果保存为一组新的时间序列。因此,查询预先计算的结果通常比每次需要时执行原始表达式快得多。

下面看下 Recoding rules 的语法:

groups:
- name: recording_rules
  rules:
    - record: node_exporter:node_memory_free:memory_used_percents
      expr: 100 - 100 * (node_memory_MemFree / node_memory_MemTotal)

groups 下面既包含 recording 又包括 alerting 规则,我们只要以 name 来区分就可以了。

比如我们需要统计 LVS 每一个 virtualServer 的连接情况,我们定义了一个新的 label,记为 vip_port,值的格式为 172.17.xx.xx:80, 172.17.xx.xx:443。那么我们就需要自己创建一个。

vim prometheus.rules.yml

groups:
  - name: recording_rules
    rules:
      - record: node_ipvs_backend_virtualserver
        expr: label_join(node_ipvs_backend_weight, "vip_port",":", "local_address", "local_port")

然后重启 promethus: systemctl restart prometheus,这样就可以在 Promethus 的 Graph 下用 node_ipvs_backend_virtualserver 这个新的 metric 来查询了。

Alerting Rules

告警规则与记录规则非常相似,编写起来更加多样化,但不是太难。它有几个额外的标签。假设我们对过去15分钟的平均负载感兴趣。 如果安装了 node_exporter,则可以通过在表达式浏览器中键入 node_load15 来查询 Prometheus。 如果过去15分钟内的平均负载非常高,则意味着我们的服务器被大量使用,这时候我们就希望收到有关该服务器的通知。
比起 recording rules 多了几条必要的标签,分别是告警等级以及注解。注解又分为 摘要(summary)和 描述(description)。
下面是个示例,我们来一探究竟:
vim prometheus.rules.yml

groups:
  - name: recording_rules
    rules:
      - record: node_ipvs_backend_virtualserver
        expr: label_join(node_ipvs_backend_weight, "vip_port",":", "local_address", "local_port")
  - name: alerting_rules
    rules:
      - alert: LoadAverage15m
        expr: node_load15 >= 0.75
        labels:
          severity: major
        annotations:
          summary: "Instance {{ $labels.instance }} - high load average"
          description: "{{ $labels.instance  }} (measured by {{ $labels.job }}) has high load average ({{ $value }}) over 15 minutes."

然后重启 promethus: systemctl restart prometheus,这样就可以在 Promethus 的 Alerts 下面看到告警信息了:
image

检测规则语法

Prometheus 还提供一个有用的工具 promtool ,可用于检查我们编写的规则是否正确。 我们可以像这样使用它:

promtool check rules /etc/prometheus/prometheus.rules.yml

参考文档