You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含offset的Prometheus告警单元测试填充历史数据?

Prometheus记录规则加offset后测试失败的问题

我正在测试一条Prometheus记录规则,原本测试能正常跑:

测试文件test_file.yaml内容:

# test_file.yaml
rule_files:
  - "../records.yaml"

evaluation_interval: 1m

group_eval_order:
  - records

tests:
  - name: "Some test"
    interval: 1m
    input_series:
      - series: 'some_metric{somelabel="somevalue"}'
        values: '1+0x144000'

    promql_expr_test:
      - expr: recording_rule:under_test
        exp_samples:
          - labels: recording_rule:under_test{somelabel="somevalue"}
            value: 1

对应的records.yaml内容:

- expr: avg_over_time(some_metric{}[24h:]) > 0
    record: recording_rule:under_test

按预期,这条规则依赖some_metric,测试能通过。但给记录规则加上offset之后:

- expr: avg_over_time(some_metric{}[24h:] offset 1w) > 0
    record: recording_rule:under_test

测试直接失败了。我一开始以为是input_series只生成了当前及以后的数据,而规则需要查过去1周的数据,于是试着把测试查询往未来偏移:

promql_expr_test:
      - expr: recording_rule:under_test offset -1w
        exp_samples:
          - labels: recording_rule:under_test{somelabel="somevalue"}
            value: 1

但没用。我还想给input_series加offset,但语法不允许。


解决办法

问题本质很简单:Prometheus规则测试默认从当前时间开始评估,你加了offset 1w后,规则要查询当前时间往前1周的some_metric数据,但你的测试数据只在当前时间之后存在,那段历史时间根本没数据,规则返回空,测试自然失败。

得调整测试的时间范围,让测试数据覆盖到规则需要查询的历史时段,同时指定规则在合适的时间点评估。

修改后的测试配置示例

调整test_file.yaml,把测试起始时间设为过去1周,同时让测试数据覆盖从过去1周到现在的时段:

# test_file.yaml
rule_files:
  - "../records.yaml"

evaluation_interval: 1m

group_eval_order:
  - records

tests:
  - name: "Test with offset rule"
    interval: 1m
    # 测试从1周前启动,确保offset 1w的查询能命中测试数据
    start_time: 1w-ago
    input_series:
      - series: 'some_metric{somelabel="somevalue"}'
        # 从1周前开始,每分钟生成一个值为1的数据点,持续1周+24小时(共11520分钟)
        values: '1+0*11520'
    # 指定在测试开始后1周(即当前时间)评估规则
    promql_expr_test:
      - expr: recording_rule:under_test
        eval_time: 1w
        exp_samples:
          - labels: recording_rule:under_test{somelabel="somevalue"}
            value: 1

关键调整点

  • start_time: 1w-ago:把测试的时间轴拉到1周前,让offset 1w的查询能落到测试覆盖的时间范围内。
  • 延长测试数据时长:确保从1周前到当前时间之后24小时都有some_metric的数据,满足avg_over_time([24h:])的时间窗口需求。
  • eval_time: 1w:告诉Prometheus在测试启动后的第1周(也就是当前时间)评估规则,这时规则里的offset 1w刚好能查到1周前到1周前+24小时的some_metric数据,规则就能返回预期结果。

这样修改后,测试就能正常通过了。


内容的提问来源于stack exchange,提问作者Federico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:35:07