From bdc079ebcbcfa76ab22e3af517e876b8e21a1ddc Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 11:29:10 +0100 Subject: [PATCH] [release-12.0.3] Graphite: Fix nested variable interpolation for repeated rows (#107565) Graphite: Fix nested variable interpolation for repeated rows (#106976) * Fix for repeated row variables * Add unit tests --------- (cherry picked from commit f7667f44db48b2c93a13c20a784b604f649ab3ed) Co-authored-by: Andreas Christou Co-authored-by: Ivan Ortega --- .../datasource/graphite/datasource.test.ts | 46 +++++++++++++++++++ .../plugins/datasource/graphite/datasource.ts | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/public/app/plugins/datasource/graphite/datasource.test.ts b/public/app/plugins/datasource/graphite/datasource.test.ts index 228611c2a6e..f2a73ded7eb 100644 --- a/public/app/plugins/datasource/graphite/datasource.test.ts +++ b/public/app/plugins/datasource/graphite/datasource.test.ts @@ -464,6 +464,52 @@ describe('graphiteDatasource', () => { expect(results[2]).toBe('target=' + encodeURIComponent('asPercent(aMetricName,sumSeries(aMetricName))')); }); + it('should use scoped variables when nesting query references', () => { + ctx.templateSrv.init([{ type: 'query', name: 'metric', current: { value: ['globalValue'] } }]); + + const originalTargetMap = { + A: '$metric', + B: 'sumSeries(#A)', + }; + + const scopedVars = { + metric: { text: 'scopedValue', value: 'scopedValue' }, + }; + + const results = ctx.ds.buildGraphiteParams( + { + targets: [{ target: '$metric' }, { target: 'sumSeries(#A)' }], + }, + originalTargetMap, + scopedVars + ); + + expect(results[1]).toBe('target=' + encodeURIComponent('sumSeries(scopedValue)')); + }); + + it('should apply scoped variables to nested references with hidden targets', () => { + ctx.templateSrv.init([{ type: 'query', name: 'server', current: { value: ['global'] } }]); + + const originalTargetMap = { + A: '$server.cpu', + B: 'avg(#A)', + }; + + const scopedVars = { + server: { text: 'web01', value: 'web01' }, + }; + + const results = ctx.ds.buildGraphiteParams( + { + targets: [{ target: '$server.cpu', hide: true }, { target: 'avg(#A)' }], + }, + originalTargetMap, + scopedVars + ); + + expect(results[0]).toBe('target=' + encodeURIComponent('avg(web01.cpu)')); + }); + it('should fix wrong minute interval parameters', () => { const originalTargetMap = { A: "summarize(prod.25m.count, '25m', 'sum')", diff --git a/public/app/plugins/datasource/graphite/datasource.ts b/public/app/plugins/datasource/graphite/datasource.ts index 119f3f8d405..3f924dce7b5 100644 --- a/public/app/plugins/datasource/graphite/datasource.ts +++ b/public/app/plugins/datasource/graphite/datasource.ts @@ -1046,7 +1046,7 @@ export class GraphiteDatasource } targetValue = targets[target.refId]; - targetValue = this.templateSrv.replace(targetValue.replace(regex, nestedSeriesRegexReplacer)); + targetValue = this.templateSrv.replace(targetValue.replace(regex, nestedSeriesRegexReplacer), scopedVars); targets[target.refId] = targetValue; if (!target.hide) {