一、介绍
Prometheus规则是一种逻辑表达式,可用于定义有关监控数据的逻辑关系和约束条件。这些规则可以用于告警条件、聚合和转换等。
普罗米修斯支持两种类型的规则,可以对其进行配置,然后定期进行评估:
- recording rules
- alerting rules。
要在 Prometheus 中使用规则,请创建一个包含所需规则语句的文件,并让Prometheus 通过 Prometheus 配置中的 rule_files
字段加载该文件。规则文件使用YAML 格式。
Alerting规则:在满足某些条件时触发警报,例如CPU使用率超过90%。
Recording规则:使用PromQL表达式进行聚合和转换,将结果记录下来。例如计算平均响应时间。可以作为性能指标的跟踪,以便找到规律优化服务。
通过使用这些规则,您可以轻松地监控和管理您的应用程序和基础设施,并及时发现并解决任何问题。
二、配置 Prometheus 使用规则文件
需要在 Prometheus 的配置文件中的 rule_files
字段下添加配置,rule_files
字段的值是一个包含多个规则文件路径的列表,规则文件路径支撑通配符。示例如下:
prometheus.yml
...
rule_files:
- "prometheus.rules.yml" # 指定具体文件
- "rules/*.yml" # 指定 rules 目录下的所有以 .yml 结尾的文件
三、 规则文件语法
记录和警报规则存在于规则组中。组中的规则以固定的时间间隔按顺序运行,评估时间相同。
记录规则的名称必须是有效的度量值名称。警报规则的名称必须是有效的标签值。
记录规则名称需要符合正则表达式: [a-zA-Z_:][a-zA-Z0-9_:]*
警报规则名称需要符合正则表达式:[a-zA-Z_][a-zA-Z0-9_]*
以__
(两个“_”)开头的标签名称保留供内部使用
规则文件语法
全局
groups:
# 一个规则组的名称,在当前文件中需唯一。
- name: example
# 获取规则数据的频率,也就是每次查询规则的间隔时间,比如设置为 5s, 1m 等。一般按默认,默认是安装 prometheus 配置文件中全局配置的 evaluation_interval 值。
[ interval: <duration> | default = global.evaluation_interval ]
# 限制警报规则和记录规则可以产生的系列警报的数量。0没有限制。一般按默认
[ limit: <int> | default = 0 ]
# 定义这个规则组中一个一个的规则
rules:
[- <rule> ...]
Recording rules(记录规则)
记录规则允许您预先计算经常需要的或计算成本高昂的表达式,并将其结果保存为一组新的时间序列。
groups:
- name: example
rules:
# record 字段: 输出到的时间序列的名称。必须是有效的度量值名称
- record: code:prometheus_http_requests_total:sum
# 要计算的PromQL表达式。每个评估周期都在当前时间进行评估,结果记录为一组新的时间序列,度量名称由 "record" 给出
expr: sum by (code) (prometheus_http_requests_total)
# labels 下配置的是存储结果之前要添加或覆盖的标签
labels:
[ <labelname>: <labelvalue> ]
2 Alerting rules(警报规则)
警报规则文件的语法几乎和记录规则文件语法一样,只是 rule (规则)配置中部分字段不同。
groups:
- name: example
rules:
# alertname 警报的名称。必须符合有效标签名称的规则。
- alert: <string>
# 要计算的PromQL表达式。
# 每个评估周期都会在当前时间进行评估,满足表达式条件后,所有生成的时间序列都会变为 pending 挂起/ firing alerts 触发警报。
expr: <string>
# 当 expr 内书写的表达式条件满足后,警报会立刻变成 pending 状态.
# 持续超过 for 指定的时间后,警报会被视为触发,并转为 firing 状态。
# pending 和 firing 也会在 Prometheus Web 页面中看到.
# 如果没有此配置,
[ for: <duration> | default = 0s ]
# 触发警报的条件清除后,警报仍然保持触发状态多长时间。
[ keep_firing_for: <duration> | default = 0s ]
# 要为每个警报添加或覆盖的标签。标签值可以使用 go 的模板变量
labels:
[ <labelname>: <tmpl_string> ]
# 要添加到每个警报的注释。这个信息通常用于发送告警给某个介质(邮件,钉钉等)的内容中
# lavelname 的值可以使用 go 的模板变量
annotations:
[ <labelname>: <tmpl_string> ]
示例
groups:
- name: example
rules:
- alert: ServerDown
expr: up == 0
for: 10s
labels:
severity: page
annotations:
summary: Server is down
3 模板化如何使用
labels 和 annotations 字段的配置可以使用 go 语言中的模板进行模板化。
-
$labels
变量包含警报实例的标签键/值对。 - 可以通过
$externalLabels
变量访问配置的外部标签。 -
$value
变量保存警报实例expr
的计算结果值,注意不是返回条件表达式的 布尔值。
例如:up == 0
中,$value
的值是up
的计算结果,官方称为警报实例的评估值。
配置示例:
groups:
- name: example
rules:
# 对任何超过5分钟无法访问的实例发出警报。
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "实例: {{ $labels.instance }} 已停机"
description: "xx 项目作业 Job:{{$labels.job}}的{{$labels.instance}}已停机超过5分钟。"
# 针对请求延迟中值>1s的任何实例发出警报
- alert: APIHighRequestLatency
expr: api_http_request_latencies_second{quantile="0.5"} > 1
for: 10m
annotations:
summary: "实例 {{ $labels.instance }} 请求延迟高"
description: "{{ $labels.instance }} 的请求延迟超过 1 秒(当前值: {{ $value }}s)"
四、检查规则文件语法
在不启动 Prometheus 的情况下也可以检查规则文件中的语法是否正确。
Prometheus 安装包中的 promtool 工具可以支持规则文件语法的检查。
promtool check rules /path/to/example.rules.yml
文章来源:https://www.toymoban.com/news/detail-687193.html
五、发送警报通知
普罗米修斯的警报规则善于发现目前出现的问题,但它们并不是一个成熟的通知解决方案。在简单的警报定义之上,还需要另一层来添加摘要、通知速率限制、静音和警报依赖关系。在普罗米修斯的生态系统中,Alertmanager 扮演着这个角色。
下个章节详细介绍 Alertmanager 。文章来源地址https://www.toymoban.com/news/detail-687193.html
到了这里,关于Prometheus-Rules(规则)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!