diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts index 35fcebe63a..a62f75a27a 100644 --- a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts @@ -1569,11 +1569,13 @@ describe('autocomplete promQL test', () => { type: 'text', }, { - label: '\\\\x2d', + label: '\\x2d', + apply: '\\\\x2d', type: 'text', }, { - label: 'quoted\\"value', + label: 'quoted"value', + apply: 'quoted\\"value', type: 'text', }, ], diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.ts index 91dd9d7ae7..58dfd7c15d 100644 --- a/web/ui/module/codemirror-promql/src/complete/hybrid.ts +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.ts @@ -169,6 +169,9 @@ function arrayToCompletionResult(data: Completion[], from: number, to: number, i } function escapePromQLString(str: string): string { + // PromQL only evaluates escape sequences in single- and double-quoted strings. + // Backtick-quoted string completions are not handled separately today, so keep + // the inserted value escaped unconditionally. return str.replace(/([\\"])/g, '\\$1'); } @@ -798,7 +801,7 @@ export class HybridComplete implements CompleteStrategy { return result; } return this.prometheusClient.labelValues(context.labelName, context.metricName, context.matchers).then((labelValues: string[]) => { - return result.concat(labelValues.map((value) => ({ label: escapePromQLString(value), type: 'text' }))); + return result.concat(labelValues.map((value) => ({ label: value, apply: escapePromQLString(value), type: 'text' }))); }); } }