为何Prometheus查询瞬时向量时总能返回指定时间戳对应的值?
为什么Prometheus查询瞬时向量总能返回对应now时间的值?
瞬时向量查询示例
当查询Prometheus的瞬时向量process_cpu_seconds_total{instance="localhost:9090"}时,浏览器会发起携带当前时间作为time查询参数的请求:
curl 'http://localhost:9090/api/v1/query?query=process_cpu_seconds_total%7Binstance%3D%22localhost%3A9090%22%7D&time=1700078953.325' \ --compressed
返回结果的时间戳始终与查询参数中的时间一致:
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"process_cpu_seconds_total","instance":"localhost:9090","job":"prometheus"},"value":[1700078953.325,"0.82"]}]}}%
范围向量查询示例
而查询范围向量process_cpu_seconds_total{instance="localhost:9090"}[1m]时,浏览器仍用当前时间作为time参数,但结果中通常不会包含该时间(因指标每15秒抓取一次):
curl 'http://localhost:9090/api/v1/query?query=process_cpu_seconds_total%7Binstance%3D%22localhost%3A9090%22%7D%5B1m%5D&time=1700078953.325' \ --compressed
返回结果:
{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"process_cpu_seconds_total","instance":"localhost:9090","job":"prometheus"},"values":[[1700078900.426,"0.8"],[1700078915.427,"0.8"],[1700078930.388,"0.82"],[1700078945.388,"0.82"]]}]}}%
原因解析
Prometheus处理瞬时向量查询时,采用的是最近样本匹配+插值的逻辑:
- 当你指定
time参数(比如当前时间now)查询瞬时向量时,Prometheus会先定位该时间点前后最近的两个有效样本。如果查询时间点刚好存在抓取到的样本,就直接使用该样本值;如果没有,就通过线性插值计算出对应time时间点的指标值。 - 最终返回结果时,Prometheus会把计算得到的(或直接匹配到的)指标值与你指定的查询时间戳绑定,而不是返回原始样本的时间戳,所以你看到的结果时间戳始终和查询参数中的
time一致。
而范围向量查询的核心是返回指定时间窗口内的原始抓取样本,不会做任何插值计算,只会返回该时间段内实际生成的、符合抓取间隔的样本数据,因此结果里通常不会包含你指定的time参数对应的时间点(除非刚好在那个时间点完成了指标抓取)。
内容的提问来源于stack exchange,提问作者GionJh
相关产品推荐
相关产品推荐

