4 回答

TA貢獻1860條經驗 獲得超8個贊
很簡單,有一個獲取 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()
}

TA貢獻1744條經驗 獲得超4個贊
目前 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)

TA貢獻1802條經驗 獲得超5個贊
可以在官方 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
}
更新:這是一個更通用的版本,適用于向量和直方圖......
// GetMetricValue returns the sum of the Counter metrics associated with the Collector
// e.g. the metric for a non-vector, or the sum of the metrics for vector labels.
// If the metric is a Histogram then number of samples is used.
func GetMetricValue(col prometheus.Collector) float64 {
var total float64
collect(col, func(m dto.Metric) {
if h := m.GetHistogram(); h != nil {
total += float64(h.GetSampleCount())
} else {
total += m.GetCounter().GetValue()
}
})
return total
}
// collect calls the function for each metric associated with the Collector
func collect(col prometheus.Collector, do func(dto.Metric)) {
c := make(chan prometheus.Metric)
go func(c chan prometheus.Metric) {
col.Collect(c)
close(c)
}(c)
for x := range c { // eg range across distinct label vector values
m := dto.Metric{}
_ = x.Write(&m)
do(m)
}
}

TA貢獻1789條經驗 獲得超8個贊
import (
? "github.com/VictoriaMetrics/metrics"
)
var requestsTotal = metrics.NewCounter(`http_requests_total`)
//...
func getRequestsTotal() uint64 {
? return requestsTotal.Get()
}
例如,只需在所需的計數器上調用Get()函數即可。
- 4 回答
- 0 關注
- 339 瀏覽
添加回答
舉報