diff --git a/modules/caddyhttp/metrics.go b/modules/caddyhttp/metrics.go index df86d5680d2a..6e618ef94e8f 100644 --- a/modules/caddyhttp/metrics.go +++ b/modules/caddyhttp/metrics.go @@ -32,10 +32,13 @@ var httpMetrics = struct { init: sync.Once{}, } -func initHTTPMetrics() { +func initHTTPMetrics(perHost bool) { const ns, sub = "caddy", "http" basicLabels := []string{"server", "handler"} + if perHost { + basicLabels = append(basicLabels, "host") + } httpMetrics.requestInFlight = promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: ns, Subsystem: sub, @@ -60,6 +63,9 @@ func initHTTPMetrics() { sizeBuckets := prometheus.ExponentialBuckets(256, 4, 8) httpLabels := []string{"server", "handler", "code", "method"} + if perHost { + httpLabels = append(httpLabels, "host") + } httpMetrics.requestDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{ Namespace: ns, Subsystem: sub, @@ -103,23 +109,29 @@ func serverNameFromContext(ctx context.Context) string { type metricsInstrumentedHandler struct { handler string mh MiddlewareHandler + perHost bool } -func newMetricsInstrumentedHandler(handler string, mh MiddlewareHandler) *metricsInstrumentedHandler { +func newMetricsInstrumentedHandler(handler string, mh MiddlewareHandler, perHost bool) *metricsInstrumentedHandler { httpMetrics.init.Do(func() { - initHTTPMetrics() + initHTTPMetrics(perHost) }) - return &metricsInstrumentedHandler{handler, mh} + return &metricsInstrumentedHandler{handler, mh, perHost} } func (h *metricsInstrumentedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request, next Handler) error { server := serverNameFromContext(r.Context()) - labels := prometheus.Labels{"server": server, "handler": h.handler} + labels := prometheus.Labels{"server": server, "handler": h.handler, "host": host} method := metrics.SanitizeMethod(r.Method) // the "code" value is set later, but initialized here to eliminate the possibility // of a panic - statusLabels := prometheus.Labels{"server": server, "handler": h.handler, "method": method, "code": ""} + statusLabels := prometheus.Labels{"server": server, "handler": h.handler, "host": host, "method": method, "code": ""} + + if h.perHost { + labels["host"] = r.Host + statusLabels["host"] = r.Host + } inFlight := httpMetrics.requestInFlight.With(labels) inFlight.Inc()