0


【博客662】prometheus对rule规则和alert规则作单元测试

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 下列出所有警报。


本文转载自: https://blog.csdn.net/qq_43684922/article/details/131209414
版权归原作者 lulu的云原生笔记 所有, 如有侵权,请联系我们删除。

“【博客662】prometheus对rule规则和alert规则作单元测试”的评论:

还没有评论