From 2d6e69226be20a7f001c7792bda8df68d90287c6 Mon Sep 17 00:00:00 2001 From: Carl Bergquist Date: Fri, 10 Jun 2022 10:56:55 +0200 Subject: [PATCH] Instrumentation: Add feature toggle for logging requests instrumented as unknown (#50566) Signed-off-by: bergquist --- .../src/types/featureToggles.gen.ts | 1 + pkg/middleware/request_metrics.go | 18 ++++++++++++------ pkg/services/featuremgmt/registry.go | 5 +++++ pkg/services/featuremgmt/toggles_gen.go | 4 ++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index e3b794c181a..3cc6fa27b0b 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -58,4 +58,5 @@ export interface FeatureToggles { prometheusWideSeries?: boolean; canvasPanelNesting?: boolean; cloudMonitoringExperimentalUI?: boolean; + logRequestsInstrumentedAsUnknown?: boolean; } diff --git a/pkg/middleware/request_metrics.go b/pkg/middleware/request_metrics.go index 654271e92cd..fb6c7a57117 100644 --- a/pkg/middleware/request_metrics.go +++ b/pkg/middleware/request_metrics.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/metrics" "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/featuremgmt" @@ -46,6 +47,8 @@ func init() { // RequestMetrics is a middleware handler that instruments the request. func RequestMetrics(features featuremgmt.FeatureToggles) web.Handler { + log := log.New("middleware.request-metrics") + return func(res http.ResponseWriter, req *http.Request, c *web.Context) { if strings.HasPrefix(c.Req.URL.Path, "/public/") || c.Req.URL.Path == "robots.txt" || c.Req.URL.Path == "/metrics" { c.Next() @@ -58,15 +61,18 @@ func RequestMetrics(features featuremgmt.FeatureToggles) web.Handler { defer httpRequestsInFlight.Dec() c.Next() - handler := "unknown" - - if routeOperation, exists := RouteOperationNameFromContext(c.Req.Context()); exists { - handler = routeOperation - } - status := rw.Status() code := sanitizeCode(status) + handler := "unknown" + if routeOperation, exists := RouteOperationNameFromContext(c.Req.Context()); exists { + handler = routeOperation + } else { + if features.IsEnabled(featuremgmt.FlagLogRequestsInstrumentedAsUnknown) { + log.Warn("request instrumented as unknown", "path", c.Req.URL.Path, "status_code", status) + } + } + // avoiding the sanitize functions for in the new instrumentation // since they dont make much sense. We should remove them later. histogram := httpRequestDurationHistogram. diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 623ea09178f..1490b6be669 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -237,5 +237,10 @@ var ( State: FeatureStateAlpha, FrontendOnly: true, }, + { + Name: "logRequestsInstrumentedAsUnknown", + Description: "Logs the path for requests that are instrumented as unknown", + State: FeatureStateAlpha, + }, } ) diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index a911fcbacae..bbc6b55dfd7 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -174,4 +174,8 @@ const ( // FlagCloudMonitoringExperimentalUI // Use grafana-experimental UI in Cloud Monitoring FlagCloudMonitoringExperimentalUI = "cloudMonitoringExperimentalUI" + + // FlagLogRequestsInstrumentedAsUnknown + // Logs the path for requests that are instrumented as unknown + FlagLogRequestsInstrumentedAsUnknown = "logRequestsInstrumentedAsUnknown" )