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

时间:2019-09-16 08:05:50

标签: go prometheus

我正在使用计数器来计算请求数。有什么方法可以获取普罗米修斯计数器的当前值?

我的目的是在不分配其他变量的情况下重用现有计数器。

Golang prometheus客户端版本为1.1.0。

3 个答案:

答案 0 :(得分:2)

很容易,具有获取普罗米修斯计数器值的功能


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()
}

答案 1 :(得分:1)

目前,在官方的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)

答案 2 :(得分:0)

可以在官方的Golang实现中读取计数器(或任何度量)的值。我不确定何时添加。

这对我有用:

func getMetricValue(col prometheus.Collector) float64 {
    c := make(chan prometheus.Metric, 1) // 1 for metric with no vector
    col.Collect(c)      // collect current metric value into the channel
    m := dto.Metric{}
    _ = (<-c).Write(&m) // read metric value from the channel
    return *m.Counter.Value
}