From 20b07fae6f190abe1a433e18364b74682aad0644 Mon Sep 17 00:00:00 2001 From: Sven Grossmann Date: Fri, 9 Sep 2022 12:04:51 +0200 Subject: [PATCH] fix bug in loki's adhoc filters (#54920) --- .../plugins/datasource/loki/datasource.test.ts | 16 ++++++++++++++++ public/app/plugins/datasource/loki/datasource.ts | 5 +++-- .../querybuilder/shared/parsingUtils.ts | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts index b7efeb0004c..11da36c2698 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -639,6 +639,22 @@ describe('LokiDatasource', () => { it('then the correct label should be added for metrics query', () => { assertAdHocFilters('rate({bar="baz"}[5m])', 'rate({bar="baz", job="grafana"}[5m])', ds); }); + + it('then the correct label should be added for metrics query and variable', () => { + assertAdHocFilters('rate({bar="baz"}[$__interval])', 'rate({bar="baz", job="grafana"}[$__interval])', ds); + }); + + it('then the correct label should be added for logs query with empty selector', () => { + assertAdHocFilters('{}', '{job="grafana"}', ds); + }); + + it('then the correct label should be added for metrics query with empty selector', () => { + assertAdHocFilters('rate({}[5m])', 'rate({job="grafana"}[5m])', ds); + }); + + it('then the correct label should be added for metrics query with empty selector and variable', () => { + assertAdHocFilters('rate({}[$__interval])', 'rate({job="grafana"}[$__interval])', ds); + }); }); describe('and query has parser', () => { it('then the correct label should be added for logs query', () => { diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index 7ba38064dde..761de171144 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -43,6 +43,7 @@ import { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_sr import { serializeParams } from '../../../core/utils/fetch'; import { renderLegendFormat } from '../prometheus/legend'; +import { replaceVariables, returnVariables } from '../prometheus/querybuilder/shared/parsingUtils'; import LanguageProvider from './LanguageProvider'; import { transformBackendResult } from './backendResultTransformer'; @@ -698,14 +699,14 @@ export class LokiDatasource addAdHocFilters(queryExpr: string) { const adhocFilters = this.templateSrv.getAdhocFilters(this.name); - let expr = queryExpr; + let expr = replaceVariables(queryExpr); expr = adhocFilters.reduce((acc: string, filter: { key: string; operator: string; value: string }) => { const { key, operator, value } = filter; return this.addLabelToQuery(acc, key, operator, value); }, expr); - return expr; + return returnVariables(expr); } addLabelToQuery(queryExpr: string, key: string, operator: string, value: string) { diff --git a/public/app/plugins/datasource/prometheus/querybuilder/shared/parsingUtils.ts b/public/app/plugins/datasource/prometheus/querybuilder/shared/parsingUtils.ts index 9d939ebc5c0..21d0d1e268e 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/shared/parsingUtils.ts +++ b/public/app/plugins/datasource/prometheus/querybuilder/shared/parsingUtils.ts @@ -65,7 +65,7 @@ const varTypeFunc = [ * Get back the text with variables in their original format. * @param expr */ -function returnVariables(expr: string) { +export function returnVariables(expr: string) { return expr.replace(/__V_(\d)__(.+?)__V__(?:__F__(\w+)__F__)?/g, (match, type, v, f) => { return varTypeFunc[parseInt(type, 10)](v, f); });