grafana/pkg/plugins/pluginrequestmeta/plugin_request_meta.go
Giuseppe Guerra ab4fc07cc7
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
2023-11-14 16:27:48 +02:00

60 lines
2.1 KiB
Go

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
// plugin query data response status code
type StatusSource string
const (
StatusSourcePlugin StatusSource = "plugin"
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, [DefaultStatusSource] is returned.
func StatusSourceFromContext(ctx context.Context) StatusSource {
value, ok := ctx.Value(statusSourceCtxKey{}).(*StatusSource)
if ok {
return *value
}
return DefaultStatusSource
}
// WithStatusSource sets the plugin request status source for the context.
func WithStatusSource(ctx context.Context, s StatusSource) context.Context {
return context.WithValue(ctx, statusSourceCtxKey{}, &s)
}
// WithDownstreamStatusSource mutates the provided context by setting the plugin request status source to
// StatusSourceDownstream. If the provided context does not have a plugin request status source, the context
// will not be mutated. This means that [WithStatusSource] has to be called before this function.
func WithDownstreamStatusSource(ctx context.Context) error {
v, ok := ctx.Value(statusSourceCtxKey{}).(*StatusSource)
if !ok {
return errors.New("the provided context does not have a plugin request status source")
}
*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)
}