Skip to content

Commit 18f2b66

Browse files
Matthew Palmeraldas
authored andcommitted
feat(prometheus): Configurable Registerer
Add the ability to configure the `prometheus.Registerer`, allowing customisation of the registry metrics are added to.
1 parent d0a6a6e commit 18f2b66

File tree

2 files changed

+13
-18
lines changed

2 files changed

+13
-18
lines changed

prometheus/prometheus.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ type Prometheus struct {
144144
MetricsPath string
145145
Subsystem string
146146
Skipper middleware.Skipper
147+
Registerer prometheus.Registerer
147148

148149
RequestCounterURLLabelMappingFunc RequestCounterLabelMappingFunc
149150
RequestCounterHostLabelMappingFunc RequestCounterLabelMappingFunc
@@ -192,6 +193,7 @@ func NewPrometheus(subsystem string, skipper middleware.Skipper, customMetricsLi
192193
RequestCounterHostLabelMappingFunc: func(c echo.Context) string {
193194
return c.Request().Host
194195
},
196+
Registerer: prometheus.DefaultRegisterer,
195197
}
196198

197199
p.registerMetrics(subsystem)
@@ -367,7 +369,7 @@ func (p *Prometheus) registerMetrics(subsystem string) {
367369

368370
for _, metricDef := range p.MetricsList {
369371
metric := NewMetric(metricDef, subsystem)
370-
if err := prometheus.Register(metric); err != nil {
372+
if err := p.Registerer.Register(metric); err != nil {
371373
log.Errorf("%s could not be registered in Prometheus: %v", metricDef.Name, err)
372374
}
373375
switch metricDef {

prometheus/prometheus_test.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,21 @@ import (
1212
"github.com/stretchr/testify/assert"
1313
)
1414

15-
func unregister(p *Prometheus) {
16-
prometheus.Unregister(p.reqCnt)
17-
prometheus.Unregister(p.reqDur)
18-
prometheus.Unregister(p.reqSz)
19-
prometheus.Unregister(p.resSz)
20-
}
21-
2215
func TestPrometheus_Use(t *testing.T) {
2316
e := echo.New()
2417
p := NewPrometheus("echo", nil)
18+
p.Registerer = prometheus.NewRegistry()
2519
p.Use(e)
2620

2721
assert.Equal(t, 1, len(e.Routes()), "only one route should be added")
2822
assert.NotNil(t, e, "the engine should not be empty")
2923
assert.Equal(t, e.Routes()[0].Path, p.MetricsPath, "the path should match the metrics path")
30-
unregister(p)
3124
}
3225

3326
func TestPrometheus_Buckets(t *testing.T) {
3427
e := echo.New()
3528
p := NewPrometheus("echo", nil)
29+
p.Registerer = prometheus.NewRegistry()
3630
p.Use(e)
3731

3832
path := "/ping"
@@ -51,24 +45,24 @@ func TestPrometheus_Buckets(t *testing.T) {
5145
assert.NotRegexp(t, "request_size_bytes.*le=\"0.005\"", r.Body.String(), "request should NOT have time bucket (like, 0.005s)")
5246
})
5347

54-
unregister(p)
5548
}
5649

5750
func TestPath(t *testing.T) {
5851
p := NewPrometheus("echo", nil)
52+
p.Registerer = prometheus.NewRegistry()
5953
assert.Equal(t, p.MetricsPath, defaultMetricPath, "no usage of path should yield default path")
60-
unregister(p)
6154
}
6255

6356
func TestSubsystem(t *testing.T) {
6457
p := NewPrometheus("echo", nil)
58+
p.Registerer = prometheus.NewRegistry()
6559
assert.Equal(t, p.Subsystem, "echo", "subsystem should be default")
66-
unregister(p)
6760
}
6861

6962
func TestUse(t *testing.T) {
7063
e := echo.New()
7164
p := NewPrometheus("echo", nil)
65+
p.Registerer = prometheus.NewRegistry()
7266

7367
g := gofight.New()
7468
g.GET(p.MetricsPath).Run(e, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
@@ -80,7 +74,6 @@ func TestUse(t *testing.T) {
8074
g.GET(p.MetricsPath).Run(e, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
8175
assert.Equal(t, http.StatusOK, r.Code)
8276
})
83-
unregister(p)
8477
}
8578

8679
func TestIgnore(t *testing.T) {
@@ -95,6 +88,7 @@ func TestIgnore(t *testing.T) {
9588
return false
9689
}
9790
p := NewPrometheus("echo", ignore)
91+
p.Registerer = prometheus.NewRegistry()
9892
p.Use(e)
9993

10094
g := gofight.New()
@@ -111,12 +105,12 @@ func TestIgnore(t *testing.T) {
111105
assert.NotContains(t, r.Body.String(), fmt.Sprintf("%s_requests_total", p.Subsystem))
112106
assert.NotContains(t, r.Body.String(), lipath, "ignored path must not be present")
113107
})
114-
unregister(p)
115108
}
116109

117110
func TestMetricsGenerated(t *testing.T) {
118111
e := echo.New()
119112
p := NewPrometheus("echo", nil)
113+
p.Registerer = prometheus.NewRegistry()
120114
p.Use(e)
121115

122116
path := "/ping"
@@ -130,38 +124,38 @@ func TestMetricsGenerated(t *testing.T) {
130124
assert.Contains(t, r.Body.String(), fmt.Sprintf("%s_requests_total", p.Subsystem))
131125
assert.Contains(t, r.Body.String(), lpath, "path must be present")
132126
})
133-
unregister(p)
134127
}
135128

136129
func TestMetricsPathIgnored(t *testing.T) {
137130
e := echo.New()
138131
p := NewPrometheus("echo", nil)
132+
p.Registerer = prometheus.NewRegistry()
139133
p.Use(e)
140134

141135
g := gofight.New()
142136
g.GET(p.MetricsPath).Run(e, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
143137
assert.Equal(t, http.StatusOK, r.Code)
144138
assert.NotContains(t, r.Body.String(), fmt.Sprintf("%s_requests_total", p.Subsystem))
145139
})
146-
unregister(p)
147140
}
148141

149142
func TestMetricsPushGateway(t *testing.T) {
150143
e := echo.New()
151144
p := NewPrometheus("echo", nil)
145+
p.Registerer = prometheus.NewRegistry()
152146
p.Use(e)
153147

154148
g := gofight.New()
155149
g.GET(p.MetricsPath).Run(e, func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {
156150
assert.Equal(t, http.StatusOK, r.Code)
157151
assert.NotContains(t, r.Body.String(), fmt.Sprintf("%s_request_duration", p.Subsystem))
158152
})
159-
unregister(p)
160153
}
161154

162155
func TestMetricsForErrors(t *testing.T) {
163156
e := echo.New()
164157
p := NewPrometheus("echo", nil)
158+
p.Registerer = prometheus.NewRegistry()
165159
p.Use(e)
166160

167161
e.GET("/handler_for_ok", func(c echo.Context) error {
@@ -190,5 +184,4 @@ func TestMetricsForErrors(t *testing.T) {
190184
assert.Contains(t, body, `echo_requests_total{code="409",host="",method="GET",url="/handler_for_nok"} 2`)
191185
assert.Contains(t, body, `echo_requests_total{code="502",host="",method="GET",url="/handler_for_error"} 1`)
192186
})
193-
unregister(p)
194187
}

0 commit comments

Comments
 (0)