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 float64
prevValue := values[0]
for i, v := range values {
d := v - prevValue
if 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 = v
values[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,counter,values,https,true,prevValue
From: https://blog.csdn.net/qq_43684922/article/details/137195673