From 8a8a1b8e11262ee4ffcf373403877014d8677954 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Wed, 27 Mar 2019 11:43:17 +0100 Subject: [PATCH] Fix: Prometheus regex ad-hoc filters w/ wildcards (#16234) Fixes #14615. Removes extra escaping for regex filter values when using ad hoc filters for Prometheus. The extra escaping causes queries with regex characters to be invalid. --- .../datasource/prometheus/datasource.ts | 2 +- .../prometheus/specs/datasource.test.ts | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index 432a7fd6717..4ea1ff75764 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -215,7 +215,7 @@ export class PrometheusDatasource implements DataSourceApi { const { key, operator } = filter; let { value } = filter; if (operator === '=~' || operator === '!~') { - value = prometheusSpecialRegexEscape(value); + value = prometheusRegularEscape(value); } return addLabelToQuery(acc, key, value, operator); }, expr); diff --git a/public/app/plugins/datasource/prometheus/specs/datasource.test.ts b/public/app/plugins/datasource/prometheus/specs/datasource.test.ts index fa1f65007bc..4e3191e0b16 100644 --- a/public/app/plugins/datasource/prometheus/specs/datasource.test.ts +++ b/public/app/plugins/datasource/prometheus/specs/datasource.test.ts @@ -5,8 +5,8 @@ import { alignRange, extractRuleMappingFromGroups, PrometheusDatasource, - prometheusSpecialRegexEscape, prometheusRegularEscape, + prometheusSpecialRegexEscape, } from '../datasource'; jest.mock('../metric_find_query'); @@ -91,6 +91,25 @@ describe('PrometheusDatasource', () => { const result = ctx.ds.createQuery(target, { interval: '15s' }); expect(result).toMatchObject({ expr: 'metric{job="foo",k1="v1",k2!="v2"} - metric{k1="v1",k2!="v2"}' }); }); + + it('should add escaping if needed to regex filter expressions', () => { + ctx.templateSrvMock.getAdhocFilters = () => [ + { + key: 'k1', + operator: '=~', + value: 'v.*', + }, + { + key: 'k2', + operator: '=~', + value: `v'.*`, + }, + ]; + const result = ctx.ds.createQuery(target, { interval: '15s' }); + expect(result).toMatchObject({ + expr: `metric{job="foo",k1=~"v.*",k2=~"v\\\\'.*"} - metric{k1=~"v.*",k2=~"v\\\\'.*"}`, + }); + }); }); describe('When performing performSuggestQuery', () => {