prometheus中step或resolution的含义

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),直到遇到第一个采样值)。

 (这个就对了)
 

完!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值