diff --git a/pkg/registry/apis/query/query.go b/pkg/registry/apis/query/query.go index ad9c9ac9888..c96c44ab48d 100644 --- a/pkg/registry/apis/query/query.go +++ b/pkg/registry/apis/query/query.go @@ -19,6 +19,7 @@ import ( "github.com/grafana/grafana/pkg/expr" "github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/dsquerierclient" + "github.com/grafana/grafana/pkg/services/validations" "github.com/grafana/grafana/pkg/setting" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" @@ -340,8 +341,8 @@ func prepareQuery( }, nil } -func handlePreparedQuery(ctx context.Context, pq *preparedQuery, concurrentQueryLimit int) (*backend.QueryDataResponse, error) { - resp, err := service.QueryData(ctx, pq.logger, pq.cache, pq.exprSvc, pq.mReq, pq.builder, pq.headers, concurrentQueryLimit) +func handlePreparedQuery(ctx context.Context, pq *preparedQuery, concurrentQueryLimit int, validator validations.DataSourceRequestValidator) (*backend.QueryDataResponse, error) { + resp, err := service.QueryData(ctx, pq.logger, pq.cache, pq.exprSvc, pq.mReq, pq.builder, pq.headers, concurrentQueryLimit, validator) pq.reportMetrics() return resp, err } @@ -359,7 +360,7 @@ func handleQuery( responder.Error(err) return nil, err } - return handlePreparedQuery(ctx, pq, b.concurrentQueryLimit) + return handlePreparedQuery(ctx, pq, b.concurrentQueryLimit, b.dataSourceRequestValidator) } type responderWrapper struct { diff --git a/pkg/registry/apis/query/register.go b/pkg/registry/apis/query/register.go index e7ab7fb9b07..c76ca40fd5a 100644 --- a/pkg/registry/apis/query/register.go +++ b/pkg/registry/apis/query/register.go @@ -32,6 +32,7 @@ import ( "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" + "github.com/grafana/grafana/pkg/services/validations" "github.com/grafana/grafana/pkg/setting" ) @@ -44,14 +45,15 @@ type QueryAPIBuilder struct { authorizer authorizer.Authorizer - tracer tracing.Tracer - metrics *metrics.ExprMetrics - instanceProvider clientapi.InstanceProvider - registry query.DataSourceApiServerRegistry - converter *expr.ResultConverter - queryTypes *query.QueryTypeDefinitionList - legacyDatasourceLookup service.LegacyDataSourceLookup - connections DataSourceConnectionProvider + tracer tracing.Tracer + metrics *metrics.ExprMetrics + instanceProvider clientapi.InstanceProvider + registry query.DataSourceApiServerRegistry + converter *expr.ResultConverter + queryTypes *query.QueryTypeDefinitionList + legacyDatasourceLookup service.LegacyDataSourceLookup + connections DataSourceConnectionProvider + dataSourceRequestValidator validations.DataSourceRequestValidator } func NewQueryAPIBuilder( @@ -64,6 +66,7 @@ func NewQueryAPIBuilder( legacyDatasourceLookup service.LegacyDataSourceLookup, connections DataSourceConnectionProvider, concurrentQueryLimit int, + dataSourceRequestValidator validations.DataSourceRequestValidator, ) (*QueryAPIBuilder, error) { // Include well typed query definitions var queryTypes *query.QueryTypeDefinitionList @@ -96,7 +99,8 @@ func NewQueryAPIBuilder( Features: features, Tracer: tracer, }, - legacyDatasourceLookup: legacyDatasourceLookup, + legacyDatasourceLookup: legacyDatasourceLookup, + dataSourceRequestValidator: dataSourceRequestValidator, }, nil } @@ -113,6 +117,7 @@ func RegisterAPIService( tracer tracing.Tracer, legacyDatasourceLookup service.LegacyDataSourceLookup, exprService *expr.Service, + dataSourceRequestValidator validations.DataSourceRequestValidator, ) (*QueryAPIBuilder, error) { if !featuremgmt.AnyEnabled(features, featuremgmt.FlagQueryService, @@ -145,6 +150,7 @@ func RegisterAPIService( legacyDatasourceLookup, &connectionsProvider{dsService: dataSourcesService, registry: reg}, cfg.SectionWithEnvOverrides("query").Key("concurrent_query_limit").MustInt(runtime.NumCPU()), + dataSourceRequestValidator, ) apiregistration.RegisterAPI(builder) return builder, err diff --git a/pkg/server/wire_gen.go b/pkg/server/wire_gen.go index 218e9fabc36..2721eb50fa9 100644 --- a/pkg/server/wire_gen.go +++ b/pkg/server/wire_gen.go @@ -888,7 +888,7 @@ func Initialize(ctx context.Context, cfg *setting.Cfg, opts Options, apiOpts api return nil, err } legacyDataSourceLookup := service9.ProvideLegacyDataSourceLookup(service15) - queryAPIBuilder, err := query2.RegisterAPIService(cfg, featureToggles, apiserverService, service15, pluginstoreService, accessControl, middlewareHandler, plugincontextProvider, registerer, tracingService, legacyDataSourceLookup, exprService) + queryAPIBuilder, err := query2.RegisterAPIService(cfg, featureToggles, apiserverService, service15, pluginstoreService, accessControl, middlewareHandler, plugincontextProvider, registerer, tracingService, legacyDataSourceLookup, exprService, ossDataSourceRequestValidator) if err != nil { return nil, err } @@ -1556,7 +1556,7 @@ func InitializeForTest(ctx context.Context, t sqlutil.ITestDB, testingT interfac return nil, err } legacyDataSourceLookup := service9.ProvideLegacyDataSourceLookup(service15) - queryAPIBuilder, err := query2.RegisterAPIService(cfg, featureToggles, apiserverService, service15, pluginstoreService, accessControl, middlewareHandler, plugincontextProvider, registerer, tracingService, legacyDataSourceLookup, exprService) + queryAPIBuilder, err := query2.RegisterAPIService(cfg, featureToggles, apiserverService, service15, pluginstoreService, accessControl, middlewareHandler, plugincontextProvider, registerer, tracingService, legacyDataSourceLookup, exprService, ossDataSourceRequestValidator) if err != nil { return nil, err } diff --git a/pkg/services/query/query.go b/pkg/services/query/query.go index dd646fa2acc..271d931a1e3 100644 --- a/pkg/services/query/query.go +++ b/pkg/services/query/query.go @@ -226,12 +226,12 @@ func buildErrorResponses(err error, queries []*simplejson.Json) splitResponse { return splitResponse{er, http.Header{}} } -func QueryData(ctx context.Context, log log.Logger, dscache datasources.CacheService, exprService *expr.Service, reqDTO dtos.MetricRequest, qsDatasourceClientBuilder dsquerierclient.QSDatasourceClientBuilder, headers map[string]string, concurrentQueryLimit int) (*backend.QueryDataResponse, error) { +func QueryData(ctx context.Context, log log.Logger, dscache datasources.CacheService, exprService *expr.Service, reqDTO dtos.MetricRequest, qsDatasourceClientBuilder dsquerierclient.QSDatasourceClientBuilder, headers map[string]string, concurrentQueryLimit int, validator validations.DataSourceRequestValidator) (*backend.QueryDataResponse, error) { s := &ServiceImpl{ log: log, dataSourceCache: dscache, expressionService: exprService, - dataSourceRequestValidator: validations.ProvideValidator(), + dataSourceRequestValidator: validator, qsDatasourceClientBuilder: qsDatasourceClientBuilder, headers: headers, concurrentQueryLimit: concurrentQueryLimit,