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

news/2024/5/19 1:58:13 标签: prometheus, 单元测试, linux, golang, 开发语言

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


http://www.niftyadmin.cn/n/432804.html

相关文章

记录配置vue项目开发环境的几个小坑

在一台新电脑上面&#xff0c;跑之前的vue项目&#xff0c;安装了nodejs 版本v12.13.1&#xff0c;自带的npm版本是v6.12.1&#xff0c;一开始跑不起来&#xff0c;查资料解决了&#xff0c;记录一下问题 1、配置环境变量 path D:\nodejs\node_global path D:\nodejs\node_ca…

Hyper-V管理器无法连接到服务器,Hyper-V主机计算服务无法打开,vmcompute.exe应用程序无法正常启动(0xc0000606)的一种解决方法

Hyper-V无法连接到服务器&#xff0c;发现Hyper-V主机计算服务打不开&#xff0c;然后找到“C:\WINDOWS\System32\vmcompute.exe”&#xff0c;双击报错0xc0000606&#xff0c;用Microsoft 错误查找工具找到是程序不支持“控制流保护&#xff08;CFG&#xff09;”&#xff0c;…

绝版功能回归,Win11开始向Win7进化了

如果将 Win11 上架到 Steam 提供评论打分&#xff0c;那么 Win11 会和很多有争议的游戏一样&#xff1a;褒贬不一。 许多功能是吸引人的&#xff0c;但微软总会在什么时候突然给你一击。 前有 VBS 影响性能、谜之卡顿&#xff0c;后有各种广告、自动安装微软电脑管家。 以及我…

《实战AI低代码》AI大模型在低代码开发项目管理中的实战经验总结

目录 一、WBS任务分解 二、知识库自动生成 三、实施风险预估 随着ChatGPT大火之后,新的AI技术和模型被证明已经具备的很高的使用价值。 诸如Copilot、Midjourney、notion等产品通过AI的加持,已经让用户能够充分地在应用层面感受到了便利性。 原本几天的工作通过AI模型,可…

MySQL - 第0节 - MySQL在Centos 7环境安装

1.安装前说明 • 安装与卸载过程中&#xff0c;用户全部切换成为root&#xff0c;一旦安装&#xff0c;普通用户也能够使用。 • 初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使用root进行&#xff0c;后面学了用户管理&#xff0c;再考虑新建普通用户。 注&#…

python mitmproxy抓包库

一.简介 mitmproxy是一款用Python编写的支持HTTP(S)的中间人代理工具。它可以拦截、查看、修改、重放和保存HTTP/HTTPS流量 &#xff0c;支持命令行界面和图形界面&#xff0c;可用于安全测试、网络调试、API开发和反向工程等场景。mitmproxy具有很高的灵活性和扩展性&#xf…

springcloud-Nacos临时实例永久实例

临时实例和永久实例的区别 临时实例智慧临时存在于注册中心&#xff0c;会在服务下限或服务不可用时被踢出。 临时实例会与注册中心保持心跳&#xff0c;注册中心在一段时间没有收到实例的心跳后&#xff0c;将实例设置为不健康&#xff0c;然后再一段时间后剔除 永久实例再删…

python设置redis 过期的key的两种方式

expire() 在Redis中设置过期的key可以使用expire()方法&#xff0c;该方法需要传入两个参数&#xff0c;第一个参数是要设置过期时间的key&#xff0c;第二个参数是过期时间&#xff0c;单位为秒。例如&#xff1a; import redis# 连接到Redis数据库 r redis.Redis(hostloca…