From d2ff4006418750aa8b91f280e66bdb623c891c95 Mon Sep 17 00:00:00 2001 From: Daniil Leontev Date: Thu, 20 Feb 2025 12:17:32 +0100 Subject: feat(promql): do not use regex for string labels (#7669) In Prometheus, label values are treated as strings when used with the `=` and `!=` operators, and as regular expressions when used with the `=~` and `!~` operators. Injecting and then highlighting all label values as regex leads to a situation where entirely valid **string** label values containing regex special characters are mistakenly parsed and highlighted as regex. This results in syntax errors, causing labels to be highlighted incorrectly. For example, in `foo{bar=~"[a-z]{1,3}"}`, `{` and `}` are regex special characters, so regex highlighting is expected. However, in `foo{path="/foo/{id}"}`, `{` and `}` are just part of the string and have no special meaning, so the whole value should be highlighted as a string. --- tests/query/highlights/promql/regex.promql | 10 +++++++ .../yaml/promql-on-prometheus-rules.yaml | 33 ++++++++++++++++++++++ tests/query/injections/promql/regex.promql | 10 +++++++ .../yaml/promql-on-prometheus-rules.yaml | 14 +++++++++ 4 files changed, 67 insertions(+) create mode 100644 tests/query/highlights/promql/regex.promql create mode 100644 tests/query/highlights/yaml/promql-on-prometheus-rules.yaml create mode 100644 tests/query/injections/promql/regex.promql (limited to 'tests') diff --git a/tests/query/highlights/promql/regex.promql b/tests/query/highlights/promql/regex.promql new file mode 100644 index 000000000..fa61094a3 --- /dev/null +++ b/tests/query/highlights/promql/regex.promql @@ -0,0 +1,10 @@ +foo{path=~"^foo$"}[5m] or +# ^ @string.regexp +foo{path!~"[a-zA-Z0-9]{1,3}"}[5m] or +# ^ @string.regexp +foo{path="/api/users/{userId}"}[5m] or +# ^ @string +foo{path!="/api/users/{userId}"}[5m] +# ^ @string + +# vim: ft=promql diff --git a/tests/query/highlights/yaml/promql-on-prometheus-rules.yaml b/tests/query/highlights/yaml/promql-on-prometheus-rules.yaml new file mode 100644 index 000000000..910405418 --- /dev/null +++ b/tests/query/highlights/yaml/promql-on-prometheus-rules.yaml @@ -0,0 +1,33 @@ +groups: +- name: Hardware alerts + rules: + - alert: Node down + expr: up{job="node_exporter"} == 0 + # ^ @type + for: 3m + labels: + severity: warning + annotations: + title: Node {{ $labels.instance }} is down + description: Failed to scrape {{ $labels.job }} on {{ $labels.instance }} for more than 3 minutes. Node seems down. + - alert: Node down + expr: | + up{job="node_exporter"} == 0 + # ^ @type + for: 3m + labels: + severity: warning + - alert: Regex and String matching + expr: | + foo{path=~"^foo$"}[5m] or foo{path!~"[a-zA-Z0-9]{1,3}"}[5m] or foo{path="/api/users/{userId}"}[5m] or foo{path!="/api/users/{userId}"}[5m] + # ^ @type + # ^ @string.regexp + # ^ @string.regexp + # ^ @string + # ^ @string + for: 3m + labels: + severity: warning + annotations: + title: Foo + description: Bar diff --git a/tests/query/injections/promql/regex.promql b/tests/query/injections/promql/regex.promql new file mode 100644 index 000000000..08ed74640 --- /dev/null +++ b/tests/query/injections/promql/regex.promql @@ -0,0 +1,10 @@ +foo{path=~"^foo$"}[5m] or +# ^ @regex +foo{path!~"[a-zA-Z0-9]{1,3}"}[5m] or +# ^ @regex +foo{path="/api/users/{userId}"}[5m] or +# ^ @!regex +foo{path!="/api/users/{userId}"}[5m] +# ^ @!regex + +# vim: ft=promql diff --git a/tests/query/injections/yaml/promql-on-prometheus-rules.yaml b/tests/query/injections/yaml/promql-on-prometheus-rules.yaml index f064da375..942fb1369 100644 --- a/tests/query/injections/yaml/promql-on-prometheus-rules.yaml +++ b/tests/query/injections/yaml/promql-on-prometheus-rules.yaml @@ -17,3 +17,17 @@ groups: for: 3m labels: severity: warning + - alert: Regex and String matching + expr: | + foo{path=~"^foo$"}[5m] or foo{path!~"[a-zA-Z0-9]{1,3}"}[5m] or foo{path="/api/users/{userId}"}[5m] or foo{path!="/api/users/{userId}"}[5m] + # ^ @promql + # ^ @regex + # ^ @regex + # ^ @!regex + # ^ @!regex + for: 3m + labels: + severity: warning + annotations: + title: Foo + description: Bar -- cgit v1.2.3-70-g09d2