mirror of
https://github.com/grafana/grafana.git
synced 2025-01-24 15:27:01 -06:00
ab4fc07cc7
* Plugins: Add statusSource to partial data response error log * Introduce DefaultStatusSource * Add StatusSourceFromPluginErrorSource * Moved StatusSourceFromPluginErrorSource * Update pkg/services/pluginsintegration/clientmiddleware/logger_middleware.go
60 lines
2.1 KiB
Go
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)
|
|
}
|