prometheus单元测试(unit test)

619 阅读3分钟

官方文档

作用

用于测试prometheus规则

用法

./promtool test rules test1.yml test2.yml test3.yml

单元测试文件格式

# This is the main input for unit testing.
# Only this file is passed as command line argument.

rule_files: # 需要导入进行测试的prometheus规则文件列表
    - alerts.yml

evaluation_interval: 30s # 简单点说就是告警判断轮询器的运行间隔时间
                         # 设置与prometheus同样的值,prometheus默认配置为1分钟

group_eval_order: [] # 告警判断轮询器指令将会根据列表列出的组名顺序,在给定的轮询时间内进行告警计算
                     # 指令仅保证对列表提到的规则组运行计算,不需要在列表中提到所有的组
                     # 通俗的讲就是优先计算列表中的规则组,只要计算时间不超过轮询时间
                     # (evaluation_interval)则会计算所有的规则组,所以只要把主要测试的重要规则组列出
                     # 优先计算即可,不列出也可以,前提是规则判断时间不超过evaluation_interval

tests:  # 单元测试
    # Test 1.
    - interval: 1m  # 数据抓取间隔,也就是values中每个数据点的间隔时间,会与规则中的for pending时间共
                    # 同作用
      # Series data.
      input_series: # 模拟数据输入,输入的时间序列名称和数值。所有后面test_case中用到的数据一次性输入
                    # 从0秒开始,空格分隔,一个空格两边的数值时间差为interval=1m
          - series: 'up{job="prometheus", instance="localhost:9090"}'  # 表达式固定标签与下面
                                                                       # exp_labels中标签对应
            values: '0 0 0 0 0' # 5个点,间隔4个interval;也可以用0+0x5表示。多个值的表示方法为:
                                # 'a+bxc' 等于 'a a+b a+(2*b) a+(3*b) … a+(c*b)'
                                # 'a-bxc' 等于 'a a-b a-(2*b) a-(3*b) … a-(c*b)'
                                # value+0xn,比如"0+0x2 1+0x2"表示"0 0 1 1",数值较多时可用此方式
                                # '_' 表示丢失的样本
                                # 'stale' 表示腐败的样本
                                # Examples:
                                #     1. '-2+4x3' becomes '-2 2 6 10'
                                #     2. ' 1-2x4' becomes '1 -1 -3 -5 -7'
                                #     3. ' 1 _x3 stale' becomes '1 _ _ _ stale'
                                # 自动向后延续5分钟的数据点
          - 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

      # Unit test for alerting rules.
      alert_rule_test: # <alert_test_case>告警规则的单元测试。
                       # 使用前面的input数据作为数据输入来判断告警。
                       # 表示期望得到的告警信息,当此单元中的告警信息与alerts.yml中的告警
                       # 信息完全一致,说明测试通过。
                       # Prometheus允许对不同的警报规则使用相同的alertname。因此,在这个单元测试中,
                       # 您必须在一个<alert_test_case>下列出alertname的所有触发警报的联合。
          # Unit test 1.
          - eval_time: 5m  # 检查告警的时间,就是从第一次告警轮询结束,等待多久检查告警是否出现
            alertname: InstanceDown
            exp_alerts:    # 如果是测试不告警,则留空
                # Alert 1.
                - exp_labels:    # 包含标签,不包含__name__和alertname
                      severity: page
                      instance: localhost:9090
                      job: prometheus
                  exp_annotations:    # 包含注释,不包含__name__和alertname
                      summary: "Instance localhost:9090 down"
                      description: "localhost:9090 of job prometheus has been down for more than 5 minutes."
      Unit tests for promql expressions.
      promql_expr_test: # PromQL表达式的单元测试,单独的case,包含表达式和期望得到的结果
          # Unit test 1.
          - expr: go_goroutines > 5    # 表达式,使用此表达式用input_series里的数据进行计算
                                       # 得出结果后,与exp_samples中的数据进行比对,相同则成功
            eval_time: 4m              # 同前面的eval_time
            exp_samples:               # 期望得到的结果时间序列
                # Sample 1.
                - labels: 'go_goroutines{job="prometheus",instance="localhost:9090"}'
                  value: 50
                # Sample 2.
                - labels: 'go_goroutines{job="node_exporter",instance="localhost:9100"}'
                  value: 50