Skip to content

Commit 437004d

Browse files
author
Zeidan, Omar
committed
Add quantiles to request metrics, correct metric postfix
...the new summary collector will expose the metrics with three names: http_server_requests_seconds(_sum|_count)?, making the former counter metric redundant and making the metric names more consistent with conventions. Leaving in a "legacy" metric collector to avoid breaking existing monitoring and alerting setups that depend on the metric with postfix "_sum_sum".
1 parent 87d35ed commit 437004d

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

web/middleware/requestmetrics/requestmetrics.go

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,40 @@ import (
55
"github.com/go-chi/chi/v5"
66
"github.com/go-chi/chi/v5/middleware"
77
"github.com/prometheus/client_golang/prometheus"
8+
89
"net/http"
910
"strings"
1011
"time"
1112
)
1213

1314
var (
14-
RequestCounterName = "http_server_requests_seconds_count"
15-
RequestDurationName = "http_server_requests_seconds_sum"
15+
requestSummaryMetricName = "http_server_requests_seconds"
16+
requestSummaryLegacyMetricName = "http_server_requests_seconds_sum"
1617

17-
reqs *prometheus.CounterVec
18-
latency *prometheus.SummaryVec
18+
reqs *prometheus.CounterVec
19+
requestSummaryMetric *prometheus.SummaryVec
20+
requestSummaryLegacyMetric *prometheus.SummaryVec
1921
)
2022

2123
func Setup() {
22-
reqs = prometheus.NewCounterVec(
23-
prometheus.CounterOpts{
24-
Name: RequestCounterName,
25-
Help: "Number of incoming HTTP requests processed, partitioned by status code, method and HTTP path (grouped by patterns).",
24+
requestSummaryMetric = prometheus.NewSummaryVec(
25+
prometheus.SummaryOpts{
26+
Name: requestSummaryMetricName,
27+
Help: "Request counts, durations, accumulated and in quantiles, partitioned by method, \"outcome\", status code, and HTTP path (grouped by patterns).",
28+
Objectives: map[float64]float64{0.5: 0.05, 0.95: 0.01, 0.99: 0.001},
2629
},
2730
[]string{"method", "outcome", "status", "uri"},
2831
)
29-
prometheus.MustRegister(reqs)
3032

31-
latency = prometheus.NewSummaryVec(
33+
requestSummaryLegacyMetric = prometheus.NewSummaryVec(
3234
prometheus.SummaryOpts{
33-
Name: RequestDurationName,
34-
Help: "How long it took to process requests, partitioned by status code, method and HTTP path (grouped by patterns).",
35+
Name: requestSummaryLegacyMetricName,
36+
Help: "(Legacy, replaced by \"http_server_requests_seconds(_sum|_count)?\") Accumulated request durations and counts partitioned by method, \"outcome\", status code, and HTTP path (grouped by patterns).",
3537
},
3638
[]string{"method", "outcome", "status", "uri"},
3739
)
38-
prometheus.MustRegister(latency)
40+
41+
prometheus.MustRegister(requestSummaryMetric)
3942
}
4043

4144
func RecordRequestMetrics(next http.Handler) http.Handler {
@@ -49,7 +52,8 @@ func RecordRequestMetrics(next http.Handler) http.Handler {
4952
routePattern = strings.Replace(routePattern, "/*/", "/", -1)
5053

5154
reqs.WithLabelValues(r.Method, outcome(ww.Status()), fmt.Sprintf("%d", ww.Status()), routePattern).Inc()
52-
latency.WithLabelValues(r.Method, outcome(ww.Status()), fmt.Sprintf("%d", ww.Status()), routePattern).Observe(float64(time.Since(start).Microseconds()) / 1000000)
55+
requestSummaryMetric.WithLabelValues(r.Method, outcome(ww.Status()), fmt.Sprintf("%d", ww.Status()), routePattern).Observe(float64(time.Since(start).Microseconds()) / 1000000)
56+
requestSummaryLegacyMetric.WithLabelValues(r.Method, outcome(ww.Status()), fmt.Sprintf("%d", ww.Status()), routePattern).Observe(float64(time.Since(start).Microseconds()) / 1000000)
5357
}
5458
return http.HandlerFunc(fn)
5559
}

0 commit comments

Comments
 (0)