18
18
package metrics
19
19
20
20
import (
21
+ "expvar"
22
+ "net/http"
23
+ "regexp"
24
+ "strings"
21
25
"sync"
22
26
23
27
go_kit_metrics "github.com/go-kit/kit/metrics"
24
-
25
28
go_kit_expvar "github.com/go-kit/kit/metrics/expvar"
29
+ go_kit_prometheus "github.com/go-kit/kit/metrics/prometheus"
30
+ stdprometheus "github.com/prometheus/client_golang/prometheus"
31
+ "github.com/prometheus/client_golang/prometheus/promhttp"
26
32
"github.com/rs/zerolog/log"
27
33
)
28
34
@@ -33,37 +39,49 @@ const (
33
39
TimerPrefix = "timer"
34
40
)
35
41
42
+ const (
43
+ prometheusPackage = "prometheus"
44
+ )
45
+
46
+ // GetHandler returns request handler for provided metrics package type
47
+ func GetHandler (packageType string ) http.Handler {
48
+ switch packageType {
49
+ case prometheusPackage :
50
+ return promhttp .Handler ()
51
+ default :
52
+ // expvar
53
+ return expvar .Handler ()
54
+ }
55
+ }
56
+
57
+ // Timer is the collection of some timers
58
+ type Timer struct {
59
+ hits go_kit_metrics.Counter
60
+ totalTime go_kit_metrics.Counter
61
+ histogram go_kit_metrics.Histogram
62
+ }
63
+
64
+ // Update timer components
65
+ func (t * Timer ) Update (delta float64 ) {
66
+ t .hits .Add (1 )
67
+ t .totalTime .Add (delta )
68
+ t .histogram .Observe (delta )
69
+ }
70
+
36
71
// Registry initializes expvar metrics registry
37
72
type Registry struct {
38
73
metricsCounterVars map [string ]go_kit_metrics.Counter
39
74
metricsGaugeVars map [string ]go_kit_metrics.Gauge
40
75
metricsHistogramVars map [string ]go_kit_metrics.Histogram
41
76
metricsTimerVars map [string ]* Timer
77
+ metricsType string
42
78
43
79
gaugeLock sync.RWMutex
44
80
counterLock sync.RWMutex
45
81
histogramLock sync.RWMutex
46
82
timerLock sync.RWMutex
47
83
}
48
84
49
- // NewRegistry initializes metrics registry
50
- func NewRegistry () * Registry {
51
-
52
- return & Registry {
53
- metricsCounterVars : map [string ]go_kit_metrics.Counter {},
54
- metricsGaugeVars : map [string ]go_kit_metrics.Gauge {},
55
- metricsHistogramVars : map [string ]go_kit_metrics.Histogram {},
56
- metricsTimerVars : map [string ]* Timer {},
57
- }
58
- }
59
-
60
- // Timer is the collection of some timers
61
- type Timer struct {
62
- hits go_kit_metrics.Counter
63
- totalTime go_kit_metrics.Counter
64
- histogram go_kit_metrics.Histogram
65
- }
66
-
67
85
// NewTimer constructs Timer
68
86
func (m * Registry ) NewTimer (key string ) * Timer {
69
87
if key == "" {
@@ -81,16 +99,22 @@ func (m *Registry) NewTimer(key string) *Timer {
81
99
return m .createTimer (combinedKey )
82
100
}
83
101
84
- // Update timer components
85
- func (t * Timer ) Update (delta float64 ) {
86
- t .hits .Add (1 )
87
- t .totalTime .Add (delta )
88
- t .histogram .Observe (delta )
102
+ // GetCounter gets go-kit expvar Counter
103
+ // NewRegistry initializes metrics registry
104
+ func NewRegistry (metricsType string ) * Registry {
105
+
106
+ registry := & Registry {
107
+ metricsCounterVars : map [string ]go_kit_metrics.Counter {},
108
+ metricsGaugeVars : map [string ]go_kit_metrics.Gauge {},
109
+ metricsHistogramVars : map [string ]go_kit_metrics.Histogram {},
110
+ metricsTimerVars : map [string ]* Timer {},
111
+ metricsType : metricsType ,
112
+ }
113
+ return registry
89
114
}
90
115
91
- // GetCounter gets go-kit expvar Counter
116
+ // GetCounter gets go-kit Counter
92
117
func (m * Registry ) GetCounter (key string ) go_kit_metrics.Counter {
93
-
94
118
if key == "" {
95
119
log .Warn ().Msg ("metrics counter key is empty" )
96
120
return nil
@@ -103,13 +127,11 @@ func (m *Registry) GetCounter(key string) go_kit_metrics.Counter {
103
127
if val , ok := m .metricsCounterVars [combinedKey ]; ok {
104
128
return val
105
129
}
106
-
107
130
return m .createCounter (combinedKey )
108
131
}
109
132
110
- // GetGauge gets go-kit expvar Gauge
133
+ // GetGauge gets go-kit Gauge
111
134
func (m * Registry ) GetGauge (key string ) go_kit_metrics.Gauge {
112
-
113
135
if key == "" {
114
136
log .Warn ().Msg ("metrics gauge key is empty" )
115
137
return nil
@@ -127,9 +149,8 @@ func (m *Registry) GetGauge(key string) go_kit_metrics.Gauge {
127
149
128
150
// GetHistogram gets go-kit Histogram
129
151
func (m * Registry ) GetHistogram (key string ) go_kit_metrics.Histogram {
130
-
131
152
if key == "" {
132
- log .Warn ().Msg ("metrics gauge key is empty" )
153
+ log .Warn ().Msg ("metrics histogram key is empty" )
133
154
return nil
134
155
}
135
156
@@ -141,25 +162,52 @@ func (m *Registry) GetHistogram(key string) go_kit_metrics.Histogram {
141
162
return m .createHistogram (key )
142
163
}
143
164
144
- func (m * Registry ) createGauge (key string ) * go_kit_expvar.Gauge {
145
- gaugeVar := go_kit_expvar .NewGauge (key )
165
+ func (m * Registry ) createGauge (key string ) (gaugeVar go_kit_metrics.Gauge ) {
166
+ // This is required since naming convention for every package differs
167
+ name := m .getPackageSupportedName (key )
168
+ switch m .metricsType {
169
+ case prometheusPackage :
170
+ gaugeVar = go_kit_prometheus .NewGaugeFrom (stdprometheus.GaugeOpts {
171
+ Name : name ,
172
+ }, []string {})
173
+ default :
174
+ // Default expvar
175
+ gaugeVar = go_kit_expvar .NewGauge (name )
176
+ }
146
177
m .metricsGaugeVars [key ] = gaugeVar
147
- return gaugeVar
148
-
178
+ return
149
179
}
150
180
151
- func (m * Registry ) createCounter (key string ) * go_kit_expvar.Counter {
152
- counterVar := go_kit_expvar .NewCounter (key )
181
+ func (m * Registry ) createCounter (key string ) (counterVar go_kit_metrics.Counter ) {
182
+ // This is required since naming convention for every package differs
183
+ name := m .getPackageSupportedName (key )
184
+ switch m .metricsType {
185
+ case prometheusPackage :
186
+ counterVar = go_kit_prometheus .NewCounterFrom (stdprometheus.CounterOpts {
187
+ Name : name ,
188
+ }, []string {})
189
+ default :
190
+ // Default expvar
191
+ counterVar = go_kit_expvar .NewCounter (name )
192
+ }
153
193
m .metricsCounterVars [key ] = counterVar
154
- return counterVar
155
-
194
+ return
156
195
}
157
196
158
- func (m * Registry ) createHistogram (key string ) * go_kit_expvar.Histogram {
159
- histogramVar := go_kit_expvar .NewHistogram (key , 50 )
197
+ func (m * Registry ) createHistogram (key string ) (histogramVar go_kit_metrics.Histogram ) {
198
+ // This is required since naming convention for every package differs
199
+ name := m .getPackageSupportedName (key )
200
+ switch m .metricsType {
201
+ case prometheusPackage :
202
+ histogramVar = go_kit_prometheus .NewHistogramFrom (stdprometheus.HistogramOpts {
203
+ Name : name ,
204
+ }, []string {})
205
+ default :
206
+ // Default expvar
207
+ histogramVar = go_kit_expvar .NewHistogram (name , 50 )
208
+ }
160
209
m .metricsHistogramVars [key ] = histogramVar
161
- return histogramVar
162
-
210
+ return
163
211
}
164
212
165
213
func (m * Registry ) createTimer (key string ) * Timer {
@@ -168,8 +216,33 @@ func (m *Registry) createTimer(key string) *Timer {
168
216
totalTime : m .createCounter (key + ".responseTime" ),
169
217
histogram : m .createHistogram (key + ".responseTimeHist" ),
170
218
}
171
-
172
219
m .metricsTimerVars [key ] = timerVar
173
220
return timerVar
221
+ }
174
222
223
+ // getPackageSupportedName converts name to package supported type
224
+ func (m * Registry ) getPackageSupportedName (name string ) string {
225
+ switch m .metricsType {
226
+ case prometheusPackage :
227
+ // https://prometheus.io/docs/practices/naming/
228
+ return toSnakeCase (name )
229
+ default :
230
+ // Default expvar
231
+ return name
232
+ }
233
+ }
234
+
235
+ func toSnakeCase (name string ) string {
236
+ v := strings .Replace (name , "-" , "_" , - 1 )
237
+ strArray := strings .Split (v , "." )
238
+ var matchFirstCap = regexp .MustCompile ("(.)([A-Z][a-z]+)" )
239
+ var matchAllCap = regexp .MustCompile ("([a-z0-9])([A-Z])" )
240
+ convertedArray := []string {}
241
+
242
+ for _ , v := range strArray {
243
+ snake := matchFirstCap .ReplaceAllString (v , "${1}_${2}" )
244
+ snake = matchAllCap .ReplaceAllString (snake , "${1}_${2}" )
245
+ convertedArray = append (convertedArray , strings .ToLower (snake ))
246
+ }
247
+ return strings .Join (convertedArray , "_" )
175
248
}
0 commit comments