prometheus客户端不断更新指标,似乎不考虑溢出。例如,counster Add()
:
func (c *counter) Add(v float64) {
if v < 0 {
panic(errors.New("counter cannot decrease in value"))
}
ival := uint64(v)
if float64(ival) == v {
atomic.AddUint64(&c.valInt, ival)
return
}
for {
oldBits := atomic.LoadUint64(&c.valBits)
newBits := math.Float64bits(math.Float64frombits(oldBits) + v)
if atomic.CompareAndSwapUint64(&c.valBits, oldBits, newBits) {
return
}
}
}
c.valInt
会溢出并从0开始缠绕。
prometheus如何在处理这种情况时处理这种情况?
答案 0 :(得分:1)
Prometheus旨在处理这样的计数器重置,rate
函数具有代码。当进程重新启动时更常见。
溢出也不大可能。即使你每秒增加十亿,也需要几百年才能溢出。