@@ -75,7 +75,7 @@ func (t *Tracer) reachNotInitMetrics() {
7575func (t * Tracer ) sendMetrics () {
7676 meters := make ([]reporter.ReportedMeter , 0 )
7777 // call collect hook
78- for _ , hook := range t .meterCollectListeners {
78+ for _ , hook := range t .allMeterCollectListeners () {
7979 hook ()
8080 }
8181 t .meterMap .Range (func (key , value interface {}) bool {
@@ -90,6 +90,14 @@ func (t *Tracer) sendMetrics() {
9090 t .Reporter .SendMetrics (meters )
9191}
9292
93+ func (t * Tracer ) allMeterCollectListeners () []func () {
94+ t .meterCollectListenersLock .RLock ()
95+ defer t .meterCollectListenersLock .RUnlock ()
96+ listeners := make ([]func (), 0 , len (t .meterCollectListeners ))
97+ listeners = append (listeners , t .meterCollectListeners ... )
98+ return listeners
99+ }
100+
93101func (t * Tracer ) NewCounter (name string , opt interface {}) interface {} {
94102 counter := newCounter (name , nil , 0 )
95103 if o , ok := opt .(meterOpts ); ok && o != nil {
@@ -118,6 +126,8 @@ func (t *Tracer) NewHistogram(name string, minValue float64, steps []float64, op
118126}
119127
120128func (t * Tracer ) AddCollectHook (f func ()) {
129+ t .meterCollectListenersLock .Lock ()
130+ defer t .meterCollectListenersLock .Unlock ()
121131 t .meterCollectListeners = append (t .meterCollectListeners , f )
122132}
123133
@@ -347,7 +357,7 @@ func (h *histogramBucket) Bucket() float64 {
347357}
348358
349359func (h * histogramBucket ) Count () int64 {
350- return * h .value
360+ return atomic . LoadInt64 ( h .value )
351361}
352362
353363func (h * histogramBucket ) IsNegativeInfinity () bool {
0 commit comments