|
@@ -1,22 +1,22 @@
|
|
|
package metrics
|
|
package metrics
|
|
|
|
|
|
|
|
-type Registry interface{
|
|
|
|
|
|
|
+import "sync"
|
|
|
|
|
|
|
|
- Counters() map[string]Counter
|
|
|
|
|
- Gauges() map[string]Gauge
|
|
|
|
|
- Healthchecks() map[string]Healthcheck
|
|
|
|
|
- Histograms() map[string]Histogram
|
|
|
|
|
- Meters() map[string]Meter
|
|
|
|
|
- Timers() map[string]Timer
|
|
|
|
|
|
|
+type Registry interface{
|
|
|
|
|
|
|
|
- RunHealthchecks()
|
|
|
|
|
|
|
+ EachCounter(func(string, Counter))
|
|
|
|
|
+ EachGauge(func(string, Gauge))
|
|
|
|
|
+ EachHealthcheck(func(string, Healthcheck))
|
|
|
|
|
+ EachHistogram(func(string, Histogram))
|
|
|
|
|
+ EachMeter(func(string, Meter))
|
|
|
|
|
+ EachTimer(func(string, Timer))
|
|
|
|
|
|
|
|
- GetCounter(string) (Counter, bool)
|
|
|
|
|
- GetGauge(string) (Gauge, bool)
|
|
|
|
|
- GetHealthcheck(string) (Healthcheck, bool)
|
|
|
|
|
- GetHistogram(string) (Histogram, bool)
|
|
|
|
|
- GetMeter(string) (Meter, bool)
|
|
|
|
|
- GetTimer(string) (Timer, bool)
|
|
|
|
|
|
|
+ GetCounter(string) Counter
|
|
|
|
|
+ GetGauge(string) Gauge
|
|
|
|
|
+ GetHealthcheck(string) Healthcheck
|
|
|
|
|
+ GetHistogram(string) Histogram
|
|
|
|
|
+ GetMeter(string) Meter
|
|
|
|
|
+ GetTimer(string) Timer
|
|
|
|
|
|
|
|
RegisterCounter(string, Counter)
|
|
RegisterCounter(string, Counter)
|
|
|
RegisterGauge(string, Gauge)
|
|
RegisterGauge(string, Gauge)
|
|
@@ -25,6 +25,8 @@ type Registry interface{
|
|
|
RegisterMeter(string, Meter)
|
|
RegisterMeter(string, Meter)
|
|
|
RegisterTimer(string, Timer)
|
|
RegisterTimer(string, Timer)
|
|
|
|
|
|
|
|
|
|
+ RunHealthchecks()
|
|
|
|
|
+
|
|
|
UnregisterCounter(string)
|
|
UnregisterCounter(string)
|
|
|
UnregisterGauge(string)
|
|
UnregisterGauge(string)
|
|
|
UnregisterHealthcheck(string)
|
|
UnregisterHealthcheck(string)
|
|
@@ -35,6 +37,7 @@ type Registry interface{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type registry struct {
|
|
type registry struct {
|
|
|
|
|
+ mutex *sync.Mutex
|
|
|
counters map[string]Counter
|
|
counters map[string]Counter
|
|
|
gauges map[string]Gauge
|
|
gauges map[string]Gauge
|
|
|
healthchecks map[string]Healthcheck
|
|
healthchecks map[string]Healthcheck
|
|
@@ -45,6 +48,7 @@ type registry struct {
|
|
|
|
|
|
|
|
func NewRegistry() Registry {
|
|
func NewRegistry() Registry {
|
|
|
return ®istry {
|
|
return ®istry {
|
|
|
|
|
+ &sync.Mutex{},
|
|
|
make(map[string]Counter),
|
|
make(map[string]Counter),
|
|
|
make(map[string]Gauge),
|
|
make(map[string]Gauge),
|
|
|
make(map[string]Healthcheck),
|
|
make(map[string]Healthcheck),
|
|
@@ -54,108 +58,158 @@ func NewRegistry() Registry {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Counters() map[string]Counter {
|
|
|
|
|
- return r.counters
|
|
|
|
|
|
|
+func (r *registry) EachCounter(f func(string, Counter)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, c := range r.counters { f(name, c) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Gauges() map[string]Gauge {
|
|
|
|
|
- return r.gauges
|
|
|
|
|
|
|
+func (r *registry) EachGauge(f func(string, Gauge)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, g := range r.gauges { f(name, g) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Healthchecks() map[string]Healthcheck {
|
|
|
|
|
- return r.healthchecks
|
|
|
|
|
|
|
+func (r *registry) EachHealthcheck(f func(string, Healthcheck)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, h := range r.healthchecks { f(name, h) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Histograms() map[string]Histogram {
|
|
|
|
|
- return r.histograms
|
|
|
|
|
|
|
+func (r *registry) EachHistogram(f func(string, Histogram)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, h := range r.histograms { f(name, h) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Meters() map[string]Meter {
|
|
|
|
|
- return r.meters
|
|
|
|
|
|
|
+func (r *registry) EachMeter(f func(string, Meter)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, m := range r.meters { f(name, m) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) Timers() map[string]Timer {
|
|
|
|
|
- return r.timers
|
|
|
|
|
|
|
+func (r *registry) EachTimer(f func(string, Timer)) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ for name, t := range r.timers { f(name, t) }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RunHealthchecks() {
|
|
func (r *registry) RunHealthchecks() {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
for _, h := range r.healthchecks { h.Check() }
|
|
for _, h := range r.healthchecks { h.Check() }
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetCounter(name string) (Counter, bool) {
|
|
|
|
|
- c, ok := r.counters[name]
|
|
|
|
|
- return c, ok
|
|
|
|
|
|
|
+func (r *registry) GetCounter(name string) Counter {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ c := r.counters[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return c
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetGauge(name string) (Gauge, bool) {
|
|
|
|
|
- g, ok := r.gauges[name]
|
|
|
|
|
- return g, ok
|
|
|
|
|
|
|
+func (r *registry) GetGauge(name string) Gauge {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ g := r.gauges[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return g
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetHealthcheck(name string) (Healthcheck, bool) {
|
|
|
|
|
- h, ok := r.healthchecks[name]
|
|
|
|
|
- return h, ok
|
|
|
|
|
|
|
+func (r *registry) GetHealthcheck(name string) Healthcheck {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ h := r.healthchecks[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return h
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetHistogram(name string) (Histogram, bool) {
|
|
|
|
|
- h, ok := r.histograms[name]
|
|
|
|
|
- return h, ok
|
|
|
|
|
|
|
+func (r *registry) GetHistogram(name string) Histogram {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ h := r.histograms[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return h
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetMeter(name string) (Meter, bool) {
|
|
|
|
|
- m, ok := r.meters[name]
|
|
|
|
|
- return m, ok
|
|
|
|
|
|
|
+func (r *registry) GetMeter(name string) Meter {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ m := r.meters[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return m
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (r *registry) GetTimer(name string) (Timer, bool) {
|
|
|
|
|
- t, ok := r.timers[name]
|
|
|
|
|
- return t, ok
|
|
|
|
|
|
|
+func (r *registry) GetTimer(name string) Timer {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
|
|
+ t := r.timers[name]
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
|
|
+ return t
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterCounter(name string, c Counter) {
|
|
func (r *registry) RegisterCounter(name string, c Counter) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.counters[name] = c
|
|
r.counters[name] = c
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterGauge(name string, g Gauge) {
|
|
func (r *registry) RegisterGauge(name string, g Gauge) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.gauges[name] = g
|
|
r.gauges[name] = g
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterHealthcheck(name string, h Healthcheck) {
|
|
func (r *registry) RegisterHealthcheck(name string, h Healthcheck) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.healthchecks[name] = h
|
|
r.healthchecks[name] = h
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterHistogram(name string, h Histogram) {
|
|
func (r *registry) RegisterHistogram(name string, h Histogram) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.histograms[name] = h
|
|
r.histograms[name] = h
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterMeter(name string, m Meter) {
|
|
func (r *registry) RegisterMeter(name string, m Meter) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.meters[name] = m
|
|
r.meters[name] = m
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) RegisterTimer(name string, t Timer) {
|
|
func (r *registry) RegisterTimer(name string, t Timer) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.timers[name] = t
|
|
r.timers[name] = t
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterCounter(name string) {
|
|
func (r *registry) UnregisterCounter(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.counters[name] = nil, false
|
|
r.counters[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterGauge(name string) {
|
|
func (r *registry) UnregisterGauge(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.gauges[name] = nil, false
|
|
r.gauges[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterHealthcheck(name string) {
|
|
func (r *registry) UnregisterHealthcheck(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.healthchecks[name] = nil, false
|
|
r.healthchecks[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterHistogram(name string) {
|
|
func (r *registry) UnregisterHistogram(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.histograms[name] = nil, false
|
|
r.histograms[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterMeter(name string) {
|
|
func (r *registry) UnregisterMeter(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.meters[name] = nil, false
|
|
r.meters[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (r *registry) UnregisterTimer(name string) {
|
|
func (r *registry) UnregisterTimer(name string) {
|
|
|
|
|
+ r.mutex.Lock()
|
|
|
r.timers[name] = nil, false
|
|
r.timers[name] = nil, false
|
|
|
|
|
+ r.mutex.Unlock()
|
|
|
}
|
|
}
|