普罗米修斯客户端不断更新指标,似乎不考虑溢出。例如,counsterAdd()
:
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 旨在处理这样的计数器重置,rate
函数具有它的代码。它更常发生在进程重新启动时。
溢出的可能性也很小。即使你每秒增加十亿,也需要几百年才能溢出。