Skip to content

Commit

Permalink
Fixed promhttp Instrument* handlers.
Browse files Browse the repository at this point in the history
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 <bwplotka@gmail.com>
  • Loading branch information
bwplotka committed Apr 16, 2023
1 parent e3b6de8 commit 0963f59
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 4 deletions.
13 changes: 11 additions & 2 deletions prometheus/promhttp/instrument_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,11 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou
for label, resolve := range rtOpts.extraLabelsFromCtx {
l[label] = resolve(resp.Request.Context())
}
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, rtOpts.getExemplarFn(r.Context()))
if rtOpts.getExemplarFn == nil {
counter.With(l).Inc()
} else {
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, rtOpts.getExemplarFn(r.Context()))
}
}
return resp, err
}
Expand Down Expand Up @@ -122,7 +126,12 @@ func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundT
for label, resolve := range rtOpts.extraLabelsFromCtx {
l[label] = resolve(resp.Request.Context())
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context()))

if rtOpts.getExemplarFn == nil {
obs.With(l).Observe(time.Since(start).Seconds())
} else {
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context()))
}
}
return resp, err
}
Expand Down
42 changes: 41 additions & 1 deletion prometheus/promhttp/instrument_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(time.Since(now).Seconds())
return
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
}
}
Expand All @@ -91,6 +96,11 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(time.Since(now).Seconds())
return
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
}
}
Expand Down Expand Up @@ -130,6 +140,11 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler,
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
counter.With(l).Inc()
return
}
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, hOpts.getExemplarFn(r.Context()))
}
}
Expand All @@ -141,6 +156,11 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler,
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
counter.With(l).Inc()
return
}
counter.With(l).(prometheus.ExemplarAdder).AddWithExemplar(1, hOpts.getExemplarFn(r.Context()))
}
}
Expand Down Expand Up @@ -183,7 +203,12 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(time.Since(now).Seconds())
} else {
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context()))
}
})
next.ServeHTTP(d, r)
}
Expand Down Expand Up @@ -227,6 +252,11 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler,
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(float64(size))
return
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(size), hOpts.getExemplarFn(r.Context()))
}
}
Expand All @@ -239,6 +269,11 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler,
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(float64(size))
return
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(size), hOpts.getExemplarFn(r.Context()))
}
}
Expand Down Expand Up @@ -279,6 +314,11 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler
for label, resolve := range hOpts.extraLabelsFromCtx {
l[label] = resolve(r.Context())
}

if hOpts.getExemplarFn == nil {
obs.With(l).Observe(float64(d.Written()))
return
}
obs.With(l).(prometheus.ExemplarObserver).ObserveWithExemplar(float64(d.Written()), hOpts.getExemplarFn(r.Context()))
})
}
Expand Down
1 change: 0 additions & 1 deletion prometheus/promhttp/option.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ type options struct {

func defaultOptions() *options {
return &options{
getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil },
extraLabelsFromCtx: map[string]LabelValueFromCtx{},
}
}
Expand Down

0 comments on commit 0963f59

Please sign in to comment.