Tempo: Support special characters in identifiers (#79565)

This commit is contained in:
Fabrizio 2023-12-15 11:57:53 +01:00 committed by GitHub
parent 9fd3c9df55
commit af8d8f29f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 24 deletions

View File

@ -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",

View File

@ -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.'],

View File

@ -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.';
}

View File

@ -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: /\/\/.*/,

View File

@ -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"