From e75840737e81f70b6d169df21eca86a624d4bdc4 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Fri, 24 Jan 2020 09:50:09 +0100 Subject: [PATCH] Loki: Fix Loki with repeated panels and interpolation for Explore (#21685) --- packages/grafana-data/src/types/datasource.ts | 2 +- packages/grafana-data/src/types/panel.ts | 1 + public/app/core/utils/explore.ts | 3 ++- .../plugins/datasource/elasticsearch/datasource.ts | 5 +++-- public/app/plugins/datasource/graphite/datasource.ts | 4 ++-- public/app/plugins/datasource/influxdb/datasource.ts | 8 ++++---- public/app/plugins/datasource/loki/datasource.ts | 7 ++++--- public/app/plugins/datasource/mssql/datasource.ts | 8 ++++++-- public/app/plugins/datasource/mysql/datasource.ts | 11 ++++++++--- public/app/plugins/datasource/postgres/datasource.ts | 8 ++++++-- .../app/plugins/datasource/prometheus/datasource.ts | 5 +++-- 11 files changed, 40 insertions(+), 22 deletions(-) diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index af3e50a3443..71782c85e97 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -276,7 +276,7 @@ export abstract class DataSourceApi< */ annotationQuery?(options: AnnotationQueryRequest): Promise; - interpolateVariablesInQueries?(queries: TQuery[]): TQuery[]; + interpolateVariablesInQueries?(queries: TQuery[], scopedVars: ScopedVars | {}): TQuery[]; } export interface MetadataInspectorProps< diff --git a/packages/grafana-data/src/types/panel.ts b/packages/grafana-data/src/types/panel.ts index e111224429a..b2c343c41e7 100644 --- a/packages/grafana-data/src/types/panel.ts +++ b/packages/grafana-data/src/types/panel.ts @@ -52,6 +52,7 @@ export interface PanelModel { id: number; options: TOptions; pluginVersion?: string; + scopedVars?: ScopedVars; } /** diff --git a/public/app/core/utils/explore.ts b/public/app/core/utils/explore.ts index 9e91d24a9ec..78f2435f357 100644 --- a/public/app/core/utils/explore.ts +++ b/public/app/core/utils/explore.ts @@ -88,11 +88,12 @@ export async function getExploreUrl(args: GetExploreUrlArguments) { const range = timeSrv.timeRangeForUrl(); let state: Partial = { range }; if (exploreDatasource.interpolateVariablesInQueries) { + const scopedVars = panel.scopedVars || {}; state = { ...state, datasource: exploreDatasource.name, context: 'explore', - queries: exploreDatasource.interpolateVariablesInQueries(exploreTargets), + queries: exploreDatasource.interpolateVariablesInQueries(exploreTargets, scopedVars), }; } else { state = { diff --git a/public/app/plugins/datasource/elasticsearch/datasource.ts b/public/app/plugins/datasource/elasticsearch/datasource.ts index 7654ec4d60d..ea18b7c59ba 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.ts +++ b/public/app/plugins/datasource/elasticsearch/datasource.ts @@ -6,6 +6,7 @@ import { DataQueryRequest, DataQueryResponse, DataFrame, + ScopedVars, } from '@grafana/data'; import { ElasticResponse } from './elastic_response'; import { IndexPattern } from './index_pattern'; @@ -263,14 +264,14 @@ export class ElasticDatasource extends DataSourceApi 0) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - query: this.templateSrv.replace(query.query, {}, 'lucene'), + query: this.templateSrv.replace(query.query, scopedVars, 'lucene'), }; return expandedQuery; }); diff --git a/public/app/plugins/datasource/graphite/datasource.ts b/public/app/plugins/datasource/graphite/datasource.ts index 648930bf231..a2393085286 100644 --- a/public/app/plugins/datasource/graphite/datasource.ts +++ b/public/app/plugins/datasource/graphite/datasource.ts @@ -148,14 +148,14 @@ export class GraphiteDatasource extends DataSourceApi 0) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - target: this.templateSrv.replace(query.target), + target: this.templateSrv.replace(query.target, scopedVars), }; return expandedQuery; }); diff --git a/public/app/plugins/datasource/influxdb/datasource.ts b/public/app/plugins/datasource/influxdb/datasource.ts index 78c0359dd91..116931e478d 100644 --- a/public/app/plugins/datasource/influxdb/datasource.ts +++ b/public/app/plugins/datasource/influxdb/datasource.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; -import { dateMath, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data'; +import { dateMath, DataSourceApi, DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; import InfluxSeries from './influx_series'; import InfluxQueryModel from './influx_query_model'; import ResponseParser from './response_parser'; @@ -167,7 +167,7 @@ export default class InfluxDatasource extends DataSourceApi { .filter(target => target.expr && !target.hide) .map(target => ({ ...target, - expr: this.templateSrv.replace(target.expr, {}, this.interpolateQueryExpr), + expr: this.templateSrv.replace(target.expr, options.scopedVars, this.interpolateQueryExpr), })); if (options.exploreMode === ExploreMode.Metrics) { @@ -350,13 +351,13 @@ export class LokiDatasource extends DataSourceApi { ); }; - interpolateVariablesInQueries(queries: LokiQuery[]): LokiQuery[] { + interpolateVariablesInQueries(queries: LokiQuery[], scopedVars: ScopedVars): LokiQuery[] { let expandedQueries = queries; if (queries && queries.length) { expandedQueries = queries.map(query => ({ ...query, datasource: this.name, - expr: this.templateSrv.replace(query.expr, {}, this.interpolateQueryExpr), + expr: this.templateSrv.replace(query.expr, scopedVars, this.interpolateQueryExpr), })); } diff --git a/public/app/plugins/datasource/mssql/datasource.ts b/public/app/plugins/datasource/mssql/datasource.ts index 8059f6165c2..21bdbf70913 100644 --- a/public/app/plugins/datasource/mssql/datasource.ts +++ b/public/app/plugins/datasource/mssql/datasource.ts @@ -1,6 +1,7 @@ import _ from 'lodash'; import ResponseParser from './response_parser'; import { getBackendSrv } from '@grafana/runtime'; +import { ScopedVars } from '@grafana/data'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; //Types @@ -43,14 +44,17 @@ export class MssqlDatasource { return quotedValues.join(','); } - interpolateVariablesInQueries(queries: MssqlQueryForInterpolation[]): MssqlQueryForInterpolation[] { + interpolateVariablesInQueries( + queries: MssqlQueryForInterpolation[], + scopedVars: ScopedVars + ): MssqlQueryForInterpolation[] { let expandedQueries = queries; if (queries && queries.length > 0) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - rawSql: this.templateSrv.replace(query.rawSql, {}, this.interpolateVariable), + rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable), }; return expandedQuery; }); diff --git a/public/app/plugins/datasource/mysql/datasource.ts b/public/app/plugins/datasource/mysql/datasource.ts index 7a5133331a5..75943207a03 100644 --- a/public/app/plugins/datasource/mysql/datasource.ts +++ b/public/app/plugins/datasource/mysql/datasource.ts @@ -2,6 +2,7 @@ import _ from 'lodash'; import ResponseParser from './response_parser'; import MysqlQuery from 'app/plugins/datasource/mysql/mysql_query'; import { getBackendSrv } from '@grafana/runtime'; +import { ScopedVars } from '@grafana/data'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; //Types @@ -27,7 +28,8 @@ export class MysqlDatasource { interpolateVariable = (value: string, variable: any) => { if (typeof value === 'string') { if (variable.multi || variable.includeAll) { - return this.queryModel.quoteLiteral(value); + const result = this.queryModel.quoteLiteral(value); + return result; } else { return value; } @@ -43,14 +45,17 @@ export class MysqlDatasource { return quotedValues.join(','); }; - interpolateVariablesInQueries(queries: MysqlQueryForInterpolation[]): MysqlQueryForInterpolation[] { + interpolateVariablesInQueries( + queries: MysqlQueryForInterpolation[], + scopedVars: ScopedVars + ): MysqlQueryForInterpolation[] { let expandedQueries = queries; if (queries && queries.length > 0) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - rawSql: this.templateSrv.replace(query.rawSql, {}, this.interpolateVariable), + rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable), }; return expandedQuery; }); diff --git a/public/app/plugins/datasource/postgres/datasource.ts b/public/app/plugins/datasource/postgres/datasource.ts index 44ef009baeb..dbb7b0d93a9 100644 --- a/public/app/plugins/datasource/postgres/datasource.ts +++ b/public/app/plugins/datasource/postgres/datasource.ts @@ -2,6 +2,7 @@ import _ from 'lodash'; import ResponseParser from './response_parser'; import PostgresQuery from 'app/plugins/datasource/postgres/postgres_query'; import { getBackendSrv } from '@grafana/runtime'; +import { ScopedVars } from '@grafana/data'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; //Types @@ -49,14 +50,17 @@ export class PostgresDatasource { return quotedValues.join(','); }; - interpolateVariablesInQueries(queries: PostgresQueryForInterpolation[]): PostgresQueryForInterpolation[] { + interpolateVariablesInQueries( + queries: PostgresQueryForInterpolation[], + scopedVars: ScopedVars + ): PostgresQueryForInterpolation[] { let expandedQueries = queries; if (queries && queries.length > 0) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - rawSql: this.templateSrv.replace(query.rawSql, {}, this.interpolateVariable), + rawSql: this.templateSrv.replace(query.rawSql, scopedVars, this.interpolateVariable), }; return expandedQuery; }); diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index 4f2eded5a83..e6c79faa424 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -18,6 +18,7 @@ import { DataQueryResponseData, DataSourceApi, DataSourceInstanceSettings, + ScopedVars, } from '@grafana/data'; import { from, merge, Observable, of, forkJoin } from 'rxjs'; import { filter, map, tap } from 'rxjs/operators'; @@ -608,14 +609,14 @@ export class PrometheusDatasource extends DataSourceApi : { status: 'error', message: response.error }; } - interpolateVariablesInQueries(queries: PromQuery[]): PromQuery[] { + interpolateVariablesInQueries(queries: PromQuery[], scopedVars: ScopedVars): PromQuery[] { let expandedQueries = queries; if (queries && queries.length) { expandedQueries = queries.map(query => { const expandedQuery = { ...query, datasource: this.name, - expr: templateSrv.replace(query.expr, {}, this.interpolateQueryExpr), + expr: templateSrv.replace(query.expr, scopedVars, this.interpolateQueryExpr), }; return expandedQuery; });