Skip to content

Commit 0963f59

Browse files
committed
Fixed promhttp Instrument* handlers.
Unfortunately optionality is important as not every e.g. ObserverVec implements exemplar (e.g. summary). For counters this is not that needed - but changed for consistency and readability. Signed-off-by: bwplotka <[email protected]>
1 parent e3b6de8 commit 0963f59

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

prometheus/promhttp/instrument_client.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou
7878
for label, resolve := range rtOpts.extraLabelsFromCtx {
7979
l[label] = resolve(resp.Request.Context())
8080
}
81-
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, rtOpts.getExemplarFn(r.Context()))
81+
if rtOpts.getExemplarFn == nil {
82+
counter.With(l).Inc()
83+
} else {
84+
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, rtOpts.getExemplarFn(r.Context()))
85+
}
8286
}
8387
return resp, err
8488
}
@@ -122,7 +126,12 @@ func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundT
122126
for label, resolve := range rtOpts.extraLabelsFromCtx {
123127
l[label] = resolve(resp.Request.Context())
124128
}
125-
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context()))
129+
130+
if rtOpts.getExemplarFn == nil {
131+
obs.With(l).Observe(time.Since(start).Seconds())
132+
} else {
133+
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context()))
134+
}
126135
}
127136
return resp, err
128137
}

prometheus/promhttp/instrument_server.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op
8080
for label, resolve := range hOpts.extraLabelsFromCtx {
8181
l[label] = resolve(r.Context())
8282
}
83+
84+
if hOpts.getExemplarFn == nil {
85+
obs.With(l).Observe(time.Since(now).Seconds())
86+
return
87+
}
8388
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
8489
}
8590
}
@@ -91,6 +96,11 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op
9196
for label, resolve := range hOpts.extraLabelsFromCtx {
9297
l[label] = resolve(r.Context())
9398
}
99+
100+
if hOpts.getExemplarFn == nil {
101+
obs.With(l).Observe(time.Since(now).Seconds())
102+
return
103+
}
94104
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
95105
}
96106
}
@@ -130,6 +140,11 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler,
130140
for label, resolve := range hOpts.extraLabelsFromCtx {
131141
l[label] = resolve(r.Context())
132142
}
143+
144+
if hOpts.getExemplarFn == nil {
145+
counter.With(l).Inc()
146+
return
147+
}
133148
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, hOpts.getExemplarFn(r.Context()))
134149
}
135150
}
@@ -141,6 +156,11 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler,
141156
for label, resolve := range hOpts.extraLabelsFromCtx {
142157
l[label] = resolve(r.Context())
143158
}
159+
160+
if hOpts.getExemplarFn == nil {
161+
counter.With(l).Inc()
162+
return
163+
}
144164
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, hOpts.getExemplarFn(r.Context()))
145165
}
146166
}
@@ -183,7 +203,12 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha
183203
for label, resolve := range hOpts.extraLabelsFromCtx {
184204
l[label] = resolve(r.Context())
185205
}
186-
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
206+
207+
if hOpts.getExemplarFn == nil {
208+
obs.With(l).Observe(time.Since(now).Seconds())
209+
} else {
210+
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
211+
}
187212
})
188213
next.ServeHTTP(d, r)
189214
}
@@ -227,6 +252,11 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler,
227252
for label, resolve := range hOpts.extraLabelsFromCtx {
228253
l[label] = resolve(r.Context())
229254
}
255+
256+
if hOpts.getExemplarFn == nil {
257+
obs.With(l).Observe(float64(size))
258+
return
259+
}
230260
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(size), hOpts.getExemplarFn(r.Context()))
231261
}
232262
}
@@ -239,6 +269,11 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler,
239269
for label, resolve := range hOpts.extraLabelsFromCtx {
240270
l[label] = resolve(r.Context())
241271
}
272+
273+
if hOpts.getExemplarFn == nil {
274+
obs.With(l).Observe(float64(size))
275+
return
276+
}
242277
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(size), hOpts.getExemplarFn(r.Context()))
243278
}
244279
}
@@ -279,6 +314,11 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler
279314
for label, resolve := range hOpts.extraLabelsFromCtx {
280315
l[label] = resolve(r.Context())
281316
}
317+
318+
if hOpts.getExemplarFn == nil {
319+
obs.With(l).Observe(float64(d.Written()))
320+
return
321+
}
282322
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(d.Written()), hOpts.getExemplarFn(r.Context()))
283323
})
284324
}

prometheus/promhttp/option.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ type options struct {
3737

3838
func defaultOptions() *options {
3939
return &options{
40-
getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil },
4140
extraLabelsFromCtx: map[string]LabelValueFromCtx{},
4241
}
4342
}

0 commit comments

Comments
 (0)