From 98bb8bf7612a133a47ee171d3a256a29473a4f5f Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanda Date: Sat, 25 Nov 2017 02:35:29 +0900 Subject: [PATCH] prometheus nested query support --- .../plugins/datasource/prometheus/datasource.ts | 8 ++++++++ .../prometheus/specs/datasource_specs.ts | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index c4939b5b2fa..7e21852f476 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -155,6 +155,7 @@ export class PrometheusDatasource { // Only replace vars in expression after having (possibly) updated interval vars query.expr = this.templateSrv.replace(target.expr, scopedVars, this.interpolateQueryExpr); + query.expr = this.replaceNestedQuery(query.expr, options); query.requestId = options.panelId + target.refId; return query; } @@ -269,6 +270,13 @@ export class PrometheusDatasource { }); } + replaceNestedQuery(query, options) { + return query.replace(/\#([A-Z])/g, (match, g1) => { + let replaceTarget = options.targets.find((t) => { return t.refId === g1; }); + return replaceTarget ? replaceTarget.expr : match; + }); + } + transformMetricData(md, options, start, end, step) { var dps = [], metricLabel = null; diff --git a/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts b/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts index 9d528c735de..67d861da1c6 100644 --- a/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts +++ b/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts @@ -590,4 +590,19 @@ describe('PrometheusDatasource', function() { expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000); }); }); + describe('The nested query', function() { + it('should generate correct query', function() { + let query = 'sum(rate(#A[1m]))'; + let options = { + targets: [ + { + refId: 'A', + expr: 'http_requests_total' + } + ] + }; + let result = ctx.ds.replaceNestedQuery(query, options); + expect(result).to.be('sum(rate(http_requests_total[1m]))'); + }); + }); });