prometheus对rule规则和alert规则作单元测试
1、场景
在实际生产中,对于rules和alerts的配置有时候出于某些特殊原因,无法进行模拟,这时候就需要我们对采集规则和告警规则进行单元测试,以确保正确性
2、Unit testing rules with Prometheus
example:
cat >rules.yml <<EOF
groups:
- name: example
rules:
- record: job:up:sum
expr: sum without(instance)(up)
EOF
要测试此规则,您可以使用以下内容创建 test.yml:
rule_files:
- rules.yml
evaluation_interval: 1m
tests:
- interval: 1m
input_series:
- series: 'up{job="node",instance="foo"}'
values: '1+0x10'
- series: 'up{job="node",instance="bar"}'
values: '1+0x5 0+0x5'
- series: 'up{job="prometheus",instance="foo"}'
values: '1+0x10'
promql_expr_test:
- expr: job:up:sum
eval_time: 1m
exp_samples:
- labels: 'job:up:sum{job="node"}'
value: 2
- labels: 'job:up:sum{job="prometheus"}'
value: 1
- expr: job:up:sum
eval_time: 6m
exp_samples:
- labels: 'job:up:sum{job="node"}'
value: 1
- labels: 'job:up:sum{job="prometheus"}'
value: 1
进行测试:
./promtool test rules test.yml
测试结果:
Unit Testing: test.yml
SUCCESS
分析一下测试文件:
这表示我们要加载规则文件 rules.yml 并每分钟评估其中的规则:
rule_files:
- rules.yml
evaluation_interval: 1m
这定义了第一组测试,并提供了输入数据。该系列每分钟都会有样品。第一个系列是 1 1 1 1 1 1 1 1 1 1,第二个系列是 1 1 1 1 1 0 0 0 0 0,第三个系列是 1 1 1 1 1 1 1 1 1 1:
promql_expr_test:
- expr: job:up:sum
eval_time: 1m
exp_samples:
- labels: 'job:up:sum{job="node"}'
value: 2
- labels: 'job:up:sum{job="prometheus"}'
value: 1
- expr: job:up:sum
eval_time: 6m
exp_samples:
- labels: 'job:up:sum{job="node"}'
value: 1
- labels: 'job:up:sum{job="prometheus"}'
value: 1
最后是实际测试。第一个在一分钟评估返回 2 和 1。第二个在六分钟评估它,此时 up{job=“node”,instance=“bar”} 已变为 0,结果为现在 1 和 1。
3、Unit testing alerts with Prometheus
example:
cat >rules.yml <<'EOF'
groups:
- name: example
rules:
- alert: MyAlert
expr: avg without(instance)(up) < 0.75
for: 2m
labels:
severity: page
annotations:
description: 'Only {{$value}} of {{$labels.job}} job is up'
EOF
为了像之前一样测试它,我们创建一个 test.yml,其中包含以下内容:
rule_files:
- rules.yml
evaluation_interval: 1m
tests:
- interval: 1m
input_series:
- series: 'up{job="node",instance="foo"}'
values: '1+0x10'
- series: 'up{job="node",instance="bar"}'
values: '1+0x5 0+0x5'
- series: 'up{job="prometheus",instance="foo"}'
values: '1+0x10'
alert_rule_test:
- alertname: MyAlert
eval_time: 7m
- alertname: MyAlert
eval_time: 8m
exp_alerts:
- exp_labels:
severity: page
job: node
exp_annotations:
description: 'Only 0.5 of node job is up'
然后您可以再次运行这些测试:
./promtool test rules test.yml
测试结果:
Unit Testing: test.yml
SUCCESS
这里我们测试的是警报,第一个测试在 7 分钟内没有为 MyAlert 触发警报:
alert_rule_test:
- alertname: MyAlert
eval_time: 7m
第二个测试单个警报在 8 分钟内触发,并且它具有所有正确的标签和注释:
- alertname: MyAlert
eval_time: 8m
exp_alerts:
- exp_labels:
severity: page
job: node
exp_annotations:
description: 'Only 0.5 of node job is up'
如果您希望使用相同的警报名称触发更多警报,您可以在 exp_alerts 下列出所有警报。
版权归原作者 lulu的云原生笔记 所有, 如有侵权,请联系我们删除。