规则的单元测试
你可以使用promtool
来测试你的规则。
# 对单一测试文件。./promtool test rules test.yml
# 如果你有多个测试文件,例如 test1.yml, test2.yml, test2.yml./promtool test rules test1.yml test2.yml test3.yml
测试文件格式
# 要考虑测试的规则文件列表。支持通配符。rule_files: [ - <filename> ]
[ evaluation_interval: <duration> | 默认 = 1m ]
# 下面列出的组名称顺序将在给定计算时间时计算规则组(计算时间)。仅对下面列出的组有效。# 所有组不一定需要在下面列出。group_eval_order: [ - <group_name> ]
# 列出的所有测试。tests: [ - <test_group> ]
<test_group>
# 序列数据[ interval: <duration> | default = evaluation_interval ]input_series: [ - <stries> ]
# 测试组的名称[ name: <string> ]
# 对上述数据进行的单元测试。
# 对告警规则的单元测试。我们从输入文件中考虑告警规则。alert_rule_test: [ - <alert_test_case> ]
# 对PromQL表达式的单元测试。promql_expr_test: [ - <promql_test_case> ]
# 可访问告警模板的外部标签。external_labels: [ <labelname>: <string> ... ]
# 可访问告警模板的外部URL。# 通常通过`--web.external-url`设置。 [ external_url: <string> ]
<series>
# 遵循通常的序列表示法`<指标名称>{<标签名称>=<标签值>, ...}`。# 示例:# series_name{label1="value1", label2="value2"}# go_goroutines{job="prometheus", instance="localhost:9090"}
series: <string>
# 使用扩展表示法。# 扩展表示法:# 'a+bxn' 变为 'a a+b a+(2*b) a+(3*b) … a+(n*b)' - 序列从 a 开始,n 个后续样本递增 b。# 'a-bxn' 变为 'a a-b a-(2*b) a-(3*b) … a-(n*b)' - 序列从 a 开始,n 个后续样本递减 b(或增加负 b)。# 'axn' 变为 'a a a … a'(a n+1 次) - 它是'a+0xn'的简写形式,序列从 a 开始,n 个后续样本递增0。# 存在用于表示缺失和过期样本的特殊值:# '_' 表示从抓取中缺失的样本# 'stale' 表示过期的样本# 示例:# 1. '-2+4x3' 变为 '-2 2 6 10' - 序列从-2开始,3个后续样本递增4。# 2. ' 1-2x4' 变为 '1 -1 -3 -5 -7' - 序列从1开始,4个后续样本递减2。# 3. ' 1x4' 变为 '1 1 1 1 1' - 等同于'1+0x4',序列从1开始,4个后续样本递增0。# 4. ' 1 _x3 stale' 变为 '1 _ _ _ stale' - 缺失的样本不能递增,因此产生了3个缺失样本由'_x3'表达式产生。
values: <string>
<alert_test_case>
Prometheus 允许你为不同的告警规则具有相同的告警名称。因此,在这个单元测试中,你需要列出给定告警名称下所有触发的告警的并集。
# 告警需要检查的时间从 time=0s 开始。eval_time: <duration>
# 需要测试的告警名称。alertname: <string>
# 在给定计算时间下,预期触发的告警列表。如果你想测试某个告警规则不应该触发,可以列出上述字段并将`exp_alerts`留空。exp_alerts: [ - <alert> ]
<alert>
# 预期告警的扩展标签和注释。# 注意:标签也包括与告警关联的样例的标签(在`/alerts`中看到的,没有序列`__name__`和`alertname`)exp_labels: [ <labelname>: <string> ]exp_annotations: [ <labelname>: <string> ]
<promql_test_case>
# 要计算的表达式expr: <string>
# 需要检查的表达式的时间,从time=0s开始。eval_time: <duration>
# 给定计算时间时的预期样本。exp_samples: [ - <sample> ]
<sample>
# 样本的标签,遵循通常的序列表示法`<指标名称>{<标签名称>=<标签值>, ...}`。# 示例:# series_name{label1="value1", label2="value2"}# go_goroutines{job="prometheus", instance="localhost:9090"}labels: <string>
# PromQL表达式的预期值。value: <number>
示例
这是一个用于单元测试的示例输入文件,它通过了测试。test.yml
遵循上述语法,并且alerts.yml
包含告警规则。
如果有alerts.yml
在同一目录中,运行./promtool test rules test.yml
。
test.yml
# 单元测试的主要输入。# 只将此文件作为命令行参数传递。
rule_files: - alerts.yml
evaluation_interval: 1m
tests: # 测试 1。 - interval: 1m # 序列数据。 input_series: - series: 'up{job="prometheus", instance="localhost:9090"}' values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' - series: 'up{job="node_exporter", instance="localhost:9100"}' values: '1+0x6 0 0 0 0 0 0 0 0' # 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 - series: 'go_goroutines{job="prometheus", instance="localhost:9090"}' values: '10+10x2 30+20x5' # 10 20 30 30 50 70 90 110 130 - series: 'go_goroutines{job="node_exporter", instance="localhost:9100"}' values: '10+10x7 10+30x4' # 10 20 30 40 50 60 70 80 10 40 70 100 130
# 对告警规则的单元测试。 alert_rule_test: # 单元测试 1。 - eval_time: 10m alertname: InstanceDown exp_alerts: # 告警 1。 - exp_labels: severity: page instance: localhost:9090 job: prometheus exp_annotations: summary: "Instance localhost:9090 down" description: "localhost:9090 of job prometheus has been down for more than 5 minutes." # 对PromQL表达式的单元测试。 promql_expr_test: # 单元测试 1。 - expr: go_goroutines > 5 eval_time: 4m exp_samples: # 样本 1。 - labels: 'go_goroutines{job="prometheus",instance="localhost:9090"}' value: 50 # 样本 2。 - labels: 'go_goroutines{job="node_exporter",instance="localhost:9100"}' value: 50
alerts.yml
# 规则文件。
groups:- name: example rules:
- alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary:
该文档基于 Prometheus 官方文档翻译而成。