From e2188373809edb44d74b34f7060b074bc81d330c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 9 Jan 2017 15:31:19 +0100 Subject: [PATCH] began work on built in template variables, #7190 --- public/app/features/panel/metrics_panel_ctrl.ts | 9 ++++++++- .../templating/specs/template_srv_specs.ts | 12 ++++++++++++ public/app/features/templating/templateSrv.js | 6 +++--- .../datasource/elasticsearch/datasource.js | 16 ++-------------- .../datasource/elasticsearch/query_builder.js | 4 ++-- .../plugins/datasource/influxdb/datasource.ts | 6 +++--- 6 files changed, 30 insertions(+), 23 deletions(-) diff --git a/public/app/features/panel/metrics_panel_ctrl.ts b/public/app/features/panel/metrics_panel_ctrl.ts index aba4492401b..66e624911e2 100644 --- a/public/app/features/panel/metrics_panel_ctrl.ts +++ b/public/app/features/panel/metrics_panel_ctrl.ts @@ -191,6 +191,13 @@ class MetricsPanelCtrl extends PanelCtrl { return this.$q.when([]); } + // make shallow copy of scoped vars, + // and add built in variables interval and interval_ms + var scopedVars = Object.assign({}, this.panel.scopedVars, { + "__interval": {text: this.interval, value: this.interval}, + "__interval_ms": {text: this.intervalMs, value: this.intervalMs}, + }); + var metricsQuery = { panelId: this.panel.id, range: this.range, @@ -200,7 +207,7 @@ class MetricsPanelCtrl extends PanelCtrl { targets: this.panel.targets, format: this.panel.renderer === 'png' ? 'png' : 'json', maxDataPoints: this.resolution, - scopedVars: this.panel.scopedVars, + scopedVars: scopedVars, cacheTimeout: this.panel.cacheTimeout }; diff --git a/public/app/features/templating/specs/template_srv_specs.ts b/public/app/features/templating/specs/template_srv_specs.ts index ca336e97ba3..5826e359c01 100644 --- a/public/app/features/templating/specs/template_srv_specs.ts +++ b/public/app/features/templating/specs/template_srv_specs.ts @@ -239,4 +239,16 @@ describe('templateSrv', function() { expect(target).to.be('Server: All, period: 13m'); }); }); + + describe('built in interval variables', function() { + beforeEach(function() { + initTemplateSrv([]); + }); + + it('should replace $interval_ms with interval milliseconds', function() { + var target = _templateSrv.replace('10 * $interval_ms', {"interval_ms": {text: "100", value: "100"}}); + expect(target).to.be('10 * 100'); + }); + + }); }); diff --git a/public/app/features/templating/templateSrv.js b/public/app/features/templating/templateSrv.js index a41f5a9d0f3..6abd4dd69e4 100644 --- a/public/app/features/templating/templateSrv.js +++ b/public/app/features/templating/templateSrv.js @@ -100,10 +100,10 @@ function (angular, _, kbn) { return this.distributeVariable(value, variable.name); } default: { - if (typeof value === 'string') { - return value; + if (_.isArray(value)) { + return '{' + value.join(',') + '}'; } - return '{' + value.join(',') + '}'; + return value; } } }; diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index 5e4d5370ba1..94fa75bf2eb 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -197,15 +197,9 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes target = options.targets[i]; if (target.hide) {continue;} - var queryObj = this.queryBuilder.build(target, adhocFilters); + var queryString = templateSrv.replace(target.query || '*', options.scopedVars, 'lucene'); + var queryObj = this.queryBuilder.build(target, adhocFilters, queryString); var esQuery = angular.toJson(queryObj); - var luceneQuery = target.query || '*'; - luceneQuery = templateSrv.replace(luceneQuery, options.scopedVars, 'lucene'); - luceneQuery = angular.toJson(luceneQuery); - - // remove inner quotes - luceneQuery = luceneQuery.substr(1, luceneQuery.length - 2); - esQuery = esQuery.replace("$lucene_query", luceneQuery); var searchType = (queryObj.size === 0 && this.esVersion < 5) ? 'count' : 'query_then_fetch'; var header = this.getQueryHeader(searchType, options.range.from, options.range.to); @@ -219,12 +213,6 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes return $q.when([]); } - // intervalSec: interval in seconds - if (options.interval && options.interval.match(kbn.interval_regex)) { - payload = payload.replace(/\$intervalSec/g, kbn.interval_to_seconds(options.interval)); - payload = payload.replace(/\$intervalMs/g, kbn.interval_to_ms(options.interval)); - } - payload = payload.replace(/\$interval/g, options.interval); payload = payload.replace(/\$timeFrom/g, options.range.from.valueOf()); payload = payload.replace(/\$timeTo/g, options.range.to.valueOf()); payload = templateSrv.replace(payload, options.scopedVars); diff --git a/public/app/plugins/datasource/elasticsearch/query_builder.js b/public/app/plugins/datasource/elasticsearch/query_builder.js index 62f5ed2a994..02b74fd4ee3 100644 --- a/public/app/plugins/datasource/elasticsearch/query_builder.js +++ b/public/app/plugins/datasource/elasticsearch/query_builder.js @@ -121,7 +121,7 @@ function (queryDef) { } }; - ElasticQueryBuilder.prototype.build = function(target, adhocFilters) { + ElasticQueryBuilder.prototype.build = function(target, adhocFilters, queryString) { // make sure query has defaults; target.metrics = target.metrics || [{ type: 'count', id: '1' }]; target.dsType = 'elasticsearch'; @@ -138,7 +138,7 @@ function (queryDef) { { "query_string": { "analyze_wildcard": true, - "query": '$lucene_query' + "query": queryString, } } ] diff --git a/public/app/plugins/datasource/influxdb/datasource.ts b/public/app/plugins/datasource/influxdb/datasource.ts index 28f13752dbe..dc6aaaf7a03 100644 --- a/public/app/plugins/datasource/influxdb/datasource.ts +++ b/public/app/plugins/datasource/influxdb/datasource.ts @@ -45,7 +45,7 @@ export default class InfluxDatasource { query(options) { var timeFilter = this.getTimeFilter(options); - var scopedVars = options.scopedVars ? _.cloneDeep(options.scopedVars) : {}; + var scopedVars = options.scopedVars; var targets = _.cloneDeep(options.targets); var queryTargets = []; var queryModel; @@ -56,8 +56,8 @@ export default class InfluxDatasource { queryTargets.push(target); - // build query - scopedVars.interval = {value: target.interval || options.interval}; + // backward compatability + scopedVars.interval = scopedVars.__interval; queryModel = new InfluxQuery(target, this.templateSrv, scopedVars); return queryModel.render(true);