From 4d1b969a5c640287c25e6d0f602278f5a4da7aac Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Thu, 31 Oct 2019 16:22:00 -0700 Subject: [PATCH] GEL: include the expression count in the request (#20114) --- pkg/api/api.go | 4 +++- pkg/api/metrics.go | 2 +- public/app/features/dashboard/state/runRequest.ts | 2 -- .../features/expressions/ExpressionDatasource.ts | 15 +++++++++++---- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 9308403b276..3f10f3565fe 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -327,11 +327,13 @@ func (hs *HTTPServer) registerRoutes() { // metrics apiRoute.Post("/tsdb/query", bind(dtos.MetricRequest{}), Wrap(hs.QueryMetrics)) - apiRoute.Post("/tsdb/query/v2", bind(dtos.MetricRequest{}), Wrap(hs.QueryMetricsV2)) apiRoute.Get("/tsdb/testdata/scenarios", Wrap(GetTestDataScenarios)) apiRoute.Get("/tsdb/testdata/gensql", reqGrafanaAdmin, Wrap(GenerateSQLTestData)) apiRoute.Get("/tsdb/testdata/random-walk", Wrap(GetTestDataRandomWalk)) + // DataSource w/ expressions + apiRoute.Post("/ds/query", bind(dtos.MetricRequest{}), Wrap(hs.QueryMetricsV2)) + apiRoute.Group("/alerts", func(alertsRoute routing.RouteRegister) { alertsRoute.Post("/test", bind(dtos.AlertTestCommand{}), Wrap(AlertTest)) alertsRoute.Post("/:alertId/pause", reqEditorRole, bind(dtos.PauseAlertCommand{}), Wrap(PauseAlert)) diff --git a/pkg/api/metrics.go b/pkg/api/metrics.go index 7889fb9ec94..a0ca62cfc23 100644 --- a/pkg/api/metrics.go +++ b/pkg/api/metrics.go @@ -16,7 +16,7 @@ import ( "github.com/grafana/grafana/pkg/util" ) -// POST /api/tsdb/query/v2 +// POST /api/ds/query DataSource query w/ expressions func (hs *HTTPServer) QueryMetricsV2(c *m.ReqContext, reqDto dtos.MetricRequest) Response { if !setting.IsExpressionsEnabled() { return Error(404, "Expressions feature toggle is not enabled", nil) diff --git a/public/app/features/dashboard/state/runRequest.ts b/public/app/features/dashboard/state/runRequest.ts index 9b07e07a363..85f8f54f67f 100644 --- a/public/app/features/dashboard/state/runRequest.ts +++ b/public/app/features/dashboard/state/runRequest.ts @@ -137,8 +137,6 @@ function cancelNetworkRequestsOnUnsubscribe(req: DataQueryRequest) { } export function callQueryMethod(datasource: DataSourceApi, request: DataQueryRequest) { - console.log('CALL', request.targets); - // If any query has an expression, use the expression endpoint for (const target of request.targets) { if (target.datasource === ExpressionDatasourceID) { diff --git a/public/app/features/expressions/ExpressionDatasource.ts b/public/app/features/expressions/ExpressionDatasource.ts index d9c900f0c9a..d876227a81a 100644 --- a/public/app/features/expressions/ExpressionDatasource.ts +++ b/public/app/features/expressions/ExpressionDatasource.ts @@ -12,7 +12,7 @@ import { config } from '@grafana/runtime'; import { getBackendSrv } from 'app/core/services/backend_srv'; /** - * This is a singleton that is not actually instantiated + * This is a singleton instance that just pretends to be a DataSource */ export class ExpressionDatasourceApi extends DataSourceApi { constructor(instanceSettings: DataSourceInstanceSettings) { @@ -26,30 +26,37 @@ export class ExpressionDatasourceApi extends DataSourceApi { query(request: DataQueryRequest): Observable { const { targets, intervalMs, maxDataPoints, range } = request; + let expressionCount = 0; const orgId = (window as any).grafanaBootData.user.orgId; const queries = targets.map(q => { if (q.datasource === ExpressionDatasourceID) { + expressionCount++; return { ...q, datasourceId: this.id, orgId, }; } - const ds = config.datasources[q.datasource || config.defaultDatasource]; + const dsName = q.datasource && q.datasource !== 'default' ? q.datasource : config.defaultDatasource; + const ds = config.datasources[dsName]; + if (!ds) { + throw new Error('Unknown Datasource: ' + q.datasource); + } return { ...q, datasourceId: ds.id, intervalMs, maxDataPoints, orgId, - // ?? alias: templateSrv.replace(q.alias || ''), }; }); const req: Promise = getBackendSrv() - .post('/api/tsdb/query/v2', { + .post('/api/ds/query', { from: range.from.valueOf().toString(), to: range.to.valueOf().toString(), queries: queries, + range, + expressionCount, }) .then((rsp: any) => { return this.toDataQueryResponse(rsp);