如何为含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
相关产品推荐
相关产品推荐

