Rate用于计算变化率的最常见函数是 rate(),rate() 函数用于计算在指定时间范围内计数器每秒增加量的平均值。

通常来说直接绘制一个原始的 Counter 类型的指标数据用处不大,因为它们会一直增加,一般来说是不会去直接关心这个数值的,因为 Counter 一旦重置,总计数就没有意义了,比如我们直接执行下面的查询语句:

demo_api_request_duration_seconds_count{job="demo"} 

可以得到下图所示的图形:

可以看到所有的都是不断增长的,一般来说我们更想要知道的是 Counter 指标的变化率,PromQL 提供了不同的函数来计算变化率。

rate

用于计算变化率的最常见函数是 rate(),rate() 函数用于计算在指定时间范围内计数器每秒增加量的平均值。因为是计算一个时间范围内的平均值,所以我们需要在序列选择器之后添加一个范围选择器。

例如我们要计算 demo_api_request_duration_seconds_count 在最近五分钟内的每秒平均变化率,则可以使用下面的查询语句:

rate(demo_api_request_duration_seconds_count[5m]) 

可以得到如下所示的图形:

现在绘制的图形看起来显然更加有意义了,进行 rate 计算的时候是选择指定时间范围下的第一和最后一个样本进行计算,下图是表示瞬时计算的计算方式:

往往我们需要的是绘制一个图形,那么就需要进行区间查询,指定一个时间范围内进行多次计算,将结果串联起来形成一个图形:

对于 rate() 和相关函数有几个需要说明的:

  • 当被抓取指标进的程重启时,Counter 指标可能会重置为 0,但 rate() 函数会自动处理这个问题,它会假设 Counter 指标的值只要是减少了就认为是被重置了,然后它可以调整后续的样本,例如,如果时间序列的值为[5,10,4,6],则将其视为[5,10,14,16]。
  • 变化率是从指定的时间范围下包含的样本进行计算的,需要注意的是这个时间窗口的边界并不一定就是一个样本数据,可能会不完全对齐,所以,即使对于每次都是增加整数的 Counter,也可能计算结果是非整数。

另外我们需要注意当把 rate() 与一个聚合运算符(例如 sum())或一个随时间聚合的函数(任何以 _over_time 结尾的函数)结合起来使用时,总是先取用 rate() 函数,然后再进行聚合,否则,当你的目标重新启动时,rate() 函数无法检测到 Counter 的重置。

注意:rate() 函数需要在指定窗口下至少有两个样本才能计算输出。一般来说,比较好的做法是选择范围窗口大小至少是抓取间隔的4倍,这样即使在遇到窗口对齐或抓取故障时也有可以使用的样本进行计算,例如,对于 1 分钟的抓取间隔,你可以使用 4 分钟的 Rate 计算,但是通常将其四舍五入为 5 分钟。所以如果使用 query_range 区间查询,例如在绘图中,那么范围应该至少是步长的大小,否则会丢失一些数据。

irate

由于使用 rate 或者 increase 函数去计算样本的平均增长速率,容易陷入长尾问题当中,其无法反应在时间窗口内样本数据的突发变化。

例如,对于主机而言在 2 分钟的时间窗口内,可能在某一个由于访问量或者其它问题导致 CPU 占用 100%的情况,但是通过计算在时间窗口内的平均增长率却无法反应出该问题。

为了解决该问题,PromQL 提供了另外一个灵敏度更高的函数irate(v range-vector)。irate 同样用于计算区间向量的计算率,但是其反应出的是瞬时增长率。

irate 函数是通过区间向量中最后两个样本数据来计算区间向量的增长速率。这种方式可以避免在时间窗口范围内的长尾问题,并且体现出更好的灵敏度,通过 irate 函数绘制的图标能够更好的反应样本数据的瞬时变化状态。那既然是使用最后两个点计算,那为什么还要指定类似于 [1m] 的时间范围呢?这个 [1m] 不是用来计算的,irate 在计算的时候会最多向前在 [1m] 范围内找点,如果超过 [1m] 没有找到数据点,这个点的计算就放弃了。

由于 rate() 提供了更平滑的结果,因此在长期趋势分析或者告警中更推荐使用 rate 函数,因为当速率只出现一个短暂的峰值时,不应该触发该报警。

使用 irate() 函数上面的表达式会出现一些短暂下降的图形:

除了计算每秒速率,你还可以使用 increase() 函数查询指定时间范围内的总增量,它基本上相当于速率乘以时间范围选择器中的秒数:

increase(demo_api_request_duration_seconds_count{job="demo"}[1h]) 

比如上面表达式的结果和使用 rate() 函数计算的结果整体图形趋势都是一样的,只是 Y 轴的数据不一样而已,一个表示数量,一个表示百分比。rate()、irate() 和 increase() 函数只能输出非负值的结果,对于跟踪一个可以上升或下降的值的指标(如温度、内存或磁盘空间),可以使用 delta() 和 deriv() 函数来代替。

deriv() 函数可以计算一个区间向量中各个时间序列二阶导数,使用简单线性回归,deriv(v range-vector) 的参数是一个区间向量,返回一个瞬时向量,这个函数一般只用在 Gauge 类型的时间序列上。例如,要计算在 15 分钟的窗口下,每秒钟磁盘使用量上升或下降了多少:

还有另外一个 predict_linear() 函数可以预测一个 Gauge 类型的指标在未来指定一段时间内的值,例如我们可以根据过去 15 分钟的变化情况,来预测一个小时后的磁盘使用量是多少,可以用如下所示的表达式来查询:

predict_linear(demo_disk_usage_bytes{job="demo"}[15m], 3600) 

这个函数可以用于报警,告诉我们磁盘是否会在几个小时候内用完。

Rate 函数在PromQL 查询中的使用相关推荐

  1. mysql sql decode函数用法_SQL查询中DECODE函数和CASE WHEN 比较

    一,DECODE函数 其基本语法为: Sql代码DECODE(value, if1, then1, if2, then2, if3, then3,...ifn, thenn, else) DECODE ...

  2. java 匹配mysql按钮_使用Java在mysql查询中设置匹配函数

    我有以下在java中查询(mysql)的摘录: queryGeral.append("FROM product p, fabricante_product fp, fabricante f, ...

  3. pythoncast函数用法_数据库中cast函数

    SQL Server 中随机函数应用举例 最近工作中要随机生成一些数据,基本上全是通过rand()函数来完成.下面以几个例子做下简单说明. 1.生成年龄 思路:年龄一般为0-100岁,只要以当时日期为 ...

  4. PromQL 平均增长率 rate 函数 瞬时增长率 irate函数 只针对counter指标类型

    计算Counter指标增长率 我们知道Counter类型的监控指标其特点是只增不减,在没有发生重置(如服务器重启,应用重启)的情况下其样本值应该是不断增大的.为了能够更直观的表示样本数据的变化剧烈情况 ...

  5. Oracle取排序的第五条数据,OVER(PARTITION BY)函数介绍 【oracle中按A分组按B排序,再取B中第一条数据的查询】...

    目录 一.小案例: school表中有①id 序号②class 班级 ③score成绩 三个字段, 使用oracle实现按照班级分区,然后取班级中的第一名. 1.1测试数据如下: --创建学校表sch ...

  6. oracle中in函数在子查询使用,Oracle In

    oracle函数 的 Oracle In 在本教程中,您将学习如何使用Oracle IN运算符来确定值是否与列表或子查询中的任何值相匹配. Oracle IN操作符介绍 Oracle IN运算符确定值 ...

  7. MySQL查询中常用的函数

    MySQL函数 数学函数 绝对值函数ABS(x) ABS(x)返回x的绝对值 SELECT ABS(字段名) FROM 表名; 圆周率的函数PI() SELECT PI(); PI()返回圆周率的值, ...

  8. Access查询中如何调用自定义函数

    今天我们给大家分享一下Access查询中调用自定义函数. 在Access的查询中可以直接调用自定义函数,可以帮助我们解决实际工作中一些特殊的查询统计. 接下来,小编用一个网友的问题来教大家调用,我们来 ...

  9. Prometheus运维二 安装部署Prometheus及使用PromQL查询监控数据

    1,安装部署. 1,环境准备. 软件包下载地址:https://prometheus.io/download/ 地址 规划/软件包 192.168.0.10 Prometheus Server 192 ...

  10. php mql获取结果集,promql查询表达式

    Basics 即时矢量选择器 =:匹配与标签相等的内容 !=:不匹配与标签相等的内容 =~: 根据正则表达式匹配与标签符合的内容 !~:根据正则表达式不匹配与标签符合的内容 示例: http_requ ...

最新文章

  1. [译] iOS 开发之新版 APNs 搭建必备知识
  2. golang函数多值返回示例
  3. 多亏了这篇文章,我的开发效率远远领先于我的同事
  4. java中Excel转图片实现
  5. oracle 数据库备份脚本
  6. 二元函数泰勒公式例题_泰勒公式与函数展开的操作方法
  7. 【一】情感对话 Towards Emotional Support Dialog Systems 论文阅读
  8. 2017年十本必读的大数据人工智能领域书籍,你都读过吗?
  9. MySQL(更新中)
  10. 【maven】maven是什么?maven安装及idea中使用maven
  11. 基本功short与Unsigned short以及Java基本类型
  12. Megacli常用命令汇总
  13. Steven-Java-运算符号(简单)
  14. 分享十个预加载功能生成器
  15. 投资收购微盟、博易智软后,要做中国Salesforce+ Palantir的天马股份再发智能商业π型战略
  16. 7天掌握NIO和SOCKET,第三天,CharBuffer的API使用
  17. EAS 销售出库单上的部门 显示规则
  18. 【vue】封装带有输入推荐和语法高亮的编辑器
  19. php性能极限,利用autobench测试web服务器极限并发数
  20. C语言程序设计 参考书籍

热门文章

  1. aspcms用mysql_aspcms分类列表调用的几个实例
  2. c语言双向循环链表存储长整型,湖南工程学院15级C语言课程设计报告.doc
  3. Django model select获取数据详细讲解
  4. m180n 如何设置网络打印_「hp彩色打印机」惠普m180n打印机怎么设置彩色打印? - seo实验室...
  5. Linux下的图片编辑软件和画图软件
  6. linux连接交换机命令,Linux连接路由器交换机防火墙Console接口的5个实用命令
  7. 网页前端第五次培训(JS的一些基本使用)
  8. java微信提现_关于Java调用微信、支付宝支付提现
  9. cd命令远程连接linux服务器,Linux常用命令(5)--SSH访问远程服务器、SCP服务器间文件拷贝...
  10. Stata | 连续变量to类别变量