diff --git a/public/app/plugins/datasource/prometheus/datasource.test.ts b/public/app/plugins/datasource/prometheus/datasource.test.ts index 125d0b25592..03dcf33208d 100644 --- a/public/app/plugins/datasource/prometheus/datasource.test.ts +++ b/public/app/plugins/datasource/prometheus/datasource.test.ts @@ -831,6 +831,55 @@ describe('PrometheusDatasource', () => { const result = ds.applyTemplateVariables(query, {}); expect(result).toMatchObject({ expr: 'test{job="bar", k1="v1", k2!="v2"}' }); }); + + it('should add ad-hoc filters only to expr', () => { + replaceMock.mockImplementation((a: string) => a?.replace('$A', '99') ?? a); + getAdhocFiltersMock.mockReturnValue([ + { + key: 'k1', + operator: '=', + value: 'v1', + }, + { + key: 'k2', + operator: '!=', + value: 'v2', + }, + ]); + + const query = { + expr: 'test{job="bar"} > $A', + refId: 'A', + }; + + const result = ds.applyTemplateVariables(query, {}); + expect(result).toMatchObject({ expr: 'test{job="bar", k1="v1", k2!="v2"} > 99' }); + }); + + it('should add ad-hoc filters only to expr and expression has template variable as label value??', () => { + const searchPattern = /\$A/g; + replaceMock.mockImplementation((a: string) => a?.replace(searchPattern, '99') ?? a); + getAdhocFiltersMock.mockReturnValue([ + { + key: 'k1', + operator: '=', + value: 'v1', + }, + { + key: 'k2', + operator: '!=', + value: 'v2', + }, + ]); + + const query = { + expr: 'test{job="$A"} > $A', + refId: 'A', + }; + + const result = ds.applyTemplateVariables(query, {}); + expect(result).toMatchObject({ expr: 'test{job="99", k1="v1", k2!="v2"} > 99' }); + }); }); describe('metricFindQuery', () => { diff --git a/public/app/plugins/datasource/prometheus/datasource.tsx b/public/app/plugins/datasource/prometheus/datasource.tsx index c233cb1d6ca..694f61824f8 100644 --- a/public/app/plugins/datasource/prometheus/datasource.tsx +++ b/public/app/plugins/datasource/prometheus/datasource.tsx @@ -1253,14 +1253,17 @@ export class PrometheusDatasource delete variables.__interval; delete variables.__interval_ms; - //Add ad hoc filters - const expr = this.enhanceExprWithAdHocFilters(target.expr); + // interpolate expression + const expr = this.templateSrv.replace(target.expr, variables, this.interpolateQueryExpr); + + // Add ad hoc filters + const exprWithAdHocFilters = this.enhanceExprWithAdHocFilters(expr); return { ...target, - legendFormat: this.templateSrv.replace(target.legendFormat, variables), - expr: this.templateSrv.replace(expr, variables, this.interpolateQueryExpr), + expr: exprWithAdHocFilters, interval: this.templateSrv.replace(target.interval, variables), + legendFormat: this.templateSrv.replace(target.legendFormat, variables), }; }