/
spy_metric_registrar.go
127 lines (98 loc) · 2.26 KB
/
spy_metric_registrar.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package testing
import (
"sync"
"github.com/prometheus/client_golang/prometheus"
)
type SpyMetricRegistrar struct {
sync.Mutex
metrics map[string]float64
histograms map[string]*SpyHistogramObserver
registerer prometheus.Registerer
gatherer prometheus.Gatherer
}
type SpyHistogramObserver struct {
sync.Mutex
Observations []float64
}
func NewSpyMetricRegistrar() *SpyMetricRegistrar {
defaultRegistry := prometheus.NewRegistry()
return &SpyMetricRegistrar{
metrics: make(map[string]float64),
histograms: make(map[string]*SpyHistogramObserver),
registerer: defaultRegistry,
gatherer: defaultRegistry,
}
}
func (r *SpyMetricRegistrar) Registerer() prometheus.Registerer {
return r.registerer
}
func (r *SpyMetricRegistrar) Gatherer() prometheus.Gatherer {
return r.gatherer
}
func (r *SpyMetricRegistrar) Set(name string, value float64, labels ...string) {
r.Lock()
defer r.Unlock()
r.metrics[name] = value
}
func (r *SpyMetricRegistrar) Add(name string, delta float64, labels ...string) {
r.Lock()
defer r.Unlock()
value, found := r.metrics[name]
if found {
r.metrics[name] = value + delta
return
}
r.metrics[name] = delta
}
func (s *SpyHistogramObserver) Observe(value float64) {
s.Lock()
defer s.Unlock()
s.Observations = append(s.Observations, value)
}
func (r *SpyMetricRegistrar) Histogram(name string, labels ...string) prometheus.Observer {
r.Lock()
defer r.Unlock()
spy, ok := r.histograms[name]
if ok {
return spy
}
spy = &SpyHistogramObserver{}
r.histograms[name] = spy
return spy
}
func (r *SpyMetricRegistrar) Inc(name string, labels ...string) {
r.Add(name, 1)
}
func (r *SpyMetricRegistrar) Fetch(name string) func() float64 {
return func() float64 {
r.Lock()
defer r.Unlock()
value, found := r.metrics[name]
if found {
return value
}
return 0
}
}
func (r *SpyMetricRegistrar) FetchHistogram(name string) func() []float64 {
return func() []float64 {
r.Lock()
defer r.Unlock()
spy, found := r.histograms[name]
if found {
return spy.Observations
}
return []float64{}
}
}
func (r *SpyMetricRegistrar) FetchOption(name string) func() *float64 {
return func() *float64 {
r.Lock()
defer r.Unlock()
value, found := r.metrics[name]
if found {
return &value
}
return nil
}
}