Prometheus 支持两种类型的规则,这些规则可以配置,然后定期评估:记录规则和警报规则。要在 Prometheus 中包含规则,需要创建一个包含必要规则语句的文件,并让 Prometheus 通过 Prometheus 配置中的 rule_files 字段加载该文件。
注意:在运行时,可通过向 Prometheus 进程发送 SIGHUP 信号来重新加载规则文件。只有在所有规则文件格式良好的情况下,更改才会被应用。
要在不启动 Prometheus 服务器的情况下快速检查规则文件的语法是否正确,可以使用 Prometheus 的 promtool 命令行实用工具:
promtool check rules /path/to/example.rules.yml
promtool 命令是 prometheus 安装包的一部分。当文件语法有效时,检查程序会将解析后的规则文本打印到标准输出,然后以 0 返回状态退出。如果出现任何语法错误或输入参数无效,它会在标准错误中打印错误信息,并以 1 返回状态退出。
通过记录规则,可以预先计算经常需要或计算成本较高的表达式,并将其结果保存为一组新的时间序列。这样,查询预计算结果往往比每次执行原始表达式要快得多。这对于每次刷新都需要重复查询相同表达式的仪表盘来说尤其有用。
记录和警报规则存在于规则组中,组内的规则按固定间隔顺序运行,评估时间相同。记录规则的名称必须是有效的度量名称,警报规则的名称必须是有效的标签值。
规则文件的语法如下:
groups: # 见 <rule_group> 章节 [ - <rule_group> ]
一个简单的规则文件示例:
groups: - name: example rules: - record: code:prometheus_http_requests_total:sum expr: sum by (code) (prometheus_http_requests_total)
记录规则分组语法:
# 组的名称,在文件中必须是唯一的。 name: <string> # 评估组中的规则的频率。 [ interval: <duration> | default = global.evaluation_interval ] # 限制警报规则和记录规则可产生的警报数量,0 为无限制 [ limit: <int> | default = 0 ] rules: # 见 <rule> 章节 [ - <rule> ... ]
记录规则的语法:
# 要输出到的时间序列的名称,必须是有效的度量名称 record: <string> # 要评估的 PromQL 表达式。每个评估周期都会在当前时间进行评估, # 并将结果记录为一组新的时间序列,其度量名称由 "record" 提供。 expr: <string> # 在存储结果之前要添加或覆盖的标签 labels: [ <labelname>: <labelvalue> ]
警报规则的语法:
# 警报的名称,必须是有效的标签值 alert: <string> # 要评估的 PromQL 表达式。每个评估周期都会在当前时间对其进行评估, # 评估后的所有时间序列都会成为 pending/firing 状态警报 expr: <string> # 警报一旦返回了这么长时间,就被认为是触发的(即报警持续了这么长时间) # 尚未触发足够长时间的警报被视为 pending 状态的警报 [ for: <duration> | default = 0s ] # 触发警报的条件解除后,警报会持续触发多长时间。 [ keep_firing_for: <duration> | default = 0s ] # 为每个警报添加或覆盖的标签 labels: [ <labelname>: <tmpl_string> ] # 为每个警报添加注释 annotations: [ <labelname>: <tmpl_string> ]
可以为每个组配置由警报规则和系列生成的记录规则产生的警报限制。
当超过限制时,该规则产生的所有系列都将被丢弃,如果是警报规则,则该规则的所有警报(活动的、挂起的或不活动的)也将被清除。
该事件将被记录为评估中的错误,因此不会写入过时的标记。
如果一个规则组在下一次评估开始前还未完成评估(由 evaluation_interval 定义),下一次评估将被跳过。规则组的后续评估将继续跳过,直到初始评估完成或超时为止。当这种情况发生时,记录规则产生的度量值就会出现缺口。每错过一次规则组迭代,rule_group_iterations_missed_total 指标就会递增一次。如下:
上图中,总共有四次评估,但是第一次评估耗时太长,知道第四次评估才评估结束。那么,第二次、第三次评估将不会执行,rule_group_iterations_missed_total 指标的值将为 2。