背景
前几天朋友问了我这样一个问题: 为什么收集的数据(counter 类型),使用 query_range 查询来显示最近一周每日数据增涨的时候,唯独缺少最后一天的数据,但将查询结束时间(end)增加 1s 后就能显示?
这里我们用http_requests_total来表示收集到的数据,经仔细了解后,发现朋友使用的是类似 的 PromQL,并且将 query_range 时间范围设置为:start=周一的 00:00,end = 周日的 23:59:59,看上去没有问题,但为什么会出现上面的问题呢?
排查思路
首先我们来了解下 Prometheus 对于( v range-vector) 范围查询的实现原理,以 v2.2 为例(参考源码:https://git.io/fCxtw):
计算总共返回的数据个数:
通过 来循环获取每个点的数据
回到这个例子,一开始返回的数据点个数为: , 当将 end 添加 1 秒后,start-end 恰好就是 604800,再除上步长 1d,所以刚好是 7个点,也就可以成功显示最后一天数据了。
学到什么
通过这个例子,我们可以学到:
PromQL 的范围查询的实现逻辑。
当我们统计 Counter 数据在某个时刻的增量情况,例如这里的每日请求数,更推荐使用 increase,而不是 delta,具体可以参见链接:https://prometheus.io/docs/prometheus/latest/querying/functions/#increase。
ps: 最后如果你对内容感兴趣,请加入我们的知识星球:
领取专属 10元无门槛券
私享最新 技术干货