diff --git a/package.json b/package.json index 57bd697edf5..3661601b38b 100644 --- a/package.json +++ b/package.json @@ -252,7 +252,7 @@ "@grafana/flamegraph": "workspace:*", "@grafana/google-sdk": "0.1.1", "@grafana/lezer-logql": "0.2.2", - "@grafana/lezer-traceql": "0.0.11", + "@grafana/lezer-traceql": "0.0.12", "@grafana/monaco-logql": "^0.0.7", "@grafana/runtime": "workspace:*", "@grafana/scenes": "1.27.0", diff --git a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.test.tsx b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.test.tsx index f8e21f40bd0..6af62515efd 100644 --- a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.test.tsx +++ b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.test.tsx @@ -2,10 +2,10 @@ import { computeErrorMessage, getErrorNodes } from './errorHighlighting'; describe('Check for syntax errors in query', () => { it.each([ - ['{span.http.status_code = }', 'Invalid value after comparison or aritmetic operator.'], - ['{span.http.status_code 200}', 'Invalid operator after field expression.'], + ['{span.http.status_code = }', 'Invalid value after comparison or arithmetic operator.'], + ['{span.http.status_code 200}', 'Invalid comparison operator after field expression.'], ['{span.http.status_code ""}', 'Invalid operator after field expression.'], - ['{span.http.status_code @ 200}', 'Invalid operator after field expression.'], + ['{span.http.status_code @ 200}', 'Invalid comparison operator after field expression.'], ['{span.http.status_code span.http.status_code}', 'Invalid operator after field expression.'], [ '{span.http.status_code = 200} {span.http.status_code = 200}', @@ -24,12 +24,12 @@ describe('Check for syntax errors in query', () => { '{span.http.status_code = 200} && {span.http.status_code = 200} | avg() > 3', 'Invalid expression for aggregator operator.', ], - ['{ 1 + 1 = 2 + }', 'Invalid value after comparison or aritmetic operator.'], + ['{ 1 + 1 = 2 + }', 'Invalid value after comparison or arithmetic operator.'], ['{ .a && }', 'Invalid value after logical operator.'], ['{ .a || }', 'Invalid value after logical operator.'], - ['{ .a + }', 'Invalid value after comparison or aritmetic operator.'], - ['{ 200 = 200 200 }', 'Invalid operator after field expression.'], - ['{.foo 300}', 'Invalid operator after field expression.'], + ['{ .a + }', 'Invalid value after comparison or arithmetic operator.'], + ['{ 200 = 200 200 }', 'Invalid comparison operator after field expression.'], + ['{.foo 300}', 'Invalid comparison operator after field expression.'], ['{.foo 300 && .bar = 200}', 'Invalid operator after field expression.'], ['{.foo 300 && .bar 200}', 'Invalid operator after field expression.'], ['{.foo=1} {.bar=2}', 'Invalid spanset combining operator after spanset expression.'], @@ -48,8 +48,8 @@ describe('Check for syntax errors in query', () => { ['{.}', 'Invalid expression for spanset.'], ['{ resource. }', 'Invalid expression for spanset.'], ['{ span. }', 'Invalid expression for spanset.'], - ['{.foo=}', 'Invalid value after comparison or aritmetic operator.'], - ['{.foo="}', 'Invalid value after comparison or aritmetic operator.'], + ['{.foo=}', 'Invalid value after comparison or arithmetic operator.'], + ['{.foo="}', 'Invalid value after comparison or arithmetic operator.'], ['{.foo=300} |', 'Invalid aggregation operator after pipepile operator.'], ['{.foo=300} && {.bar=200} |', 'Invalid aggregation operator after pipepile operator.'], ['{.foo=300} && {.bar=300} && {.foo=300} |', 'Invalid aggregation operator after pipepile operator.'], diff --git a/public/app/plugins/datasource/tempo/traceql/errorHighlighting.ts b/public/app/plugins/datasource/tempo/traceql/errorHighlighting.ts index bd49a30b80c..c3974d4300d 100644 --- a/public/app/plugins/datasource/tempo/traceql/errorHighlighting.ts +++ b/public/app/plugins/datasource/tempo/traceql/errorHighlighting.ts @@ -32,7 +32,7 @@ export const computeErrorMessage = (errorNode: SyntaxNode) => { case Or: return 'Invalid value after logical operator.'; case FieldOp: - return 'Invalid value after comparison or aritmetic operator.'; + return 'Invalid value after comparison or arithmetic operator.'; default: return 'Invalid operator after field expression.'; } diff --git a/public/app/plugins/datasource/tempo/traceql/traceql.ts b/public/app/plugins/datasource/tempo/traceql/traceql.ts index f4c41b4fd30..b9280e4357a 100644 --- a/public/app/plugins/datasource/tempo/traceql/traceql.ts +++ b/public/app/plugins/datasource/tempo/traceql/traceql.ts @@ -46,7 +46,7 @@ const keywords = intrinsics.concat(scopes); const statusValues = ['ok', 'unset', 'error', 'false', 'true']; -export const language: languages.IMonarchLanguage = { +const language: languages.IMonarchLanguage = { ignoreCase: false, defaultToken: '', tokenPostfix: '.traceql', @@ -88,13 +88,9 @@ export const language: languages.IMonarchLanguage = { // functions and predefined values [ - // If not inside quotes, namely outside of open and closed `"`, - // allow only word characters (those matching `\w`) and full stop (`.`). - // - // If inside quotes, e.g. `"here"`, allow for any character, except for `"` and `\` which must be - // escaped with a backslash (`\"` and `\\` respectively). - // Quotes can be used to support special tag names, such as those with spaces (e.g., `my tag`). - /(?:\w|[.]|"(?:\\"|\\\\|[^\\"])*")+/, + // Inside (double) quotes, all characters are allowed, with the exception of `\` and `"` that must be escaped (`\\` and `\"`). + // Outside quotes, some more characters are prohibited, such as `!` and `=`. + /(?:\w|^[^{}()=~!<>&|," ]|"(?:\\"|\\\\|[^\\"])*")+/, { cases: { '@functions': 'predefined', @@ -147,6 +143,7 @@ export const language: languages.IMonarchLanguage = { }, }; +// For "TraceQL" tab (Monarch editor for TraceQL) export const languageDefinition = { id: 'traceql', extensions: ['.traceql'], @@ -158,6 +155,7 @@ export const languageDefinition = { }, }; +// For "Search" tab (query builder) export const traceqlGrammar: Grammar = { comment: { pattern: /\/\/.*/, diff --git a/yarn.lock b/yarn.lock index 4596d481845..2bb1125fe85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3213,12 +3213,12 @@ __metadata: languageName: node linkType: hard -"@grafana/lezer-traceql@npm:0.0.11": - version: 0.0.11 - resolution: "@grafana/lezer-traceql@npm:0.0.11" +"@grafana/lezer-traceql@npm:0.0.12": + version: 0.0.12 + resolution: "@grafana/lezer-traceql@npm:0.0.12" peerDependencies: "@lezer/lr": ^1.3.0 - checksum: cb312cf8f0cf70af6eb307aa0b6478cd8bde9233f281d6f4bb385f3c846a1e9fe0caf8addef5cbc0ccadb57b968fbd10e26ad5df6f898fb2b174536dca924926 + checksum: 615c215a7c2a72b38138a322feed3de8ff85a5828bdd6933adcf54a41e078365d3bd7db2f046cb17ad21b77a59b100b24a8946369c7dc41c15cac1826dde845b languageName: node linkType: hard @@ -17317,7 +17317,7 @@ __metadata: "@grafana/flamegraph": "workspace:*" "@grafana/google-sdk": "npm:0.1.1" "@grafana/lezer-logql": "npm:0.2.2" - "@grafana/lezer-traceql": "npm:0.0.11" + "@grafana/lezer-traceql": "npm:0.0.12" "@grafana/monaco-logql": "npm:^0.0.7" "@grafana/runtime": "workspace:*" "@grafana/scenes": "npm:1.27.0"