变化率
通常来说直接绘制一个原始的 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 计算的时候是选择指定时间范围下的第一和最后一个样本进行计算,下图是表示瞬时计算的计算方式:(现在时间点样本值是166,往回推一分钟,假设一分钟内有6个样本数据,当前去计算的时候就是当前时间点样本值和一分钟前时间点样本值之间差值,然后一分钟时长,相除就是当前这个点的变化率)
这些table展示的都是瞬时的向量
往往我们需要的是绘制一个图形,那么就需要进行区间查询,指定一个时间范围内进行多次计算,将结果串联起来形成一个图形:graph展示的是区间向量
对于 rate()
和相关函数有几个需要说明的:
- 当被抓取指标进的程重启时,
Counter
指标可能会重置为 0,但rate()
函数会自动处理这个问题,它会假设Counter
指标的值只要是减少了就认为是被重置了,然后它可以调整后续的样本,例如,如果时间序列的值为[5,10,4,6]
,则将其视为[5,10,14,16](会将前面的值加上)
。 - 变化率是从指定的时间范围下包含的样本进行计算的,需要注意的是这个时间窗口的边界并不一定就是一个样本数据,可能会不完全对齐,所以,即使对于每次都是增加整数的
Counter
,也可能计算结果是非整数。
另外我们需要注意当把 rate()
与一个聚合运算符(例如 sum()
)或一个随时间聚合的函数(任何以 _over_time
结尾的函数)结合起来使用时,总是先取用 rate()
函数,然后再进行聚合,否则,当你的目标重新启动时,rate()
函数无法检测到 Counter 的重置。(因为对于counter来说数值可能是被重置了,要先用rate对其进行修复,sum对值不会进行处理,所以先去用rate进行计算,再使用sum去聚合)