diff --git a/public/app/plugins/datasource/stackdriver/datasource.ts b/public/app/plugins/datasource/stackdriver/datasource.ts index 15c6350c8a0..4c1f07e0a06 100644 --- a/public/app/plugins/datasource/stackdriver/datasource.ts +++ b/public/app/plugins/datasource/stackdriver/datasource.ts @@ -40,9 +40,7 @@ export default class StackdriverDatasource implements DataSourceApi { - return this.templateSrv.replace(f, options.scopedVars || {}); - }), + filters: this.interpolateFilters(t.filters, options.scopedVars), aliasBy: this.templateSrv.replace(t.aliasBy, options.scopedVars || {}), type: 'timeSeriesQuery', }; @@ -64,7 +62,13 @@ export default class StackdriverDatasource implements DataSourceApi { + return this.templateSrv.replace(f, scopedVars || {}, 'regex'); + }); + } + + async getLabels(metricType: string, refId: string) { const response = await this.getTimeSeries({ targets: [ { diff --git a/public/app/plugins/datasource/stackdriver/specs/datasource.test.ts b/public/app/plugins/datasource/stackdriver/specs/datasource.test.ts index 46cdd77b7a9..032f10d8ca5 100644 --- a/public/app/plugins/datasource/stackdriver/specs/datasource.test.ts +++ b/public/app/plugins/datasource/stackdriver/specs/datasource.test.ts @@ -1,7 +1,8 @@ import StackdriverDataSource from '../datasource'; import { metricDescriptors } from './testData'; import moment from 'moment'; -import { TemplateSrvStub } from 'test/specs/helpers'; +import { TemplateSrv } from 'app/features/templating/template_srv'; +import { CustomVariable } from 'app/features/templating/all'; describe('StackdriverDataSource', () => { const instanceSettings = { @@ -9,7 +10,7 @@ describe('StackdriverDataSource', () => { defaultProject: 'testproject', }, }; - const templateSrv = new TemplateSrvStub(); + const templateSrv = new TemplateSrv(); const timeSrv = {}; describe('when performing testDataSource', () => { @@ -154,15 +155,41 @@ describe('StackdriverDataSource', () => { }); }); + describe('when interpolating a template variable for the filter', () => { + let interpolated; + describe('and is single value variable', () => { + beforeEach(() => { + const filterTemplateSrv = initTemplateSrv('filtervalue1'); + const ds = new StackdriverDataSource(instanceSettings, {}, filterTemplateSrv, timeSrv); + interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '${test}'], {}); + }); + + it('should replace the variable with the value', () => { + expect(interpolated.length).toBe(3); + expect(interpolated[2]).toBe('filtervalue1'); + }); + }); + + describe('and is multi value variable', () => { + beforeEach(() => { + const filterTemplateSrv = initTemplateSrv(['filtervalue1', 'filtervalue2'], true); + const ds = new StackdriverDataSource(instanceSettings, {}, filterTemplateSrv, timeSrv); + interpolated = ds.interpolateFilters(['resource.label.zone', '=~', '[[test]]'], {}); + }); + + it('should replace the variable with a regex expression', () => { + expect(interpolated[2]).toBe('(filtervalue1|filtervalue2)'); + }); + }); + }); + describe('when interpolating a template variable for group bys', () => { let interpolated; describe('and is single value variable', () => { beforeEach(() => { - templateSrv.data = { - test: 'groupby1', - }; - const ds = new StackdriverDataSource(instanceSettings, {}, templateSrv, timeSrv); + const groupByTemplateSrv = initTemplateSrv('groupby1'); + const ds = new StackdriverDataSource(instanceSettings, {}, groupByTemplateSrv, timeSrv); interpolated = ds.interpolateGroupBys(['[[test]]'], {}); }); @@ -174,10 +201,8 @@ describe('StackdriverDataSource', () => { describe('and is multi value variable', () => { beforeEach(() => { - templateSrv.data = { - test: 'groupby1,groupby2', - }; - const ds = new StackdriverDataSource(instanceSettings, {}, templateSrv, timeSrv); + const groupByTemplateSrv = initTemplateSrv(['groupby1', 'groupby2'], true); + const ds = new StackdriverDataSource(instanceSettings, {}, groupByTemplateSrv, timeSrv); interpolated = ds.interpolateGroupBys(['[[test]]'], {}); }); @@ -241,3 +266,19 @@ describe('StackdriverDataSource', () => { }); }); }); +function initTemplateSrv(values: any, multi = false) { + const templateSrv = new TemplateSrv(); + templateSrv.init([ + new CustomVariable( + { + name: 'test', + current: { + value: values, + }, + multi: multi, + }, + {} + ), + ]); + return templateSrv; +} diff --git a/public/app/plugins/datasource/stackdriver/types.ts b/public/app/plugins/datasource/stackdriver/types.ts index 83909bbafce..b9a6893d4bd 100644 --- a/public/app/plugins/datasource/stackdriver/types.ts +++ b/public/app/plugins/datasource/stackdriver/types.ts @@ -30,14 +30,14 @@ export interface StackdriverQuery extends DataQuery { refId: string; crossSeriesReducer: string; alignmentPeriod?: string; - perSeriesAligner?: string; + perSeriesAligner: string; groupBys?: string[]; filters?: string[]; aliasBy?: string; - metricKind?: string; - valueType?: string; - datasourceId: number; - view: string; + metricKind: string; + valueType: string; + datasourceId?: number; + view?: string; } export interface AnnotationTarget {