diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts index cb34da275cb..63fc180497a 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts @@ -76,6 +76,36 @@ describe('buildVisualQueryFromString', () => { ); }); + it('parses query with line filter and escaped quote', () => { + expect(buildVisualQueryFromString('{app="frontend"} |= "\\"line"')).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [{ id: LokiOperationId.LineContains, params: ['"line'] }], + }) + ); + }); + + it('parses query with label filter and escaped quote', () => { + expect(buildVisualQueryFromString('{app="frontend"} | bar="\\"baz"')).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [{ id: LokiOperationId.LabelFilter, params: ['bar', '=', '"baz'] }], + }) + ); + }); + it('returns error for query with ip matching line filter', () => { const context = buildVisualQueryFromString('{app="frontend"} |= ip("192.168.4.5/16") | logfmt'); expect(context).toEqual( diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.ts index 9fbaa784c00..66947c05924 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.ts @@ -576,7 +576,10 @@ function isIntervalVariableError(node: SyntaxNode) { function handleQuotes(string: string) { if (string[0] === `"` && string[string.length - 1] === `"`) { - return string.replace(/"/g, '').replace(/\\\\/g, '\\'); + return string + .substring(1, string.length - 1) + .replace(/\\"/g, '"') + .replace(/\\\\/g, '\\'); } return string.replace(/`/g, ''); }