prometheus官方文档对resolution的解释真是语焉不详,只有下面寥寥几句话
Querying examples | Prometheus
Subquery
Return the 5-minute rate of the
http_requests_total
metric for the past 30 minutes, with a resolution of 1 minute.rate(http_requests_total[5m])[30m:1m]
由于官方文档的缺失,想了解也无从看起。网上有两篇文章解释的比较清楚:
https://chanjarster.github.io/post/p8s-step-param/
Document more details about query execution · Issue #699 · prometheus/docs · GitHub
但,还不够清楚,所以,我再来详细解释下。step和resolution是一个意思,下面我使用step
一:step对谁起作用?
只对range query起作用。
1. instant query时,无需step。instant query求值时就使用一个时刻点。当前时刻点或通过API查询时的自定义时刻点。
2. range query时,step是有用的。先定出时刻点,然后,立足于定出的时刻点,向过去回溯,使用最先遇到的第一个采样值。
二:step如何起作用?
在每一个时刻点上,使用该时刻点上(如果存在)的采样值,或回溯到过去,使用最先遇到第一个采样值。注意几点:
1. 每一个 “step应该停顿的时刻点”,总是会返回一个采样值的。
即使 (向过去回溯时,多个 “step应该停顿的时刻点” ,遇到的是identical sample),也总是返回这个identical sample的采样值。
啥时候会有这种情况呢?两个采样就能够跨好几个step(step灰常灰常小)。此时,就得到很多相同的采样值。
2. 例外是:
立足于“step应该停顿的时刻点” 向过去回溯时,最多回溯5min(promql.LookbackDelta = 5 * time.Minute),超过这个时长就不返回采样值啦。
向过去回溯时,如果存在一个显式的staleness marker,也就不返回采样值啦。
三:step起作用的例子
假设我们的时序为X,X如下图所示,即:
我们用 点的起始 表示点本身,0, 1, 2...是时刻点,即t0, t1, t2...,时刻点16用t16表示,时刻点16尚未开始。时刻点上面的方框内存储的是采样值(没有值则说明无采样值)。
如果step==5,那么X[15s:5s]应该返回什么呢?
首先,找到每一个 “step应该停顿的时刻点”,怎么找呢?15s,向最遥远的过去回溯,总共回溯15s即抵达了 t0,然后,按5s的长度进行分割,该例中,“step应该停顿的时刻点” 为:t0, t5, t10, t15
再者,在每一个“step应该停顿的时刻点”上,向过去回溯,于是X[15s:5s]为:
(t0, 不存在。立足于 定出的时刻点t0 再向过去回溯最多5min,5min内,找到就有,找不到就没有。t0再向过去回溯,没东西了,所以,没有就是没有。)
(t5, 4)
(t10, 7)
(t15, 15)
四:解释这三个表达式
http_requests_total{job="prometheus"} offset 1w
以上,结果为 instant vector。即:从当前时刻,向过去回溯1w,取那个时刻点的 “名字为http_requests_total且label job为prometheus” 的 每一个time series的 单一一个采样。
http_requests_total{job="prometheus"}[10m] offset 1w
以上,结果为 range vector。从当前时刻,向过去回溯1w,从那个时刻起再回溯10min,取这10min之内的 “名字为http_requests_total且label job为prometheus”的 每一个time series的 “每一个”采样。
(不对喽,不是“每一个”采样。事实上,此时使用了全局的step或resolution,应该是15s,然后,就和下面一条一样啦)
http_requests_total{job="prometheus"}[10m:22s] offset 1w
以上,结果为 range vector。从当前时刻,向过去回溯1w,从那个时刻起再回溯10min,取这10min之内的 “名字为http_requests_total且label job为prometheus” 的 每一个time series的采样。
怎么取采样呢?这么取:
step或resolution为22s,于是,把10min,从最遥远的过去开始,按22s的长度进行分割,得到 每一个 “step应该停顿的时刻点”,对于每一个点,使用该时刻点上(如果存在)的采样值,或,向过去回溯,使用最先遇到第一个采样值(回溯时,如果自己step区间内没找到值,则一直向过去回溯(最多5min),直到遇到第一个采样值)。
(这个就对了)
完!