datasources: querier: better error handling (#109789)
This commit is contained in:
+5
-1
@@ -395,7 +395,11 @@ func (dn *DSNode) Execute(ctx context.Context, now time.Time, _ mathexp.Vars, s
|
||||
}()
|
||||
|
||||
var resp *backend.QueryDataResponse
|
||||
mtDSClient, ok := s.mtDatasourceClientBuilder.BuildClient(dn.datasource.Type, dn.datasource.UID)
|
||||
mtDSClient, ok, err := s.mtDatasourceClientBuilder.BuildClient(dn.datasource.Type, dn.datasource.UID)
|
||||
if err != nil {
|
||||
return mathexp.Results{}, MakeQueryError(dn.refID, dn.datasource.UID, err)
|
||||
}
|
||||
|
||||
if !ok { // use single tenant client
|
||||
pCtx, err := s.pCtxProvider.GetWithDataSource(ctx, dn.datasource.Type, dn.request.User, dn.datasource)
|
||||
if err != nil {
|
||||
|
||||
@@ -9,13 +9,13 @@ import (
|
||||
)
|
||||
|
||||
type MTDatasourceClientBuilder interface {
|
||||
BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool)
|
||||
BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error)
|
||||
}
|
||||
|
||||
type nullBuilder struct{}
|
||||
|
||||
func (m *nullBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) {
|
||||
return nil, false
|
||||
func (m *nullBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
|
||||
return nil, false, nil
|
||||
}
|
||||
|
||||
// we use this noop for st flows
|
||||
@@ -29,7 +29,7 @@ type MtDatasourceClientBuilderWithInstance struct {
|
||||
logger log.Logger
|
||||
}
|
||||
|
||||
func (b *MtDatasourceClientBuilderWithInstance) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) {
|
||||
func (b *MtDatasourceClientBuilderWithInstance) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
|
||||
dsClient, err := b.instance.GetDataSourceClient(
|
||||
b.ctx,
|
||||
v0alpha1.DataSourceRef{
|
||||
@@ -38,10 +38,9 @@ func (b *MtDatasourceClientBuilderWithInstance) BuildClient(pluginId string, uid
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
b.logger.Debug("failed to get mt ds client", "error", err)
|
||||
return nil, false
|
||||
return nil, true, err
|
||||
}
|
||||
return dsClient, true
|
||||
return dsClient, true, nil
|
||||
}
|
||||
|
||||
// TODO: I think we might be able to refactor this to just use the instance
|
||||
@@ -69,10 +68,10 @@ type testBuilder struct {
|
||||
isMultitenant bool
|
||||
}
|
||||
|
||||
func (b *testBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool) {
|
||||
func (b *testBuilder) BuildClient(pluginId string, uid string) (clientapi.QueryDataClient, bool, error) {
|
||||
if !b.isMultitenant {
|
||||
return nil, false
|
||||
return nil, false, nil
|
||||
}
|
||||
|
||||
return b.mockClient, true
|
||||
return b.mockClient, true, nil
|
||||
}
|
||||
|
||||
@@ -302,7 +302,11 @@ func (s *ServiceImpl) handleQuerySingleDatasource(ctx context.Context, user iden
|
||||
req.Queries = append(req.Queries, q.query)
|
||||
}
|
||||
|
||||
mtDsClient, ok := s.mtDatasourceClientBuilder.BuildClient(ds.Type, ds.UID)
|
||||
mtDsClient, ok, err := s.mtDatasourceClientBuilder.BuildClient(ds.Type, ds.UID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !ok { // single tenant flow
|
||||
pCtx, err := s.pCtxProvider.GetWithDataSource(ctx, ds.Type, user, ds)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user