Prometheus 计数器:如何使用 golang 客户端获取当前值?

Pri*_*rii 5 go prometheus

我正在使用计数器来计算请求的数量。有没有办法获得普罗米修斯计数器的当前值?

我的目标是重用现有计数器而不分配另一个变量。

Golang prometheus 客户端版本为 1.1.0。

Dee*_*mal 12

很简单,有一个获取 Prometheus 计数器值的函数


import (
    "github.com/prometheus/client_golang/prometheus"
    dto "github.com/prometheus/client_model/go"
    "github.com/prometheus/common/log"
)

func GetCounterValue(metric *prometheus.CounterVec) float64 {
    var m = &dto.Metric{}
    if err := metric.WithLabelValues("label1", "label2").Write(m); err != nil {
        log.Error(err)
        return 0
    }
    return m.Counter.GetValue()
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*bez 5

目前 Golang 官方实现中还没有办法获取计数器的值。

您还可以通过增加自己的计数器并使用CounterFunc来收集它来避免重复计数。

注意:使用整型并atomic避免并发访问问题

// declare the counter as unsigned int
var requestsCounter uint64 = 0

// register counter in Prometheus collector
prometheus.MustRegister(prometheus.NewCounterFunc(
    prometheus.CounterOpts{
        Name: "requests_total",
        Help: "Counts number of requests",
    },
    func() float64 {
        return float64(atomic.LoadUint64(&requestsCounter))
    }))

// somewhere in your code
atomic.AddUint64(&requestsCounter, 1)
Run Code Online (Sandbox Code Playgroud)