From 745b101d41337b49a214ea0556456ba63441e991 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Fri, 27 May 2022 14:00:51 +0200 Subject: [PATCH] Loki: Fix unwrap parsing (#49732) --- package.json | 2 +- .../loki/querybuilder/parsing.test.ts | 44 ++++++++++++++++++ .../datasource/loki/querybuilder/parsing.ts | 45 ++++++++++++------- yarn.lock | 10 ++--- 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 86cd1b81b21..438613cad6a 100644 --- a/package.json +++ b/package.json @@ -253,7 +253,7 @@ "@grafana/e2e-selectors": "workspace:*", "@grafana/experimental": "^0.0.2-canary.30", "@grafana/google-sdk": "0.0.3", - "@grafana/lezer-logql": "^0.0.11", + "@grafana/lezer-logql": "^0.0.12", "@grafana/runtime": "workspace:*", "@grafana/schema": "workspace:*", "@grafana/slate-react": "0.22.10-grafana", diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts index 51201da9d36..ca0fbaee3c3 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.test.ts @@ -220,6 +220,50 @@ describe('buildVisualQueryFromString', () => { ); }); + it('parses query with with unwrap and error filter', () => { + expect( + buildVisualQueryFromString('sum_over_time({app="frontend"} | logfmt | unwrap duration | __error__="" [1m])') + ).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [ + { id: 'logfmt', params: [] }, + { id: 'unwrap', params: ['duration'] }, + { id: '__label_filter_no_errors', params: [] }, + { id: 'sum_over_time', params: ['1m'] }, + ], + }) + ); + }); + + it('parses query with with unwrap and label filter', () => { + expect( + buildVisualQueryFromString('sum_over_time({app="frontend"} | logfmt | unwrap duration | label="value" [1m])') + ).toEqual( + noErrors({ + labels: [ + { + op: '=', + value: 'frontend', + label: 'app', + }, + ], + operations: [ + { id: 'logfmt', params: [] }, + { id: 'unwrap', params: ['duration'] }, + { id: '__label_filter', params: ['label', '=', 'value'] }, + { id: 'sum_over_time', params: ['1m'] }, + ], + }) + ); + }); + it('returns error for query with unwrap and conversion operation', () => { const context = buildVisualQueryFromString( 'sum_over_time({app="frontend"} | logfmt | unwrap duration(label) [5m])' diff --git a/public/app/plugins/datasource/loki/querybuilder/parsing.ts b/public/app/plugins/datasource/loki/querybuilder/parsing.ts index 39b38c0f848..f46bb546d4c 100644 --- a/public/app/plugins/datasource/loki/querybuilder/parsing.ts +++ b/public/app/plugins/datasource/loki/querybuilder/parsing.ts @@ -120,7 +120,7 @@ export function handleExpression(expr: string, node: SyntaxNode, context: Contex } case 'UnwrapExpr': { - const { operation, error } = getUnwrap(expr, node); + const { operation, error } = handleUnwrapExpr(expr, node, context); if (operation) { visQuery.operations.push(operation); } @@ -297,25 +297,40 @@ function getLabelFormat(expr: string, node: SyntaxNode): QueryBuilderOperation { }; } -function getUnwrap(expr: string, node: SyntaxNode): { operation?: QueryBuilderOperation; error?: string } { - // Check for nodes not supported in visual builder and return error - if (node.getChild('ConvOp')) { +function handleUnwrapExpr( + expr: string, + node: SyntaxNode, + context: Context +): { operation?: QueryBuilderOperation; error?: string } { + const unwrapExprChild = node.getChild('UnwrapExpr'); + const labelFilterChild = node.getChild('LabelFilter'); + const unwrapChild = node.getChild('Unwrap'); + + if (unwrapExprChild) { + handleExpression(expr, unwrapExprChild, context); + } + + if (labelFilterChild) { + handleExpression(expr, labelFilterChild, context); + } + + if (unwrapChild) { + if (unwrapChild?.nextSibling?.type.name === 'ConvOp') { + return { + error: 'Unwrap with conversion operator not supported in query builder', + }; + } + return { - error: 'Unwrap with conversion operator not supported in query builder', + operation: { + id: 'unwrap', + params: [getString(expr, unwrapChild?.nextSibling)], + }, }; } - const id = 'unwrap'; - const string = getString(expr, node.getChild('Identifier')); - - return { - operation: { - id, - params: [string], - }, - }; + return {}; } - function handleRangeAggregation(expr: string, node: SyntaxNode, context: Context) { const nameNode = node.getChild('RangeOp'); const funcName = getString(expr, nameNode); diff --git a/yarn.lock b/yarn.lock index 705de64723b..0ad644fcce9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4011,14 +4011,14 @@ __metadata: languageName: node linkType: hard -"@grafana/lezer-logql@npm:^0.0.11": - version: 0.0.11 - resolution: "@grafana/lezer-logql@npm:0.0.11" +"@grafana/lezer-logql@npm:^0.0.12": + version: 0.0.12 + resolution: "@grafana/lezer-logql@npm:0.0.12" dependencies: lezer: ^0.13.5 peerDependencies: "@lezer/lr": ^0.15.8 - checksum: 0427e59528ea5092e53a70b9b6be37b0ed29ca4c0ddf452cc192f8bd14d21a725ba1959b2e33e7567b42e4d0391cff4e4f36c249d7099a157d0f1e9093ba64e4 + checksum: d28780b41a97b69a427390ef746e09a131e6a151be0894763e5cfe26fa16ae37fa5fe7409ea956f5e29974a5966162318a51bcd47422e9a3e609ca43340bbdcb languageName: node linkType: hard @@ -19715,7 +19715,7 @@ __metadata: "@grafana/eslint-config": 3.0.0 "@grafana/experimental": ^0.0.2-canary.30 "@grafana/google-sdk": 0.0.3 - "@grafana/lezer-logql": ^0.0.11 + "@grafana/lezer-logql": ^0.0.12 "@grafana/runtime": "workspace:*" "@grafana/schema": "workspace:*" "@grafana/slate-react": 0.22.10-grafana