学习
实践
活动
专区
工具
TVP
写文章
专栏首页颇忒脱的技术博客详解Prometheus range query中的step参数
原创

详解Prometheus range query中的step参数

GH Page地址

Prometheus有两种query:instant queryrange query。本文要讲的就是range query中的step参数。

range query是非常常见的一种query,看看它有哪些参数:

  • query=<string>: PromQL表达式。
  • start=<rfc3339 | unix_timestamp>: 时间范围的开始。
  • end=<rfc3339 | unix_timestamp>: 时间范围的结束。
  • step=<duration | float>: 查询解析度(query resolution)。
  • timeout=<duration>: 执行超时。这个参数是可选的。

在Prometheus expression browser里看到的是这样的:

注意到上图中的Res框里没有给值,没有给的话Prometheus会自动给一个值,这个值在图示右上角可以看到。

step对于查询结果的影响

Prometheues在对PromQL表达式求值的逻辑是这样的(详见这个issue里的回答):

  1. 对于[start, end]时间区间,从start开始,以step为长度,把时间区间分成若干段
  2. 对每个段进行求值

举例:start=10,end=20,step=2,那么就会有ts=10,ts=12,ts=14,ts=16,ts=18,ts=206段,然后为这6个段进行求值。求值方式视乎表达式中Time series selector的类型而定。

PromQL有两种Time series selector:instant vector selectorrange vector selector。下面将分别讲解:

Instant vector selector

形如下面的就是Instant vector selector,x是metric的名字。

x

Prometheus在对每段Instant vector selector求值的逻辑是这样的:

  • 从该段的timestamp(含)往前找,取第一个找到的data point的值。如果有一个data point的timestamp==该段的timestamp,则直接使用该data point。
  • 如果该段timestamp往前的5分钟范围内没有找到任何data point,则该段无值。

下面这张图解释了上面逻辑:

图中的绿点是Prometheus实际存储的数据,按照时间轴从左到右排列。蓝点是根据step参数的求值结果。

当data point间隔比step更大的时候会发生下图这种情况:

可以看到有两个段的求值结果来自于同一个data point。

Range vector selector

形如下面的就是Range vector selector,x是metric的名字,方括号里的是range duration

x[5m]

range vector select返回的是当前timestamp之前的range duration内的所有data point。range vector是不能直接用做绘图的,你得用某些function把range vector转换成instant vector才行,比如rate()

下图解释了是如何对Range vector selector进行分段求值的:

step和rate duration

steprange duration是独立的两个参数,在某些情况下两者的值存在某种限制条件,这里例举rate()来说明。rate()的作用是获得一个range-vector的每秒平均增长率。

如果step=10mrange duration=5m,那么rate在计算的时候会丢失一半的数据,两个分段之间的data point有一半没有被纳入计算。前面那张图就存在数据丢失的情况,有一个data point被漏掉了。

因此在使用rate()时,range duration得大于等于step

而如果是irate(),这个限制则是range duration不得大于step(详见Brian Brazil的Presentation)。

Grafana中的step参数

在Grafana中并没有直接提供step参数,而是这两个参数:min stepresolution文档在这里)。min step故名思义设定的是step的最小值,那么resolution是什么呢?

大家都知道Grafana都是用来画图的,比如下面这张图Y轴是值,X轴则是时间线,因此在X轴方向的每个像素都代表了一个timestamp。

resolution就是用来根据像素来计算step的一个参数。下面用6个像素以及它们的timestamp来说明:

x=1,ts=0; x=2,ts=5; x=3,ts=10; x=4,ts=15; x=5,ts=20; x=6,ts=25
  • resolution=1/1时,那么step就是相邻像素所代表的timestamp的差,即5;
  • resolution=1/2时,那么step就是相隔1个像素的两个像素的timestamp的差,即10;
  • resolution=1/3时,那么step就是相隔2个像素的两个像素的timestamp的差,即15;
  • 以此类推

而每个像素所代表的timestamp受两个因素影响:

  1. 查询所定义的时间范围
  2. Graph的宽度(单位:像素)

所以在Grafana发起的查询中step参数是动态的。其实这也是很合理的,因为只有这样才能够在Graph宽度小的时候绘图更粗糙(即step更大),Graph宽度大的时候绘图更精细(即step更小,但是不能小于min step)。实际发起的请求的step参数你可以在Graph的Query Inspector里看到:

但是我们之前不说过了rate()range duration不能小于step吗?那么把range duration给固定值的化就不太好了,怎么办呢?你可以使用Grafana提供的内置变量$__interval,它代表的Grafana就是计算出来的step的值。比如这样就能够将range durationstep保持一致了(更多内置变量可以见这里):

rate(x[$__interval])

所以,你想自己实验一把

如果你想自己动手实验,但是又苦于无法制造干净的假数据,那么可以参考这篇文章推荐的方法

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • Prometheus监控学习笔记之Prometheus中step或resolution的含义

    在Grafana画板或者Prometheus API文档内,会发现需要传递step或resolution参数,官方文档对此解释的也是语焉不详。

    Jetpropelledsnake21
  • python中的range()函数详解

    在python中range()函数是一个内建函数;这个内建函数用起来还是很方便的,只不过有些细节的地方我在这里写一写!供大家交流!

    用户7886150
  • Python中range()函数的使用详解(python工程狮)

    python鱼霸霸
  • Power Query中批量处理列的函数详解

    Table.TransformColumns(table as table, transformOperations as list, optional def...

    逍遥之
  • Python中的默认参数详解

    py3study
  • Prometheus监控学习笔记之在 HTTP API 中使用 PromQL

    Prometheus 当前稳定的 HTTP API 可以通过 /api/v1 访问。

    Jetpropelledsnake21
  • Prometheus API使用介绍

    做为一位优秀的技术人员,往往能通过对数据的最大化利用来产生更多价值。而Prometheus的监控数据则是可以为我们所用的重要数据,它并不只能用于日常的监控和告警...

    西岸Alex
  • Python调用Prometheus监控数据并计算

    Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数 据库的组合。适合监控docker容器。因为kub...

    钢铁知识库
  • Prometheus 二次开发之 API 接口

    Prometheus在/api/v1的路径下开放了HTTP接口,用户可以通过这些接口进行二次开发。这篇笔记挑选了此次监控平台可能会用到的接口进行解析。

    我是阳明
  • 普罗米修斯 -- HTTP API 调用 PromQL

    Prometheus API 使用了 JSON 格式的响应内容。 当 API 调用成功后将会返回查询结果。所有的 API 请求均使用以下的 JSON 格式:

    TesterHome小助手
  • 啥?Grafana 还能为日志添加告警?

    做过运维的同学都知道,服务的可观测性是一个非常重要的渠道,能够让我们掌控线上服务运行时的状态。一个好的监控系统,其价值在于一旦出现故障能够让我们运维的同学能够快...

    米开朗基杨
  • 关于json.dumps中的参数详解

    如果无任何配置,或者说使用默认配置, 输出的会是中文的ASCII字符吗,而不是真正的中文。 这是因为json.dumps 序列化时对中文默认使用的ascii编码...

    用户8442333
  • 6.Prometheus监控入门之企业监控实战警报发送

    描述: Alertmanager 负责接收来自所有Prometheus服务器的告警,并根据其规则将告警以邮件、聊天信息和呼叫等方式进行通知。

    WeiyiGeek
  • Prometheus 监控体系

    从这个架构图,也可以看出 Prometheus 的主要模块包含, Server, Exporters, Pushgateway, PromQL, Alertma...

    BUG弄潮儿
  • Android AIDL中Map参数传递的问题详解

    AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。

    砸漏
  • 在 AlertManager 报警通知中展示监控图表

    之前用 Python 实现了一个非常简陋的 AlertManager 的钉钉接收器,一直想在钉钉的消息通知中将当前报警图表也展示出来,这样显然对用户来说更加友好...

    我是阳明
  • Prometheus入门

    Prometheus(普罗米修斯)这款开源监控工具,名字和功能一样酷,本文是一个干货入门,动手来部署一个实验环境。用Prometheus+Grafana来监控M...

    麒思妙想
  • 保姆级别的 PromQL 教程

    这篇文章介绍如何使用 PromQL 查询 Prometheus 里面的数据。包括如何使用函数,理解这些函数,Metrics 的逻辑等等,因为看了很多教程试图学习...

    米开朗基杨

扫码关注腾讯云开发者

领取腾讯云代金券