diff --git a/pkg/tsdb/graphite/graphite.go b/pkg/tsdb/graphite/graphite.go index 774bca4bca2..a2783a107fe 100644 --- a/pkg/tsdb/graphite/graphite.go +++ b/pkg/tsdb/graphite/graphite.go @@ -57,7 +57,11 @@ func (e *GraphiteExecutor) Execute(ctx context.Context, queries tsdb.QuerySlice, } for _, query := range queries { - formData["target"] = []string{query.Model.Get("target").MustString()} + if fullTarget, err := query.Model.Get("targetFull").String(); err == nil { + formData["target"] = []string{fullTarget} + } else { + formData["target"] = []string{query.Model.Get("target").MustString()} + } } if setting.Env == setting.DEV { diff --git a/public/app/plugins/datasource/graphite/query_ctrl.ts b/public/app/plugins/datasource/graphite/query_ctrl.ts index 93977dc143d..30f17554d2b 100644 --- a/public/app/plugins/datasource/graphite/query_ctrl.ts +++ b/public/app/plugins/datasource/graphite/query_ctrl.ts @@ -209,17 +209,40 @@ export class GraphiteQueryCtrl extends QueryCtrl { this.panelCtrl.refresh(); } + updateModelTarget() { + // render query + var metricPath = this.getSegmentPathUpTo(this.segments.length); + this.target.target = _.reduce(this.functions, this.wrapFunction, metricPath); + + // render nested query + var targetsByRefId = _.keyBy(this.panelCtrl.panel.targets, 'refId'); + var nestedSeriesRefRegex = /\#([A-Z])/g; + var targetWithNestedQueries = this.target.target.replace(nestedSeriesRefRegex, (match, g1) => { + var target = targetsByRefId[g1]; + if (!target) { + return match; + } + + return target.targetFull || target.target; + }); + + delete this.target.targetFull; + if (this.target.target !== targetWithNestedQueries) { + this.target.targetFull = targetWithNestedQueries; + } + } + targetChanged() { if (this.error) { return; } var oldTarget = this.target.target; - var target = this.getSegmentPathUpTo(this.segments.length); - this.target.target = _.reduce(this.functions, this.wrapFunction, target); + this.updateModelTarget(); if (this.target.target !== oldTarget) { - if (this.segments[this.segments.length - 1].value !== 'select metric') { + var lastSegment = this.segments.length > 0 ? this.segments[this.segments.length - 1] : {}; + if (lastSegment.value !== 'select metric') { this.panelCtrl.refresh(); } }