一个会不定时重置的自增 counter,如何在 Grafana 上展示一段时间内的变化量呢?

Prometheus 提供了一个强大的内置函数 increase() 可以自适应 counter 的重置和丢点。在 Grafana 上选择 Stat 可视化,计算方式选择 Total,配合 increase 使用就可以计算一个预估的变化量了。

但 increase() 函数是需要一个 range-vector 参数的。Grafana 自带的代码补全提示有 $__interval$__rate_interval 这两个变量,哪个更适合计算变化量呢?结论是,直接使用都不适合。原因参考这篇 $__rate_interval 的介绍文章。

$__rate_interval 适合曲线图展示的 rate(),可以利用 moving average 提供一个更细粒度的增速预估。但由于它的值是不固定的且一定大于 $__interval,在 Grafana 中我们又是按每个 $__interval 计算 increase() 的值求和的,导致总和会计算进 $__rate_interval - $__interval 这部分多余的时间。

$__rate_interval: max($__interval + Scrape interval, 4 * Scrape interval)

那么是不是直接用 $__interval 作为 range-vector 就可以了呢?并不。从上面那篇文章可以看出为了计算出准确的 rate() 或 increase(),参数里的时间范围至少要是采样间隔的4倍。所以我们还需要配置 Min step 为 Scrape interval * 4,大功告成。