[源码分析] PromQL 中的 rate 与 irate 方法
内容提要
文章介绍为家庭HTTP代理编写Prometheus exporter并配置Grafana监控大盘:用Counter统计请求总数与失败数,用Histogram统计请求耗时,接入Prometheus和Grafana。重点讲解PromQL中rate与irate原理:rate计算区间平均增长率,需外推边界并处理计数器重置;irate仅取最后两个样本,响应更快,适合时效性场景。
延伸解读
rate 的外推机制与计数器重置处理
rate 函数并非简单计算首尾样本差值,而是会进行外推以估算区间边界的真实值。源码显示,它会根据样本平均间隔和边界距离决定外推幅度,但受限于计数器不能为负以及外推阈值。同时,rate 能自动处理计数器重置,例如样本序列 1,2,3,1,2 会被修正为 4,这解释了为何 rate 结果常带小数,也说明它更适合平稳型数据。
irate 的快速响应与适用场景
irate 仅取区间内最后两个样本计算瞬时增长率,因此响应更快,适合对时效性要求高的监控场景。但这也意味着它更容易受单个样本波动影响,可能产生毛刺。源码中,irate 同样处理计数器重置,并将结果除以样本间隔转换为每秒速率。若需观察长期趋势,rate 的平滑效果更佳。
increase 与 rate 的关系及使用选择
increase 计算区间内的总增量,而 rate 是 increase 除以区间秒数得到的每秒增长率。两者共享相同的底层计算逻辑,包括外推和重置处理。在 Grafana 中,对于 Counter 指标,通常使用 rate 或 increase 来查询每分钟请求量。选择时需考虑:rate 适合观察速率变化,increase 适合统计区间总量,而 irate 适合快速响应。
Q&A
PromQL 中 rate 和 irate 函数的主要区别是什么?
rate 计算指定时间范围内的平均增长率,会外推边界并处理计数器重置;irate 仅取最后两个样本计算瞬时增长率,响应更快,适合时效性场景。
为什么 rate 函数计算的结果会出现小数点?
因为 rate 函数会对时间范围的边界进行外推(extrapolate),估算更真实的增长率,导致结果可能不是整数。
rate 函数如何处理计数器重置的情况?
当检测到当前样本值小于前一个样本值时,认为发生了计数器重置,会将前一个样本值加到结果中,以补偿重置造成的计数丢失。
在什么场景下推荐使用 irate 而不是 rate?
当需要快速响应、关注最新变化趋势时推荐使用 irate,因为它只使用最后两个样本,计算速度更快。
rate 函数的外推范围有哪些限制?
外推时不能使计数器值为负,且外推距离受样本平均间隔限制:如果首尾样本距离边界超过平均间隔的1.1倍,则最多外推平均间隔的一半。
如何为 HTTP 代理编写 Prometheus exporter?
使用 Counter 统计请求总数与失败数,使用 Histogram 统计请求耗时,然后暴露 metrics 接口供 Prometheus 拉取。