From bd5459fcf0daad33c01e5e89a7c3ee30475c1b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathan=20V=C4=93rzemnieks?= Date: Thu, 28 Aug 2025 15:05:39 +0200 Subject: [PATCH] Plugins: Record plugin version in request metrics (#110210) Plugins: record plugin version in request metrics --- .../clientmiddleware/metrics_middleware.go | 16 ++++++++-------- .../clientmiddleware/metrics_middleware_test.go | 15 ++++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware.go b/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware.go index d38ce28724f..702f6492c14 100644 --- a/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware.go +++ b/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware.go @@ -35,27 +35,27 @@ func newMetricsMiddleware(promRegisterer prometheus.Registerer, pluginRegistry r Namespace: "grafana", Name: "plugin_request_total", Help: "The total amount of plugin requests", - }, append([]string{"plugin_id", "endpoint", "status", "target"}, additionalLabels...)) + }, append([]string{"plugin_id", "endpoint", "status", "target", "plugin_version"}, additionalLabels...)) pluginRequestDuration := prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "grafana", Name: "plugin_request_duration_milliseconds", Help: "Plugin request duration", Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 25, 50, 100}, - }, append([]string{"plugin_id", "endpoint", "target"}, additionalLabels...)) + }, append([]string{"plugin_id", "endpoint", "target", "plugin_version"}, additionalLabels...)) pluginRequestSize := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "grafana", Name: "plugin_request_size_bytes", Help: "histogram of plugin request sizes returned", Buckets: []float64{128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576}, - }, []string{"source", "plugin_id", "endpoint", "target"}, + }, []string{"source", "plugin_id", "endpoint", "target", "plugin_version"}, ) pluginRequestDurationSeconds := prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "grafana", Name: "plugin_request_duration_seconds", Help: "Plugin request duration in seconds", Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 25}, - }, append([]string{"source", "plugin_id", "endpoint", "status", "target"}, additionalLabels...)) + }, append([]string{"source", "plugin_id", "endpoint", "status", "target", "plugin_version"}, additionalLabels...)) promRegisterer.MustRegister( pluginRequestCounter, pluginRequestDuration, @@ -101,7 +101,7 @@ func (m *MetricsMiddleware) instrumentPluginRequestSize(ctx context.Context, plu return err } endpoint := backend.EndpointFromContext(ctx) - m.pluginRequestSize.WithLabelValues("grafana-backend", pluginCtx.PluginID, string(endpoint), target).Observe(requestSize) + m.pluginRequestSize.WithLabelValues("grafana-backend", pluginCtx.PluginID, string(endpoint), target, pluginCtx.PluginVersion).Observe(requestSize) return nil } @@ -120,9 +120,9 @@ func (m *MetricsMiddleware) instrumentPluginRequest(ctx context.Context, pluginC statusSource := backend.ErrorSourceFromContext(ctx) endpoint := backend.EndpointFromContext(ctx) - pluginRequestDurationWithLabels := m.pluginRequestDuration.WithLabelValues(pluginCtx.PluginID, string(endpoint), target, string(statusSource)) - pluginRequestCounterWithLabels := m.pluginRequestCounter.WithLabelValues(pluginCtx.PluginID, string(endpoint), status.String(), target, string(statusSource)) - pluginRequestDurationSecondsWithLabels := m.pluginRequestDurationSeconds.WithLabelValues("grafana-backend", pluginCtx.PluginID, string(endpoint), status.String(), target, string(statusSource)) + pluginRequestDurationWithLabels := m.pluginRequestDuration.WithLabelValues(pluginCtx.PluginID, string(endpoint), target, pluginCtx.PluginVersion, string(statusSource)) + pluginRequestCounterWithLabels := m.pluginRequestCounter.WithLabelValues(pluginCtx.PluginID, string(endpoint), status.String(), target, pluginCtx.PluginVersion, string(statusSource)) + pluginRequestDurationSecondsWithLabels := m.pluginRequestDurationSeconds.WithLabelValues("grafana-backend", pluginCtx.PluginID, string(endpoint), status.String(), target, pluginCtx.PluginVersion, string(statusSource)) if traceID := tracing.TraceIDFromContext(ctx, true); traceID != "" { pluginRequestDurationWithLabels.(prometheus.ExemplarObserver).ObserveWithExemplar( diff --git a/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware_test.go b/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware_test.go index 070fdffe8ba..99bebd572c0 100644 --- a/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware_test.go +++ b/pkg/services/pluginsintegration/clientmiddleware/metrics_middleware_test.go @@ -29,7 +29,7 @@ const ( ) func TestInstrumentationMiddleware(t *testing.T) { - pCtx := backend.PluginContext{PluginID: pluginID} + pCtx := backend.PluginContext{PluginID: pluginID, PluginVersion: "1.0.0"} t.Run("should instrument requests", func(t *testing.T) { for _, tc := range []struct { expEndpoint backend.Endpoint @@ -89,7 +89,7 @@ func TestInstrumentationMiddleware(t *testing.T) { require.Equal(t, 1, testutil.CollectAndCount(promRegistry, metricRequestDurationMs)) require.Equal(t, 1, testutil.CollectAndCount(promRegistry, metricRequestDurationS)) - counter := mw.pluginRequestCounter.WithLabelValues(pluginID, string(tc.expEndpoint), instrumentationutils.RequestStatusOK.String(), string(backendplugin.TargetUnknown), string(backend.DefaultErrorSource)) + counter := mw.pluginRequestCounter.WithLabelValues(pluginID, string(tc.expEndpoint), instrumentationutils.RequestStatusOK.String(), string(backendplugin.TargetUnknown), pCtx.PluginVersion, string(backend.DefaultErrorSource)) require.Equal(t, 1.0, testutil.ToFloat64(counter)) for _, m := range []string{metricRequestDurationMs, metricRequestDurationS} { require.NoError(t, checkHistogram(promRegistry, m, map[string]string{ @@ -115,10 +115,11 @@ func TestInstrumentationMiddleware(t *testing.T) { func TestInstrumentationMiddlewareStatusSource(t *testing.T) { const labelStatusSource = "status_source" queryDataErrorCounterLabels := prometheus.Labels{ - "plugin_id": pluginID, - "endpoint": string(backend.EndpointQueryData), - "status": instrumentationutils.RequestStatusError.String(), - "target": string(backendplugin.TargetUnknown), + "plugin_id": pluginID, + "endpoint": string(backend.EndpointQueryData), + "status": instrumentationutils.RequestStatusError.String(), + "target": string(backendplugin.TargetUnknown), + "plugin_version": "1.0.0", } downstreamErrorResponse := backend.DataResponse{ Frames: nil, @@ -145,7 +146,7 @@ func TestInstrumentationMiddlewareStatusSource(t *testing.T) { ErrorSource: "", } - pCtx := backend.PluginContext{PluginID: pluginID} + pCtx := backend.PluginContext{PluginID: pluginID, PluginVersion: "1.0.0"} promRegistry := prometheus.NewRegistry() pluginsRegistry := fakes.NewFakePluginRegistry()