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', () => {