metrics/http_round_tripper/http_round_tripper.go (49 lines of code) (raw):
package http_round_tripper
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// Metric names for the recorded metrics.
// These are the conventional names prometheus uses for these metrics.
const (
inFlightRequestsMetricName = "in_flight_requests"
requestsTotalMetricName = "requests_total"
requestDurationSecondsMetricName = "request_duration_seconds"
)
// Factory creates middleware instances. Created by NewFactory.
type Factory func(next http.RoundTripper, opts ...Option) http.RoundTripper
// NewFactory will create a function for creating metric middlewares.
// The resulting function can be called multiple times to obtain multiple middleware
// instances.
// Each instance can be configured with different options that will be applied to the
// same underlying metrics.
func NewFactory(opts ...FactoryOption) Factory {
config := applyFactoryOptions(opts)
inFlightRequests := prometheus.NewGauge(prometheus.GaugeOpts{
Namespace: config.namespace,
Subsystem: config.subsystem,
Name: inFlightRequestsMetricName,
Help: "A gauge of requests currently being handled.",
})
requestsTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: config.namespace,
Subsystem: config.subsystem,
Name: requestsTotalMetricName,
Help: "A counter for total number of requests.",
},
config.labels,
)
requestDurationSeconds := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Namespace: config.namespace,
Subsystem: config.subsystem,
Name: requestDurationSecondsMetricName,
Help: "A histogram of latencies for requests.",
Buckets: config.requestDurationBuckets,
},
config.labels,
)
prometheus.MustRegister(inFlightRequests, requestsTotal, requestDurationSeconds)
return func(next http.RoundTripper, opts ...Option) http.RoundTripper {
config := applyOptions(opts)
rt := next
rt = promhttp.InstrumentRoundTripperCounter(requestsTotal.MustCurryWith(config.labelValues), rt)
rt = promhttp.InstrumentRoundTripperDuration(requestDurationSeconds.MustCurryWith(config.labelValues), rt)
rt = promhttp.InstrumentRoundTripperInFlight(inFlightRequests, rt)
return rt
}
}