PromQL 如何计算变化(率)

Table of Contents

Counter(计数器) 是 Prometheus 四种指标类型(metric type)之一,该指标特点是值会一直增加,代表积累的数量。应对诸如此类的问题:一共有多少请求处理过?花了多长时间处理请求?对于 Counter,由于是单调递增的积累量,直接使用是没有太大的意义,我们更关心 Counter 指标在一段时间内的变化量,或者是变化率。

PromQL 有三个常见的函数和变化(率)相关,分别是:increase()rate()irate()

increase

increase(v range-vector),参数 v 是一个区间向量。该函数计算的结果是该区间的增长量。如:

increase(node_cpu_seconds_total{instance="172.22.21.143:9100", cpu="0", mode="idle"}[2m])

上述查询表示,主机 172.22.21.143 的第 0 个 CPU 在过去 2 分钟时间里,idle 状态所占时长为 81.05s。

需要注意的是,像 http_requests_total 这样的 Counter 指标,返回的是 http 请求总数量,该值一定是一个大于等于 0 的整数。但是使用 increase 函数后,返回一段时间的增量值,该值可能不是整数,而是一个小数,原因是如果查询区间的时间与采样时间不重合,没有办法拿到准确的值。Prometheus 的策略会根据范围内的样本点的值进行线性估算,该方法学名是线性外插(Linear Exrapolation),就可能会产生小数。该策略不仅用于 increase 函数,还用于 delta 和 rate 函数。

rate

rate(v range-vector),可以直接计算区间向量在时间窗口内平均变化率。对于快速变化的 Counter,如果使用 rate,因为其计算的是平均变化率,很容易把峰值削平。除非我们把时间间隔设置的足够小,才能够减弱这种效应。

irate

irate(v range-vector),同样用于计算区间向量的变化率,但是其表示的是瞬时增长率。会取最后两个样本值计算瞬时变化率。所以相比较 rate 具有更高的灵敏度。

参考