本文主要是介绍【博客708】victoriametrics如何处理counter跳变,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
victoriametrics如何处理counter跳变
背景
监控中我们经常会使用一些counter类型的metrics来计算速率,比如:rate(https_request_total)
但是如果我们的服务突然由于异常导致重启了,那么这时候counter会重新从0开始计算,那么这时候就会有问题,假设我们原来https_request_total是计数到500,然后服务异常重启,启动后https_request_total是0,那么此时如果没有counter跳变的处理,那么rate(https_request_total)就会变成负数,我们期待的是当异常重启后,能够在原来基础上,从500继续计数,但是我们服务又不会记得上一次的值(不是不能处理,其实存下来每次启动读取也能实现,只是不应该把这部分基建层的逻辑侵入到业务里面去),所以就依赖于监控方案来处理!
victoriametrics对counter跳变的处理
counter重置会补上前面的值,同时如果跳变只是一小下,那么补上差值即可,不需要直接加上前一个值:
更多细节的相关issue:https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2787
func removeCounterResets(values []float64) {// There is no need in handling NaNs here, since they are impossible// on values from vmstorage.if len(values) == 0 {return}var correction float64prevValue := values[0]for i, v := range values {d := v - prevValueif d < 0 {if (-d * 8) < prevValue {// This is likely a partial counter reset.// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2787// 这里做了部分reset的优化correction += prevValue - v} else {// 这里叠加了上一个值,也是就在原来基础上继续计算counter// 这就是为什么服务重启后,明明counter变小了,但是对counter进行计算却不会出错的原因 correction += prevValue}}prevValue = vvalues[i] = v + correction}
}
类似的,victoriametrics会自动处理counter的函数:
// rollupFuncsRemoveCounterResets contains functions, which need to call removeCounterResets
// over input samples before calling the corresponding rollup functions.
var rollupFuncsRemoveCounterResets = map[string]bool{"increase": true,"increase_prometheus": true,"increase_pure": true,"irate": true,"rate": true,"rollup_increase": true,"rollup_rate": true,
}
这篇关于【博客708】victoriametrics如何处理counter跳变的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!