prometheus官方文档对resolution的解释真是语焉不详,只有下面寥寥几句话
https://prometheus.io/docs/prometheus/latest/querying/examples/
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://blog.csdn.net/weixin_33778778/article/details/88705246
https://github.com/prometheus/docs/issues/699
但,还不够清楚,所以,我再来详细解释下。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...是时刻点,时刻点上面的方框中是存储的采样值(没有值的说明无采样值)
如果step==5,那么X[15s:5s]应该返回什么呢?
首先,找到每一个 “step应该停顿的时刻点”,该例中,“step应该停顿的时刻点” 为:t0, t5, t10, t15
再者,在每一个“step应该停顿的时刻点”上,向过去回溯,于是,我们得到X[15s:5s]:
(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),直到遇到第一个采样值)。
(这个就对了)
完!