为何我的Prometheus规则测试无法匹配预期值?
问题原因:浮点数精度误差
你的测试失败核心原因是二进制浮点数的精度限制,导致生成的样本值并非精确的0.2,和预期值不匹配。
具体分析
- 输入序列
0.0+0.01x30的逻辑是从0.0开始,每隔1分钟生成一个样本,每次递增0.01,共30个样本。 - 0.01在二进制浮点数中无法精确表示(类似十进制中1/3无法写成有限小数),累加20次后得到的结果是一个接近0.2的近似值(比如
0.20000000000000004或0.19999999999999996),而非精确的0.2。 - Prometheus的规则测试中,
exp_samples的value默认是精确匹配,所以预期的0.2和实际生成的近似值不相等,导致测试失败。
解决办法
你可以通过以下几种方式修复这个问题:
用整数序列避免精度问题:将数值放大为整数,规则中再做除法转换。比如修改输入序列和预期值:
input_series: - series: 'total' values: '0+1x30 30-1x30' promql_expr_test: - expr: total / 100 eval_time: 20m exp_samples: - labels: 'total' value: 0.2使用近似匹配:通过
comparator和epsilon字段允许一定的误差范围:promql_expr_test: - expr: total eval_time: 20m exp_samples: - labels: 'total' value: 0.2 comparator: "~" epsilon: 0.0001直接使用实际近似值:将预期值替换为浮点数计算后的实际结果(比如
0.20000000000000004)。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

