Compare commits

...

1 Commits

Author SHA1 Message Date
Gábor Farkas
4b6022d3a7 query service: handle request-interceptor better 2026-01-14 16:52:42 +01:00
4 changed files with 23 additions and 16 deletions

View File

@@ -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 {

View File

@@ -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

View File

@@ -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
}

View File

@@ -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,