PromQL求和问题:为何count by聚合结果求和无法得到预期值
PromQL求和问题解决思路
问题根源
你用sum(count(max(http_response_result_code{} > 0 )) by (name))得不到预期的2,是因为sum()函数的作用是对同一时间戳下不同name维度的值求和。而你看到的查询结果是两个不同时间戳的单值(每个时间戳对应一个name的统计结果),所以每个时间戳的sum结果还是1,自然无法得到跨时间戳的总和2。
分场景解决办法
场景1:累加所有时间范围内的结果值(比如统计时间段内总次数)
要把不同时间戳的结果加起来,需要用sum_over_time()函数,它能对指定时间范围内的序列值做累加。示例如下:
sum(sum_over_time(count(max(http_response_result_code{} > 0)) by (name)[1d:]))
[1d:]表示取过去1天的范围向量(可根据实际需求调整时间范围,比如[2h:]代表过去2小时)sum_over_time()会把每个name对应的序列在这段时间内的所有值累加- 外层的
sum()再将所有name的累加结果汇总,得到总数值
场景2:同一时间戳下多个name的统计值求和
如果你的需求是统计同一时间点下,所有name的http_response_result_code>0相关计数总和,那可以简化原查询逻辑:
- 直接统计所有满足条件的样本总数:
count(http_response_result_code{} > 0) - 或者保留按name分组再求和的逻辑:
注:原查询里的sum(count(http_response_result_code{} > 0) by (name))max()是多余的——http_response_result_code{} > 0已经过滤掉了<=0的样本,直接对这些样本按name计数再求和即可。
内容的提问来源于stack exchange,提问作者user22343159
相关产品推荐
相关产品推荐

