From 89e77d072f5a613ec91640df7b4040a307b5d928 Mon Sep 17 00:00:00 2001 From: Matias Chomicki Date: Wed, 18 Jan 2023 15:54:18 +0100 Subject: [PATCH] Loki Query Builder: Fix bug parsing range params (#61678) feat(loki-query-builder): fix bug parsing range params --- .../loki/querybuilder/parsing.test.ts | 21 +++++++++++++++++++ .../datasource/loki/querybuilder/parsing.ts | 7 ++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts index 78649cce714..52e88b8af2c 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts @@ -661,6 +661,27 @@ describe('buildVisualQueryFromString', () => { }) ); }); + + it.each(['$__interval', '5m'])('parses query range with unwrap and regex', (range) => { + expect( + buildVisualQueryFromString( + 'avg_over_time({test="value"} |= `restart counter is at` | regexp `restart counter is at (?P[0-9]+)s*.*.*?$` | unwrap restart_counter [' + + range + + '])' + ) + ).toEqual({ + errors: [], + query: { + labels: [{ label: 'test', op: '=', value: 'value' }], + operations: [ + { id: '__line_contains', params: ['restart counter is at'] }, + { id: 'regexp', params: ['restart counter is at (?P[0-9]+)s*.*.*?$'] }, + { id: 'unwrap', params: ['restart_counter', ''] }, + { id: 'avg_over_time', params: [range] }, + ], + }, + }); + }); }); function noErrors(query: LokiVisualQuery) { diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.ts index 8e15b2b8641..a248f491536 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.ts @@ -413,10 +413,11 @@ function handleRangeAggregation(expr: string, node: SyntaxNode, context: Context const number = node.getChild(NumberLezer); const logExpr = node.getChild(LogRangeExpr); const params = number !== null && number !== undefined ? [getString(expr, number)] : []; + const range = logExpr?.getChild(Range); + const rangeValue = range ? getString(expr, range) : null; - let match = getString(expr, node).match(/\[(.+)\]/); - if (match?.[1]) { - params.unshift(match[1]); + if (rangeValue) { + params.unshift(rangeValue.substring(1, rangeValue.length - 1)); } const op = {