Skip to content

ui: Support UTF-8 label names in matchers#5089

Merged
SoloJacobs merged 5 commits intoprometheus:mainfrom
B0go:ui-utf8-label-names
Mar 22, 2026
Merged

ui: Support UTF-8 label names in matchers#5089
SoloJacobs merged 5 commits intoprometheus:mainfrom
B0go:ui-utf8-label-names

Conversation

@B0go
Copy link
Copy Markdown
Contributor

@B0go B0go commented Mar 12, 2026

Fixes #5042

Summary

The Elm UI parser now accepts any UTF-8 character in label names except reserved characters used in matcher syntax. This enables proper handling of:

  • Dotted label names (OpenTelemetry semantic conventions): host.name, service.namespace
  • Hyphenated label names (Kubernetes): cluster-id, app-name
  • Non-ASCII UTF-8 characters: Προμηθεύς (Prometheus in Greek)

Changes

The isVarChar function was changed from a whitelist approach ([a-zA-Z_0-9]) to a blacklist approach that rejects only reserved characters per the Prometheus documentation: { } ! = ~ , \ " ' `` and whitespace.

Testing

Added 8 new test cases covering:

  • Dotted label names with all operators (=, !=, =, !)
  • Hyphenated label names
  • Greek UTF-8 label names
  • Filter parsing with multiple dotted labels

Local tests using the compiled version
Screenshot 2026-03-12 at 10 53 03
Screenshot 2026-03-12 at 10 53 20

Which user-facing changes does this PR introduce?

[BUGFIX] UI: Support UTF-8 label names in matchers (e.g., host.name, service.namespace, cluster-id).

Summary by CodeRabbit

  • Bug Fixes

    • Improved filter parsing and label-name validation: parsing now rejects whitespace and reserved syntax characters while allowing broader Unicode label characters.
  • Tests

    • Expanded test coverage for filter parsing: dotted names, operators (including regex/not), hyphens, UTF-8, and added a new parseFilter test.

@B0go B0go force-pushed the ui-utf8-label-names branch 2 times, most recently from 76d9b69 to cc5f608 Compare March 12, 2026 13:36
@TheMeier
Copy link
Copy Markdown
Contributor

LGTM but the reservedChar definition is missing some of the whitespaces in https://pkg.go.dev/unicode#IsSpace
which is used in https://github.com/prometheus/alertmanager/blob/main/matcher/parse/lexer.go#L134

@B0go
Copy link
Copy Markdown
Contributor Author

B0go commented Mar 16, 2026

Thanks @TheMeier! Good catch - I've added the missing Latin-1 whitespace characters from unicode.IsSpace: vertical tab (0x0B), form feed (0x0C), NEL (0x85), and NBSP (0xA0).

@B0go B0go force-pushed the ui-utf8-label-names branch from ddb03d1 to 5234076 Compare March 16, 2026 12:55
@TheMeier TheMeier requested a review from SoloJacobs March 18, 2026 19:42
Copy link
Copy Markdown
Contributor

@SoloJacobs SoloJacobs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I think this PR is definitely an improvement. But it does not correctly handle all the whitespace such as EM space echo -e "host\u2003name".

Image

We should probably use the full IsSpace implementation, although maybe the current behaviour is acceptable.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 20, 2026

📝 Walkthrough

Walkthrough

Replaced ASCII-only variable character predicate with a deny-list that disallows whitespace and specific syntax characters, allowing UTF-8 characters (including dots) in label names. Added Unicode space detection and a syntaxChars set. Tests expanded to cover dotted, hyphenated, UTF-8 label keys and comma-separated filter parsing.

Changes

Cohort / File(s) Summary
Core Parsing Logic
ui/app/src/Utils/Filter.elm
Replaced isVarChar (ASCII-only) with isReservedChar deny-list; added isSpace (Unicode space detection) and syntaxChars set ({, }, !, =, ~, ,, \, ", ', `). Parser now accepts characters when not (isReservedChar c), enabling UTF-8 and dots in label names. Removed Char import.
Test Coverage
ui/app/tests/Filter.elm
Updated module export to include parseFilter. Expanded parseMatcher tests for dotted keys (single/multiple segments), =~/!~, !=, hyphenated names, UTF-8 names, and a negative NBSP case. Added parseFilter tests validating comma-separated filters (including dotted labels).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped past ASCII gates at last,
Dots and UTF‑8 no longer cast.
Reserved marks kept off the trail,
Parsers whisper, never fail.
A tiny hop — tests green and fast.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title 'ui: Support UTF-8 label names in matchers' clearly and concisely describes the main change, following the 'area: description' convention specified in the template.
Description check ✅ Passed The description covers the main requirement (Fixes #5042), explains the changes made, includes test cases added, provides release notes, and follows most of the template guidance. One test case addition is mentioned but detailed verification is limited.
Linked Issues check ✅ Passed The PR code changes directly address issue #5042 by replacing the ASCII-only whitelist with a blacklist approach that accepts UTF-8 characters except reserved syntax characters, enabling dotted labels, hyphens, and non-ASCII names in matchers. Eight test cases were added covering the specified scenarios.
Out of Scope Changes check ✅ Passed All code changes are scoped to supporting UTF-8 label names in matchers: Filter.elm modifications for character validation and Filter.elm test expansions. No unrelated changes detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

You can validate your CodeRabbit configuration file in your editor.

If your editor has YAML language server, you can enable auto-completion and validation by adding # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json at the top of your CodeRabbit configuration file.

@B0go
Copy link
Copy Markdown
Contributor Author

B0go commented Mar 20, 2026

We should probably use the full IsSpace implementation, although maybe the current behaviour is acceptable.

Good point @SoloJacobs, I evolved the implementation by introducing isSpace and covering all the characters in the Golang equivalent. Thanks

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
ui/app/tests/Filter.elm (1)

29-58: Cover the last operator branch and one Unicode-whitespace rejection case.

The new suite hits =, !=, and =~, but !~ is still uncovered, and the hand-maintained whitespace blacklist has no direct regression test yet. One dotted-key !~ case plus a NBSP failure case would keep both edges from drifting.

Suggested test additions
         , test "should parse dotted label name with regex match" <|
             \() ->
                 Expect.equal
                     (Just (Matcher "host.name" RegexMatch "server-.*"))
                     (Utils.Filter.parseMatcher "host.name=~\"server-.*\"")
+        , test "should parse dotted label name with not regex match" <|
+            \() ->
+                Expect.equal
+                    (Just (Matcher "host.name" NotRegexMatch "server-.*"))
+                    (Utils.Filter.parseMatcher "host.name!~\"server-.*\"")
         , test "should parse dotted label name with not equal" <|
             \() ->
                 Expect.equal
                     (Just (Matcher "host.type" NotEq "test"))
                     (Utils.Filter.parseMatcher "host.type!=\"test\"")
@@
         , test "should parse UTF-8 label name" <|
             \() ->
                 Expect.equal
                     (Just (Matcher "Προμηθεύς" Eq "alerts"))
                     (Utils.Filter.parseMatcher "Προμηθεύς=\"alerts\"")
+        , test "should reject NBSP in label name" <|
+            \() ->
+                let
+                    nbsp =
+                        String.fromChar (Char.fromCode 0xA0)
+                in
+                Expect.equal
+                    Nothing
+                    (Utils.Filter.parseMatcher ("host" ++ nbsp ++ "name=\"server-01\""))
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/app/tests/Filter.elm` around lines 29 - 58, Add tests exercising the
uncovered not-regex operator and the Unicode-whitespace rejection: add a case
asserting Utils.Filter.parseMatcher returns Just (Matcher "<dotted-key>"
RegexNotMatch "<pattern>") (or the code's NotRegex/NotRegexMatch variant—use the
exact constructor used elsewhere) for a dotted key using the "!~" operator
(e.g., "host.name!~\"server-.*\""), and add a negative test that parsing fails
(returns Nothing) when the input contains a non-breaking space (U+00A0) inside
the label or around the operator (e.g., "label\u00A0=\"value\"" or similar) to
ensure the hand-maintained whitespace blacklist rejects NBSP; reference
Utils.Filter.parseMatcher and the Matcher constructor to locate where to add
these tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@ui/app/tests/Filter.elm`:
- Around line 29-58: Add tests exercising the uncovered not-regex operator and
the Unicode-whitespace rejection: add a case asserting Utils.Filter.parseMatcher
returns Just (Matcher "<dotted-key>" RegexNotMatch "<pattern>") (or the code's
NotRegex/NotRegexMatch variant—use the exact constructor used elsewhere) for a
dotted key using the "!~" operator (e.g., "host.name!~\"server-.*\""), and add a
negative test that parsing fails (returns Nothing) when the input contains a
non-breaking space (U+00A0) inside the label or around the operator (e.g.,
"label\u00A0=\"value\"" or similar) to ensure the hand-maintained whitespace
blacklist rejects NBSP; reference Utils.Filter.parseMatcher and the Matcher
constructor to locate where to add these tests.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c47cb22c-b3bc-4e15-abad-2da67a8c76d4

📥 Commits

Reviewing files that changed from the base of the PR and between 35cbf8d and 024c839.

📒 Files selected for processing (3)
  • ui/app/script.js
  • ui/app/src/Utils/Filter.elm
  • ui/app/tests/Filter.elm

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
ui/app/tests/Filter.elm (1)

125-146: Add parseFilter parity tests for hyphenated and UTF-8 keys.

parseFilter now has good dotted-key coverage, but adding filter-level tests for hyphenated/UTF-8 keys (and NBSP rejection) would better protect the full parser pipeline.

✅ Suggested test additions
 parseFilter : Test
 parseFilter =
     describe "parseFilter"
         [ test "should parse filter with dotted label names" <|
             \() ->
                 Expect.equal
                     (Just
                         [ Matcher "host.name" Eq "server-01"
                         , Matcher "service.namespace" Eq "myapp"
                         ]
                     )
                     (Utils.Filter.parseFilter "{host.name=\"server-01\", service.namespace=\"myapp\"}")
         , test "should parse filter with mixed label names" <|
             \() ->
                 Expect.equal
                     (Just
                         [ Matcher "alertname" Eq "MyAlert"
                         , Matcher "host.name" Eq "server-01"
                         ]
                     )
                     (Utils.Filter.parseFilter "{alertname=\"MyAlert\", host.name=\"server-01\"}")
+        , test "should parse filter with hyphenated and UTF-8 label names" <|
+            \() ->
+                Expect.equal
+                    (Just
+                        [ Matcher "cluster-id" Eq "prod-us-east"
+                        , Matcher "Προμηθεύς" Eq "alerts"
+                        ]
+                    )
+                    (Utils.Filter.parseFilter "{cluster-id=\"prod-us-east\", Προμηθεύς=\"alerts\"}")
+        , test "should reject NBSP in filter label name" <|
+            \() ->
+                let
+                    nbsp =
+                        String.fromChar (Char.fromCode 0xA0)
+                in
+                Expect.equal
+                    Nothing
+                    (Utils.Filter.parseFilter ("{host" ++ nbsp ++ "name=\"server-01\"}"))
         ]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/app/tests/Filter.elm` around lines 125 - 146, Add parity tests to
parseFilter to cover hyphenated and UTF-8 keys and ensure NBSP rejection: extend
the parseFilter Test (using Utils.Filter.parseFilter, Matcher and Eq) with cases
that assert parsing succeeds for keys like "my-key" and UTF-8 keys (e.g.,
"médecin" or non-ASCII characters) returning the expected Matcher list, and add
a negative test that passes a filter containing a non-breaking space (NBSP) in a
key and asserts the result is Nothing; keep the same test structure and
Expect.equal comparisons as the existing dotted-key cases.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@ui/app/tests/Filter.elm`:
- Around line 125-146: Add parity tests to parseFilter to cover hyphenated and
UTF-8 keys and ensure NBSP rejection: extend the parseFilter Test (using
Utils.Filter.parseFilter, Matcher and Eq) with cases that assert parsing
succeeds for keys like "my-key" and UTF-8 keys (e.g., "médecin" or non-ASCII
characters) returning the expected Matcher list, and add a negative test that
passes a filter containing a non-breaking space (NBSP) in a key and asserts the
result is Nothing; keep the same test structure and Expect.equal comparisons as
the existing dotted-key cases.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 990d4460-0ab5-4a06-a9cc-fdaf5affa7d7

📥 Commits

Reviewing files that changed from the base of the PR and between 024c839 and 8fce24c.

📒 Files selected for processing (1)
  • ui/app/tests/Filter.elm

@B0go B0go requested a review from SoloJacobs March 20, 2026 15:58
Copy link
Copy Markdown
Contributor

@SoloJacobs SoloJacobs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, very nice 👍

B0go added 5 commits March 23, 2026 00:25
Change the Elm UI parser to accept any UTF-8 character in label names
except reserved characters used in matcher syntax. This enables proper
handling of:

- Dotted label names (OpenTelemetry semantic conventions): host.name,
  service.namespace
- Hyphenated label names (Kubernetes): cluster-id, app-name
- Non-ASCII UTF-8 characters: Prometheus in Greek (Προμηθεύς)

The isVarChar function now rejects only reserved characters per the
Prometheus documentation: { } ! = ~ , \ " ' ` and whitespace.
All other UTF-8 characters are allowed.

Fixes prometheus#5042

Signed-off-by: Victor Bogo <victor@37signals.com>
Align reserved characters with Go's unicode.IsSpace for Latin-1.
This adds vertical tab, form feed, NEL, and NBSP which were missing.

See: https://pkg.go.dev/unicode#IsSpace

Signed-off-by: Victor Bogo <victor@37signals.com>
…e characters and use that alongside the syntaxChars list to detect any reserved character

Signed-off-by: Victor Bogo <victor@37signals.com>
Signed-off-by: Victor Bogo <victor@37signals.com>
Signed-off-by: Victor Bogo <victor@37signals.com>
@SoloJacobs SoloJacobs force-pushed the ui-utf8-label-names branch from fa82fd2 to 8a1428d Compare March 22, 2026 23:25
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
ui/app/tests/Filter.elm (1)

125-146: Consider adding one mixed-operator parseFilter case.

parseFilter tests currently exercise only Eq. Adding one comma-separated case with =~, !~, and != would lock in full operator behavior for multi-matcher filters.

Suggested test addition
 parseFilter : Test
 parseFilter =
     describe "parseFilter"
         [ test "should parse filter with dotted label names" <|
             \() ->
                 Expect.equal
                     (Just
                         [ Matcher "host.name" Eq "server-01"
                         , Matcher "service.namespace" Eq "myapp"
                         ]
                     )
                     (Utils.Filter.parseFilter "{host.name=\"server-01\", service.namespace=\"myapp\"}")
         , test "should parse filter with mixed label names" <|
             \() ->
                 Expect.equal
                     (Just
                         [ Matcher "alertname" Eq "MyAlert"
                         , Matcher "host.name" Eq "server-01"
                         ]
                     )
                     (Utils.Filter.parseFilter "{alertname=\"MyAlert\", host.name=\"server-01\"}")
+        , test "should parse filter with dotted labels and mixed operators" <|
+            \() ->
+                Expect.equal
+                    (Just
+                        [ Matcher "host.name" RegexMatch "server-.*"
+                        , Matcher "service.namespace" NotRegexMatch "dev-.*"
+                        , Matcher "cluster-id" NotEq "staging"
+                        ]
+                    )
+                    (Utils.Filter.parseFilter "{host.name=~\"server-.*\", service.namespace!~\"dev-.*\", cluster-id!=\"staging\"}")
         ]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ui/app/tests/Filter.elm` around lines 125 - 146, Add a new test case inside
the parseFilter describe block to validate mixed operators for multi-matcher
filters: call Utils.Filter.parseFilter with a comma-separated input that uses
=~, !~ and != (in addition to =) and assert it returns Just with Matchers using
the appropriate operators (e.g., Matcher "labelA" ReMatches "...", Matcher
"labelB" NotReMatches "...", Matcher "labelC" NotEq "..." etc.). Place the case
alongside the existing tests in the parseFilter Test value so it verifies
operator parsing for multi-matcher inputs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@ui/app/tests/Filter.elm`:
- Around line 125-146: Add a new test case inside the parseFilter describe block
to validate mixed operators for multi-matcher filters: call
Utils.Filter.parseFilter with a comma-separated input that uses =~, !~ and !=
(in addition to =) and assert it returns Just with Matchers using the
appropriate operators (e.g., Matcher "labelA" ReMatches "...", Matcher "labelB"
NotReMatches "...", Matcher "labelC" NotEq "..." etc.). Place the case alongside
the existing tests in the parseFilter Test value so it verifies operator parsing
for multi-matcher inputs.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1aa65b87-022b-4650-82a7-38f46006e99d

📥 Commits

Reviewing files that changed from the base of the PR and between 8fce24c and 8a1428d.

📒 Files selected for processing (3)
  • ui/app/script.js
  • ui/app/src/Utils/Filter.elm
  • ui/app/tests/Filter.elm

@SoloJacobs SoloJacobs merged commit 7aa1b9f into prometheus:main Mar 22, 2026
7 checks passed
@B0go
Copy link
Copy Markdown
Contributor Author

B0go commented Mar 23, 2026

Thanks @SoloJacobs, do you have any idea on when a next release might be live?

@SoloJacobs
Copy link
Copy Markdown
Contributor

I keep this file, up to date: https://github.com/prometheus/alertmanager/blob/main/RELEASE.md (It often changes, but no such plans, yet).

SoloJacobs added a commit to SoloJacobs/alertmanager that referenced this pull request Apr 6, 2026
* [CHANGE] `go get github.com/prometheus/alertmanager/ui` will now fail as compiled UI assets are no longer checked into the repository. Downstream builds that rely on these assets being present in the source tree must now build the UI from source. prometheus#5113
* [CHANGE] The '--enable-feature=auto-gomaxprocs' option is deprecated and will be removed in v0.33. This flag currently has no effect and can be safely removed from any startup scripts. prometheus#5090
* [CHANGE] Update internal function signatures across multiple packages. This affects any project that integrates `Alertmanager` code.
* [ENHANCEMENT] Add static asset caching. prometheus#5113
* [ENHANCEMENT] Reduce memory allocations through pre-sizing collections and batch allocation. prometheus#5020
* [ENHANCEMENT] Replace help with documentation in navigation bar. prometheus#4943
* [ENHANCEMENT] docs(ha): Update high availability documentation. prometheus#5136
* [ENHANCEMENT] docs: Add `auth_secret_file` for smtp in document. prometheus#5036
* [ENHANCEMENT] docs: Add description for global `telegram_bot_token`. prometheus#5114
* [ENHANCEMENT] docs: Add note about notifier timeouts. prometheus#5077
* [ENHANCEMENT] docs: Fix `force_implicit_tls` config field name. prometheus#5030
* [ENHANCEMENT] docs: Link community supported integrations. prometheus#4978
* [ENHANCEMENT] docs: Remove duplicate header. prometheus#5034
* [ENHANCEMENT] docs: Update mutual tls reference in high availability documentation. prometheus#5120
* [ENHANCEMENT] tracing: Use noop spans when tracing disabled. prometheus#5118
* [FEATURE] Add silence annotations. prometheus#4965
* [FEATURE] Add silence logging option. prometheus#4163
* [FEATURE] Add support for multiple matcher set silences. prometheus#4957
* [FEATURE] Add the reason for notifying in dedup stage. prometheus#4971
* [FEATURE] mattermost: Flatten attachments into top-level config. prometheus#5009
* [FEATURE] mattermost: Support global webhook url. prometheus#4998
* [FEATURE] slack: Add default color from template. prometheus#5014
* [FEATURE] slack: Allow receiver to edit existing messages. prometheus#5007
* [FEATURE] template: Add dict, map and append functions. prometheus#5093
* [FEATURE] webhook: Add full payload templating support for notifier. prometheus#5011
* [BUGFIX] config: Check for empty cluster tls client config. prometheus#5126
* [BUGFIX] config: Don't crash upon reading empty config for notifier. prometheus#4979
* [BUGFIX] config: Fix ipv6 address handling in hostport.string(). prometheus#5040
* [BUGFIX] mattermost: Omit empty text field in notifications. prometheus#4985
* [BUGFIX] telegram: Send fallback message when notification exceeds character limit. prometheus#5074
* [BUGFIX] ui: Fix escaping for matcher values with quotes. prometheus#4862
* [BUGFIX] ui: Handle special chars in silence regex-matchers. prometheus#4942
* [BUGFIX] ui: Support utf-8 label names in matchers. prometheus#5089

Signed-off-by: Solomon Jacobs <solomonjacobs@protonmail.com>
@SoloJacobs SoloJacobs mentioned this pull request Apr 6, 2026
ultrotter pushed a commit that referenced this pull request Apr 7, 2026
* [CHANGE] `go get github.com/prometheus/alertmanager/ui` will now fail as compiled UI assets are no longer checked into the repository. Downstream builds that rely on these assets being present in the source tree must now build the UI from source. #5113
* [CHANGE] The '--enable-feature=auto-gomaxprocs' option is deprecated and will be removed in v0.33. This flag currently has no effect and can be safely removed from any startup scripts. #5090
* [CHANGE] Update internal function signatures across multiple packages. This affects any project that integrates `Alertmanager` code.
* [ENHANCEMENT] Add static asset caching. #5113
* [ENHANCEMENT] Reduce memory allocations through pre-sizing collections and batch allocation. #5020
* [ENHANCEMENT] Replace help with documentation in navigation bar. #4943
* [ENHANCEMENT] docs(ha): Update high availability documentation. #5136
* [ENHANCEMENT] docs: Add `auth_secret_file` for smtp in document. #5036
* [ENHANCEMENT] docs: Add description for global `telegram_bot_token`. #5114
* [ENHANCEMENT] docs: Add note about notifier timeouts. #5077
* [ENHANCEMENT] docs: Fix `force_implicit_tls` config field name. #5030
* [ENHANCEMENT] docs: Link community supported integrations. #4978
* [ENHANCEMENT] docs: Remove duplicate header. #5034
* [ENHANCEMENT] docs: Update mutual tls reference in high availability documentation. #5120
* [ENHANCEMENT] tracing: Use noop spans when tracing disabled. #5118
* [FEATURE] Add silence annotations. #4965
* [FEATURE] Add silence logging option. #4163
* [FEATURE] Add support for multiple matcher set silences. #4957
* [FEATURE] Add the reason for notifying in dedup stage. #4971
* [FEATURE] mattermost: Flatten attachments into top-level config. #5009
* [FEATURE] mattermost: Support global webhook url. #4998
* [FEATURE] slack: Add default color from template. #5014
* [FEATURE] slack: Allow receiver to edit existing messages. #5007
* [FEATURE] template: Add dict, map and append functions. #5093
* [FEATURE] webhook: Add full payload templating support for notifier. #5011
* [BUGFIX] config: Check for empty cluster tls client config. #5126
* [BUGFIX] config: Don't crash upon reading empty config for notifier. #4979
* [BUGFIX] config: Fix ipv6 address handling in hostport.string(). #5040
* [BUGFIX] mattermost: Omit empty text field in notifications. #4985
* [BUGFIX] telegram: Send fallback message when notification exceeds character limit. #5074
* [BUGFIX] ui: Fix escaping for matcher values with quotes. #4862
* [BUGFIX] ui: Handle special chars in silence regex-matchers. #4942
* [BUGFIX] ui: Support utf-8 label names in matchers. #5089

Signed-off-by: Solomon Jacobs <solomonjacobs@protonmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

UI does not support UTF-8 label names (e.g., dots in label names)

3 participants