You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/07/17 15:58:28 UTC

[dubbo-go] branch 3.0 updated: Fix: fix bug when creating metrics objects concurrently (#1961)

This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 2f8dc5af4 Fix: fix bug when creating metrics objects concurrently (#1961)
2f8dc5af4 is described below

commit 2f8dc5af47ecbc3088fa3842909f162c784ace93
Author: Yepeng Zhang <42...@users.noreply.github.com>
AuthorDate: Sun Jul 17 23:58:22 2022 +0800

    Fix: fix bug when creating metrics objects concurrently (#1961)
    
    * fix: fix bug when creating metrics objects concurrently
    
    * rename variable names of metrics
---
 metrics/prometheus/reporter.go | 84 ++++++++++++++++++++++++++++++------------
 1 file changed, 60 insertions(+), 24 deletions(-)

diff --git a/metrics/prometheus/reporter.go b/metrics/prometheus/reporter.go
index 231a2c883..9777c740e 100644
--- a/metrics/prometheus/reporter.go
+++ b/metrics/prometheus/reporter.go
@@ -252,11 +252,17 @@ func (reporter *PrometheusReporter) setGauge(gaugeName string, toSetValue float6
 	if len(labelMap) == 0 {
 		// gauge
 		if val, exist := reporter.userGauge.Load(gaugeName); !exist {
-			newGauge := newGauge(gaugeName, reporter.namespace)
-			_ = prom.DefaultRegisterer.Register(newGauge)
+			gauge := newGauge(gaugeName, reporter.namespace)
+			err := prom.DefaultRegisterer.Register(gauge)
+			if err == nil {
+				reporter.userGauge.Store(gaugeName, gauge)
+				gauge.Set(toSetValue)
+			} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+				// A gauge for that metric has been registered before.
+				// Use the old gauge from now on.
+				are.ExistingCollector.(prometheus.Gauge).Set(toSetValue)
+			}
 
-			reporter.userGauge.Store(gaugeName, newGauge)
-			newGauge.Set(toSetValue)
 		} else {
 			val.(prometheus.Gauge).Set(toSetValue)
 		}
@@ -269,10 +275,16 @@ func (reporter *PrometheusReporter) setGauge(gaugeName string, toSetValue float6
 		for k, _ := range labelMap {
 			keyList = append(keyList, k)
 		}
-		newGaugeVec := newGaugeVec(gaugeName, reporter.namespace, keyList)
-		_ = prom.DefaultRegisterer.Register(newGaugeVec)
-		reporter.userGaugeVec.Store(gaugeName, newGaugeVec)
-		newGaugeVec.With(labelMap).Set(toSetValue)
+		gaugeVec := newGaugeVec(gaugeName, reporter.namespace, keyList)
+		err := prom.DefaultRegisterer.Register(gaugeVec)
+		if err == nil {
+			reporter.userGaugeVec.Store(gaugeName, gaugeVec)
+			gaugeVec.With(labelMap).Set(toSetValue)
+		} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+			// A gauge for that metric has been registered before.
+			// Use the old gauge from now on.
+			are.ExistingCollector.(*prometheus.GaugeVec).With(labelMap).Set(toSetValue)
+		}
 	} else {
 		val.(*prometheus.GaugeVec).With(labelMap).Set(toSetValue)
 	}
@@ -284,10 +296,16 @@ func (reporter *PrometheusReporter) incCounter(counterName string, labelMap prom
 	if len(labelMap) == 0 {
 		// counter
 		if val, exist := reporter.userCounter.Load(counterName); !exist {
-			newCounter := newCounter(counterName, reporter.namespace)
-			_ = prom.DefaultRegisterer.Register(newCounter)
-			reporter.userCounter.Store(counterName, newCounter)
-			newCounter.Inc()
+			counter := newCounter(counterName, reporter.namespace)
+			err := prom.DefaultRegisterer.Register(counter)
+			if err == nil {
+				reporter.userCounter.Store(counterName, counter)
+				counter.Inc()
+			} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+				// A counter for that metric has been registered before.
+				// Use the old counter from now on.
+				are.ExistingCollector.(prometheus.Counter).Inc()
+			}
 		} else {
 			val.(prometheus.Counter).Inc()
 		}
@@ -300,10 +318,16 @@ func (reporter *PrometheusReporter) incCounter(counterName string, labelMap prom
 		for k, _ := range labelMap {
 			keyList = append(keyList, k)
 		}
-		newCounterVec := newCounterVec(counterName, reporter.namespace, keyList)
-		_ = prom.DefaultRegisterer.Register(newCounterVec)
-		reporter.userCounterVec.Store(counterName, newCounterVec)
-		newCounterVec.With(labelMap).Inc()
+		counterVec := newCounterVec(counterName, reporter.namespace, keyList)
+		err := prom.DefaultRegisterer.Register(counterVec)
+		if err == nil {
+			reporter.userCounterVec.Store(counterName, counterVec)
+			counterVec.With(labelMap).Inc()
+		} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+			// A counter for that metric has been registered before.
+			// Use the old counter from now on.
+			are.ExistingCollector.(*prometheus.CounterVec).With(labelMap).Inc()
+		}
 	} else {
 		val.(*prometheus.CounterVec).With(labelMap).Inc()
 	}
@@ -315,10 +339,16 @@ func (reporter *PrometheusReporter) incSummary(summaryName string, toSetValue fl
 	if len(labelMap) == 0 {
 		// summary
 		if val, exist := reporter.userSummary.Load(summaryName); !exist {
-			newSummary := newSummary(summaryName, reporter.namespace)
-			_ = prom.DefaultRegisterer.Register(newSummary)
-			reporter.userSummary.Store(summaryName, newSummary)
-			newSummary.Observe(toSetValue)
+			summary := newSummary(summaryName, reporter.namespace)
+			err := prom.DefaultRegisterer.Register(summary)
+			if err == nil {
+				reporter.userSummary.Store(summaryName, summary)
+				summary.Observe(toSetValue)
+			} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+				// A summary for that metric has been registered before.
+				// Use the old summary from now on.
+				are.ExistingCollector.(prometheus.Summary).Observe(toSetValue)
+			}
 		} else {
 			val.(prometheus.Summary).Observe(toSetValue)
 		}
@@ -331,10 +361,16 @@ func (reporter *PrometheusReporter) incSummary(summaryName string, toSetValue fl
 		for k, _ := range labelMap {
 			keyList = append(keyList, k)
 		}
-		newSummaryVec := newSummaryVec(summaryName, reporter.namespace, keyList, reporter.reporterConfig.SummaryMaxAge)
-		_ = prom.DefaultRegisterer.Register(newSummaryVec)
-		reporter.userSummaryVec.Store(summaryName, newSummaryVec)
-		newSummaryVec.With(labelMap).Observe(toSetValue)
+		summaryVec := newSummaryVec(summaryName, reporter.namespace, keyList, reporter.reporterConfig.SummaryMaxAge)
+		err := prom.DefaultRegisterer.Register(summaryVec)
+		if err == nil {
+			reporter.userSummaryVec.Store(summaryName, summaryVec)
+			summaryVec.With(labelMap).Observe(toSetValue)
+		} else if are, ok := err.(prometheus.AlreadyRegisteredError); ok {
+			// A summary for that metric has been registered before.
+			// Use the old summary from now on.
+			are.ExistingCollector.(*prometheus.SummaryVec).With(labelMap).Observe(toSetValue)
+		}
 	} else {
 		val.(*prometheus.SummaryVec).With(labelMap).Observe(toSetValue)
 	}