diff --git a/public/app/plugins/datasource/graphite/datasource.ts b/public/app/plugins/datasource/graphite/datasource.ts index 335cb400834..82205f1754e 100644 --- a/public/app/plugins/datasource/graphite/datasource.ts +++ b/public/app/plugins/datasource/graphite/datasource.ts @@ -320,7 +320,7 @@ export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv method: 'GET', url: '/tags/autoComplete/tags', params: { - expr: _.map(expressions, expression => templateSrv.replace(expression)), + expr: _.map(expressions, expression => templateSrv.replace((expression || '').trim())), }, // for cancellations requestId: options.requestId, @@ -355,8 +355,8 @@ export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv method: 'GET', url: '/tags/autoComplete/values', params: { - expr: _.map(expressions, expression => templateSrv.replace(expression)), - tag: templateSrv.replace(tag), + expr: _.map(expressions, expression => templateSrv.replace((expression || '').trim())), + tag: templateSrv.replace((tag || '').trim()), }, // for cancellations requestId: options.requestId, diff --git a/public/app/plugins/datasource/graphite/specs/datasource_specs.ts b/public/app/plugins/datasource/graphite/specs/datasource_specs.ts index b97b4a56b2b..0fb68d06498 100644 --- a/public/app/plugins/datasource/graphite/specs/datasource_specs.ts +++ b/public/app/plugins/datasource/graphite/specs/datasource_specs.ts @@ -222,4 +222,99 @@ describe('graphiteDatasource', function() { expect(results.length).to.be(2); }); }); + + describe('querying for template variables', () => { + let results; + let requestOptions; + + beforeEach(() => { + ctx.backendSrv.datasourceRequest = function(options) { + requestOptions = options; + return ctx.$q.when({ + data: [{ target: 'prod1.count', datapoints: [[10, 1], [12, 1]] }], + }); + }; + }); + + it('should generate tags query', () => { + ctx.ds.metricFindQuery('tags()').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/tags'); + expect(requestOptions.params.expr).to.eql([]); + expect(results).not.to.be(null); + }); + + it('should generate tags query with a filter expression', () => { + ctx.ds.metricFindQuery('tags(server=backend_01)').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/tags'); + expect(requestOptions.params.expr).to.eql(['server=backend_01']); + expect(results).not.to.be(null); + }); + + it('should generate tag query for an expression with whitespace after', () => { + ctx.ds.metricFindQuery('tags(server=backend_01 )').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/tags'); + expect(requestOptions.params.expr).to.eql(['server=backend_01']); + expect(results).not.to.be(null); + }); + + it('should generate tag values query for one tag', () => { + ctx.ds.metricFindQuery('tag_values(server)').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/values'); + expect(requestOptions.params.tag).to.be('server'); + expect(requestOptions.params.expr).to.eql([]); + expect(results).not.to.be(null); + }); + + it('should generate tag values query for a tag and expression', () => { + ctx.ds.metricFindQuery('tag_values(server,server=~backend*)').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/values'); + expect(requestOptions.params.tag).to.be('server'); + expect(requestOptions.params.expr).to.eql(['server=~backend*']); + expect(results).not.to.be(null); + }); + + it('should generate tag values query for a tag with whitespace after', () => { + ctx.ds.metricFindQuery('tag_values(server )').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/values'); + expect(requestOptions.params.tag).to.be('server'); + expect(requestOptions.params.expr).to.eql([]); + expect(results).not.to.be(null); + }); + + it('should generate tag values query for a tag and expression with whitespace after', () => { + ctx.ds.metricFindQuery('tag_values(server , server=~backend* )').then(data => { + results = data; + }); + + ctx.$rootScope.$apply(); + expect(requestOptions.url).to.be('/tags/autoComplete/values'); + expect(requestOptions.params.tag).to.be('server'); + expect(requestOptions.params.expr).to.eql(['server=~backend*']); + expect(results).not.to.be(null); + }); + }); });