From cc7aae154c8804554781080e4369965c746cc8e8 Mon Sep 17 00:00:00 2001 From: Matias Chomicki Date: Tue, 2 Jul 2024 14:23:19 +0200 Subject: [PATCH] Loki datasource: interpolate query before adding adhoc filters (#89849) * Loki datasource: interpolate query before adding adhoc filters * Chore: remove unused export * Prettier * Chore: made test case more obvious --- .../datasource/loki/datasource.test.ts | 33 +++++++++++++++++++ .../app/plugins/datasource/loki/datasource.ts | 10 ++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts index 78643f1c3ae..ea0292f3630 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -271,6 +271,39 @@ describe('LokiDatasource', () => { 'rate({bar="baz", job="foo", k1=~"v.*", k2=~"v\\\\\'.*"} |= "bar" [5m])' ); }); + + it('should interpolate before adding adhoc filters', async () => { + const originalQuery = 'rate({bar="baz", job="foo"} |= "bar" [$__auto])'; + const interpolatedQuery = 'rate({bar="baz", job="foo"} |= "bar" [5m])'; + const templateSrv = { + replace: jest.fn().mockImplementation((input: string) => interpolatedQuery), + getVariables: () => [], + }; + const query: LokiQuery = { expr: originalQuery, refId: 'A' }; + const ds = createLokiDatasource(templateSrv); + const adhocFilters = [ + { + key: 'k1', + operator: '=', + value: 'v1', + }, + { + key: 'k2', + operator: '!=', + value: 'v2', + }, + ]; + jest.spyOn(ds, 'addAdHocFilters'); + + ds.applyTemplateVariables(query, {}, adhocFilters); + + expect(templateSrv.replace).toHaveBeenCalledWith(originalQuery, expect.any(Object), expect.any(Function)); + expect(ds.addAdHocFilters).toHaveBeenCalledWith(interpolatedQuery, adhocFilters); + + expect(ds.applyTemplateVariables(query, {}, adhocFilters).expr).toBe( + 'rate({bar="baz", job="foo", k1="v1", k2!="v2"} |= "bar" [5m])' + ); + }); }); describe('when interpolating variables', () => { diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index 5c25286fc3a..e63c317ff30 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -1089,8 +1089,6 @@ export class LokiDatasource // alerting/ML queries and we want to have consistent interpolation for all queries const { __auto, __interval, __interval_ms, __range, __range_s, __range_ms, ...rest } = scopedVars || {}; - const exprWithAdHoc = this.addAdHocFilters(target.expr, adhocFilters); - const variables = { ...rest, @@ -1102,10 +1100,16 @@ export class LokiDatasource value: '$__interval_ms', }, }; + + const exprWithAdHoc = this.addAdHocFilters( + this.templateSrv.replace(target.expr, variables, this.interpolateQueryExpr), + adhocFilters + ); + return { ...target, legendFormat: this.templateSrv.replace(target.legendFormat, rest), - expr: this.templateSrv.replace(exprWithAdHoc, variables, this.interpolateQueryExpr), + expr: exprWithAdHoc, }; }