Skip to content

Commit 3b47711

Browse files
committed
add support metrics with special symbols #131
1 parent 6fae1df commit 3b47711

File tree

8 files changed

+18
-6
lines changed

8 files changed

+18
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## tip
44

5+
* FEATURE: add support metrics with special characters in query builder. See [this issue](https://github.com/VictoriaMetrics/grafana-datasource/issues/131)
6+
57
* BUGFIX: fix the default link to vmui. See [this issue](https://github.com/VictoriaMetrics/grafana-datasource/issues/132)
68
* BUGFIX: fix the parsing logic in `renderLegendFormat` to correctly replace legend label names. See [this issue](https://github.com/VictoriaMetrics/grafana-datasource/issues/133)
79
* BUGFIX: fix query editor which produce a lot of requests for alerting rule evaluation. See [this issue](https://github.com/VictoriaMetrics/grafana-datasource/issues/134)

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"server": "docker-compose up --build",
1616
"tar": "tar -czf $npm_package_name-v$npm_package_version.tar.gz $npm_package_name && sha1sum ./$npm_package_name-v$npm_package_version.tar.gz >$npm_package_name-v$npm_package_version.tar.gz.sha1",
1717
"zip": "zip $npm_package_name-v$npm_package_version.zip $npm_package_name -r && sha1sum ./$npm_package_name-v$npm_package_version.zip >$npm_package_name-v$npm_package_version.zip.sha1",
18-
"preinstall": "cd packages/lezer-metricsql && yarn install"
18+
"preinstall": "cd packages/lezer-metricsql && yarn install && cd ../.. && yarn upgrade lezer-metricsql"
1919
},
2020
"author": "VictoriaMetrics",
2121
"license": "AGPL-3.0-only",

packages/lezer-metricsql/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lezer-metricsql",
3-
"version": "0.1.1",
3+
"version": "0.1.2",
44
"main": "index.cjs",
55
"type": "module",
66
"exports": {

packages/lezer-metricsql/src/metricsql.grammar

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,9 @@ NumberLiteral {
395395
( ( std.digit+ "y" )? ( std.digit+ "w" )? ( std.digit+ "d" )? ( std.digit+ "h" )? ( std.digit+ "m" )? ( std.digit+ "s" ) ( std.digit+ "ms" )? ) |
396396
( ( std.digit+ "y" )? ( std.digit+ "w" )? ( std.digit+ "d" )? ( std.digit+ "h" )? ( std.digit+ "m" )? ( std.digit+ "s" )? ( std.digit+ "ms" ) )
397397
}
398-
Identifier { (std.asciiLetter | "_" | ":" | ".") (std.asciiLetter | std.digit | "_" | ":" | ".")*}
398+
EscapedChar {("\\" AnyEscapesChar) ("\\" AnyEscapesChar)*}
399+
AnyEscapesChar { "-" | "+" | "*" | "/" | "%" | "^" | "=" }
400+
Identifier {(std.asciiLetter | "_" | ":" | "." | EscapedChar) (std.asciiLetter | std.digit | "_" | ":" | "." | "-" | EscapedChar)*}
399401
LabelName { (std.asciiLetter | "_") (std.asciiLetter | std.digit | "_")* }
400402

401403
// Operator

src/components/monaco-query-field/monaco-completion-provider/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { IMarkdownString } from "monaco-editor";
2020

2121
import type { Monaco, monacoTypes } from '@grafana/ui';
2222

23+
import { escapeMetricNameSpecialCharacters } from "../../../language_utils";
24+
2325
import { getCompletions, DataProvider, CompletionType } from './completions';
2426
import { getSituation } from './situation';
2527
import { NeverCaseError } from './util';
@@ -100,7 +102,7 @@ export function getCompletionProvider(
100102
const suggestions: monacoTypes.languages.CompletionItem[] = items.map((item, index) => ({
101103
kind: getMonacoCompletionItemKind(item.type, monaco),
102104
label: item.label,
103-
insertText: item.insertText,
105+
insertText: item.type === "METRIC_NAME" ? escapeMetricNameSpecialCharacters(item.insertText) : item.insertText,
104106
detail: item.detail,
105107
documentation: { value: item.documentation } as IMarkdownString,
106108
sortText: index.toString().padStart(maxIndexDigits, '0'), // to force the order we have

src/language_utils.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,11 @@ export function escapeLabelValueInRegexSelector(labelValue: string): string {
282282
return escapeLabelValueInExactSelector(escapePrometheusRegexp(labelValue));
283283
}
284284

285+
export function escapeMetricNameSpecialCharacters(metricName: string) {
286+
const specialChars = /[-+*\/%^=]/g;
287+
return metricName.replace(specialChars, (match) => '\\' + match);
288+
}
289+
285290
export enum AbstractLabelOperator {
286291
Equal = "Equal",
287292
NotEqual = "NotEqual",

src/querybuilder/components/MetricSelect.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { SelectableValue, toOption, GrafanaTheme2 } from '@grafana/data';
2424
import { Select, FormatOptionLabelMeta, useStyles2 } from '@grafana/ui';
2525

2626
import { EditorField, EditorFieldGroup } from '../../components/QueryEditor';
27+
import { escapeMetricNameSpecialCharacters } from "../../language_utils";
2728
import { PromVisualQuery } from '../types';
2829

2930
// We are matching words split with space
@@ -95,7 +96,7 @@ export function MetricSelect({ query, onChange, onGetMetrics }: Props) {
9596
options={state.metrics}
9697
onChange={({ value }) => {
9798
if (value) {
98-
onChange({ ...query, metric: value });
99+
onChange({ ...query, metric: escapeMetricNameSpecialCharacters(value) });
99100
}
100101
}}
101102
/>

yarn.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6831,7 +6831,7 @@ levn@^0.4.1:
68316831
type-check "~0.4.0"
68326832

68336833
"lezer-metricsql@file:packages/lezer-metricsql":
6834-
version "0.1.0"
6834+
version "0.1.2"
68356835

68366836
lines-and-columns@^1.1.6:
68376837
version "1.2.4"

0 commit comments

Comments
 (0)