diff --git a/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.test.ts b/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.test.ts index 128650c4c22..4be741b242b 100644 --- a/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.test.ts +++ b/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.test.ts @@ -140,6 +140,10 @@ describe('situation', () => { otherLabels: [{ name: 'job', value: 'j1', op: '=' }], }); + assertSituation('something{job="j1"^}', null); + assertSituation('something{job="j1" ^ }', null); + assertSituation('something{job="j1" ^ , }', null); + assertSituation('{job=^,host="h1"}', { type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME', labelName: 'job', diff --git a/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts b/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts index f00fc8c7e80..f6a6ef53088 100644 --- a/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts +++ b/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts @@ -410,12 +410,29 @@ function resolveLabelKeysWithEquals(node: SyntaxNode, text: string, pos: number) // for example `something{^}` // there are some false positives that can end up in this situation, that we want - // to eliminate, for example: `something{a~^}` - // basically, if this subtree contains any error-node, we stop + // to eliminate: + // `something{a~^}` (if this subtree contains any error-node, we stop) if (subTreeHasError(node)) { return null; } + // next false positive: + // `something{a="1"^}` + const child = walk(node, [['firstChild', 'LabelMatchList']]); + if (child !== null) { + // means the label-matching part contains at least one label already. + // + // in this case, we will need to have a `,` character at the end, + // to be able to suggest adding the next label. + // the area between the end-of-the-child-node and the cursor-pos + // must contain a `,` in this case. + const textToCheck = text.slice(child.to, pos); + + if (!textToCheck.includes(',')) { + return null; + } + } + const metricNameNode = walk(node, [ ['parent', 'VectorSelector'], ['firstChild', 'MetricIdentifier'],