mirror of
https://github.com/grafana/grafana.git
synced 2025-07-31 16:32:15 +08:00
Data sources: Improve error messages for grpc errors (#102372)
* Data sources: Improve error messages for grpc errors * Improve code comments * Fix lint * Update connection issue message * Update name * Update comment * Update, rename and add test * Update, remove POC change * Fix lint
This commit is contained in:
@ -30,6 +30,14 @@ var (
|
||||
errNilSender = errors.New("sender cannot be nil")
|
||||
)
|
||||
|
||||
// passthroughErrors contains a list of errors that should be returned directly to the caller without wrapping
|
||||
var passthroughErrors = []error{
|
||||
plugins.ErrPluginUnavailable,
|
||||
plugins.ErrMethodNotImplemented,
|
||||
plugins.ErrPluginGrpcResourceExhaustedBase,
|
||||
plugins.ErrPluginGrpcConnectionUnavailableBase,
|
||||
}
|
||||
|
||||
type Service struct {
|
||||
pluginRegistry registry.Service
|
||||
}
|
||||
@ -52,12 +60,10 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
|
||||
resp, err := p.QueryData(ctx, req)
|
||||
if err != nil {
|
||||
if errors.Is(err, plugins.ErrMethodNotImplemented) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if errors.Is(err, plugins.ErrPluginUnavailable) {
|
||||
return nil, err
|
||||
for _, e := range passthroughErrors {
|
||||
if errors.Is(err, e) {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if errors.Is(err, context.Canceled) {
|
||||
|
@ -25,24 +25,39 @@ func TestQueryData(t *testing.T) {
|
||||
|
||||
t.Run("Non-empty registry", func(t *testing.T) {
|
||||
tcs := []struct {
|
||||
err error
|
||||
expectedError error
|
||||
err error
|
||||
expectedError error
|
||||
shouldPassThrough bool
|
||||
}{
|
||||
{
|
||||
err: plugins.ErrPluginUnavailable,
|
||||
expectedError: plugins.ErrPluginUnavailable,
|
||||
err: plugins.ErrPluginUnavailable,
|
||||
expectedError: plugins.ErrPluginUnavailable,
|
||||
shouldPassThrough: true,
|
||||
},
|
||||
{
|
||||
err: plugins.ErrMethodNotImplemented,
|
||||
expectedError: plugins.ErrMethodNotImplemented,
|
||||
err: plugins.ErrMethodNotImplemented,
|
||||
expectedError: plugins.ErrMethodNotImplemented,
|
||||
shouldPassThrough: true,
|
||||
},
|
||||
{
|
||||
err: errors.New("surprise surprise"),
|
||||
expectedError: plugins.ErrPluginRequestFailureErrorBase,
|
||||
err: errors.New("surprise surprise"),
|
||||
expectedError: plugins.ErrPluginRequestFailureErrorBase,
|
||||
shouldPassThrough: false,
|
||||
},
|
||||
{
|
||||
err: context.Canceled,
|
||||
expectedError: plugins.ErrPluginRequestCanceledErrorBase,
|
||||
err: context.Canceled,
|
||||
expectedError: plugins.ErrPluginRequestCanceledErrorBase,
|
||||
shouldPassThrough: false,
|
||||
},
|
||||
{
|
||||
err: plugins.ErrPluginGrpcConnectionUnavailableBase.Errorf("unavailable"),
|
||||
expectedError: plugins.ErrPluginGrpcConnectionUnavailableBase.Errorf("unavailable"),
|
||||
shouldPassThrough: true,
|
||||
},
|
||||
{
|
||||
err: plugins.ErrPluginGrpcResourceExhaustedBase.Errorf("exhausted"),
|
||||
expectedError: plugins.ErrPluginGrpcResourceExhaustedBase.Errorf("exhausted"),
|
||||
shouldPassThrough: true,
|
||||
},
|
||||
}
|
||||
|
||||
@ -69,7 +84,11 @@ func TestQueryData(t *testing.T) {
|
||||
},
|
||||
})
|
||||
require.Error(t, err)
|
||||
require.ErrorIs(t, err, tc.expectedError)
|
||||
if tc.shouldPassThrough {
|
||||
require.Equal(t, tc.err, err)
|
||||
} else {
|
||||
require.ErrorIs(t, err, tc.expectedError)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
|
Reference in New Issue
Block a user