From ab4fc07cc7b371e338f5c0cf27d3790f55b0fc6b Mon Sep 17 00:00:00 2001 From: Giuseppe Guerra Date: Tue, 14 Nov 2023 15:27:48 +0100 Subject: [PATCH] Plugins: Add statusSource to partial data response error log (#78057) * Plugins: Add statusSource to partial data response error log * Introduce DefaultStatusSource * Add StatusSourceFromPluginErrorSource * Moved StatusSourceFromPluginErrorSource * Update pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go --- .../pluginrequestmeta/plugin_request_meta.go | 19 +++++++++++++++++-- .../clientmiddleware/logger_middleware.go | 8 ++++++-- .../plugin_request_meta_middleware.go | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/pkg/plugins/pluginrequestmeta/plugin_request_meta.go b/pkg/plugins/pluginrequestmeta/plugin_request_meta.go index cc3f4143790..1a189bf33fb 100644 --- a/pkg/plugins/pluginrequestmeta/plugin_request_meta.go +++ b/pkg/plugins/pluginrequestmeta/plugin_request_meta.go @@ -3,6 +3,8 @@ package pluginrequestmeta import ( "context" "errors" + + "github.com/grafana/grafana-plugin-sdk-go/backend" ) // StatusSource is an enum-like string value representing the source of a @@ -14,16 +16,19 @@ const ( StatusSourceDownstream StatusSource = "downstream" ) +// DefaultStatusSource is the default StatusSource that should be used when it is not explicitly set by the plugin. +const DefaultStatusSource StatusSource = StatusSourcePlugin + type statusSourceCtxKey struct{} // StatusSourceFromContext returns the plugin request status source stored in the context. -// If no plugin request status source is stored in the context, [StatusSourcePlugin] is returned. +// If no plugin request status source is stored in the context, [DefaultStatusSource] is returned. func StatusSourceFromContext(ctx context.Context) StatusSource { value, ok := ctx.Value(statusSourceCtxKey{}).(*StatusSource) if ok { return *value } - return StatusSourcePlugin + return DefaultStatusSource } // WithStatusSource sets the plugin request status source for the context. @@ -42,3 +47,13 @@ func WithDownstreamStatusSource(ctx context.Context) error { *v = StatusSourceDownstream return nil } + +// StatusSourceFromPluginErrorSource takes an error source returned by a plugin and returns the corresponding +// StatusSource. If the provided value is a zero-value (i.e.: the plugin did not set it), the function returns +// DefaultStatusSource. +func StatusSourceFromPluginErrorSource(pluginErrorSource backend.ErrorSource) StatusSource { + if pluginErrorSource == "" { + return DefaultStatusSource + } + return StatusSource(pluginErrorSource) +} diff --git a/pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go b/pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go index 81d1e9da74d..d5dfda520c0 100644 --- a/pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go +++ b/pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go @@ -51,7 +51,7 @@ func (m *LoggerMiddleware) logRequest(ctx context.Context, fn func(ctx context.C logParams = append(logParams, "error", err) } if m.features.IsEnabled(featuremgmt.FlagPluginsInstrumentationStatusSource) { - logParams = append(logParams, "status_source", pluginrequestmeta.StatusSourceFromContext(ctx)) + logParams = append(logParams, "statusSource", pluginrequestmeta.StatusSourceFromContext(ctx)) } ctxLogger := m.logger.FromContext(ctx) @@ -81,7 +81,11 @@ func (m *LoggerMiddleware) QueryData(ctx context.Context, req *backend.QueryData ctxLogger := m.logger.FromContext(ctx) for refID, dr := range resp.Responses { if dr.Error != nil { - ctxLogger.Error("Partial data response error", "refID", refID, "error", dr.Error) + logParams := []any{"refID", refID, "status", int(dr.Status), "error", dr.Error} + if m.features.IsEnabled(featuremgmt.FlagPluginsInstrumentationStatusSource) { + logParams = append(logParams, "statusSource", pluginrequestmeta.StatusSourceFromPluginErrorSource(dr.ErrorSource)) + } + ctxLogger.Error("Partial data response error", logParams...) } } diff --git a/pkg/services/pluginsintegration/clientmiddleware/plugin_request_meta_middleware.go b/pkg/services/pluginsintegration/clientmiddleware/plugin_request_meta_middleware.go index 446ff8aab80..d11093f7bb2 100644 --- a/pkg/services/pluginsintegration/clientmiddleware/plugin_request_meta_middleware.go +++ b/pkg/services/pluginsintegration/clientmiddleware/plugin_request_meta_middleware.go @@ -16,7 +16,7 @@ func NewPluginRequestMetaMiddleware() plugins.ClientMiddleware { return plugins.ClientMiddlewareFunc(func(next plugins.Client) plugins.Client { return &PluginRequestMetaMiddleware{ next: next, - defaultStatusSource: pluginrequestmeta.StatusSourcePlugin, + defaultStatusSource: pluginrequestmeta.DefaultStatusSource, } }) }