Skip to content

Commit

Permalink
feat(metrics): custom histogram buckets configuration (ThreeDotsLabs#489
Browse files Browse the repository at this point in the history
)
  • Loading branch information
Jorge Alberto Cricelli committed Sep 10, 2024
1 parent 0ce33df commit 1aaf523
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 3 deletions.
7 changes: 7 additions & 0 deletions components/metrics/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@ type PrometheusMetricsBuilder struct {

Namespace string
Subsystem string
// PublishBuckets defines the histogram buckets for publish time histogram, defaulted if nil.
PublishBuckets []float64
// HandlerBuckets defines the histogram buckets for handle execution time histogram, defaulted to watermill's default.
HandlerBuckets []float64
}

// AddPrometheusRouterMetrics is a convenience function that acts on the message router to add the metrics middleware
// to all its handlers. The handlers' publishers and subscribers are also decorated.
// The default buckets are used for the handler execution time histogram (use your own provisioning
// with NewRouterMiddlewareWithConfig if needed).
func (b PrometheusMetricsBuilder) AddPrometheusRouterMetrics(r *message.Router) {
r.AddPublisherDecorators(b.DecoratePublisher)
r.AddSubscriberDecorators(b.DecorateSubscriber)
Expand All @@ -48,6 +54,7 @@ func (b PrometheusMetricsBuilder) DecoratePublisher(pub message.Publisher) (mess
Subsystem: b.Subsystem,
Name: "publish_time_seconds",
Help: "The time that a publishing attempt (success or not) took in seconds",
Buckets: b.PublishBuckets,
},
publisherLabelKeys,
))
Expand Down
10 changes: 7 additions & 3 deletions components/metrics/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ var (
labelSuccess,
}

// handlerExecutionTimeBuckets are one order of magnitude smaller than default buckets (5ms~10s),
// defaultHandlerExecutionTimeBuckets are one order of magnitude smaller than default buckets (5ms~10s),
// because the handler execution times are typically shorter (µs~ms range).
handlerExecutionTimeBuckets = []float64{
defaultHandlerExecutionTimeBuckets = []float64{
0.0005,
0.001,
0.0025,
Expand Down Expand Up @@ -64,13 +64,17 @@ func (b PrometheusMetricsBuilder) NewRouterMiddleware() HandlerPrometheusMetrics
var err error
m := HandlerPrometheusMetricsMiddleware{}

if b.HandlerBuckets == nil {
b.HandlerBuckets = defaultHandlerExecutionTimeBuckets
}

m.handlerExecutionTimeSeconds, err = b.registerHistogramVec(prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: b.Namespace,
Subsystem: b.Subsystem,
Name: "handler_execution_time_seconds",
Help: "The total time elapsed while executing the handler function in seconds",
Buckets: handlerExecutionTimeBuckets,
Buckets: b.HandlerBuckets,
},
handlerLabelKeys,
))
Expand Down

0 comments on commit 1aaf523

Please # to comment.