prometheus:prometheus如何处理数据类型溢出?

Posted

技术标签:

【中文标题】prometheus:prometheus如何处理数据类型溢出?【英文标题】:prometheus: how prometheus handles the data type overflow? 【发布时间】:2018-11-16 00:14:18 【问题描述】:

prometheus 客户端不断更新指标,似乎不考虑溢出。比如计数器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 在抓取此类倒带指标时如何处理这种情况?

【问题讨论】:

【参考方案1】:

Prometheus 旨在处理这样的计数器重置,rate 函数有它的代码。当进程重新启动时,这种情况更常见。

溢出也不太可能发生。即使你以每秒十亿的速度递增,也需要几百年才能溢出。

【讨论】:

histogram 类型的sum 呢?加法可能是任意大值,所以可能会很快溢出sum。 github.com/prometheus/client_golang/blob/master/prometheus/… 类似的逻辑适用,只要您至少每十年重新启动一次应用程序就可以了。

以上是关于prometheus:prometheus如何处理数据类型溢出?的主要内容,如果未能解决你的问题,请参考以下文章

云原生监控告警实战

Prometheus 数据安全之 Basic 认证

如何为多个 Prometheus 数据源配置 Grafana 仪表板?

如何用helm为grafana添加prometheus数据源?

如何用Prometheus监控十万container的Kubernetes集群

Prometheus简介