From 6452e9665e64f518cdf3c879989379166297693b Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:15:25 +0300 Subject: [PATCH] [v11.1.x] Loki datasource: interpolate query before adding adhoc filters (#90114) 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 (cherry picked from commit cc7aae154c8804554781080e4369965c746cc8e8) Co-authored-by: Matias Chomicki --- .../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 273622cc082..37cb65cf676 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -270,6 +270,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 c6fcbd565da..a8763c0a764 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -1078,8 +1078,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, @@ -1091,10 +1089,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, }; }