From 6edf93e49c73aa7c99f57211209f79f20c984e7b Mon Sep 17 00:00:00 2001 From: Tim Quinn Date: Fri, 24 Jan 2025 13:35:11 -0600 Subject: [PATCH] Allow colon in Prometheus meter name; add test (#9689) --- .../MicrometerPrometheusFormatter.java | 4 +- .../micrometer/TestPrometheusFormatting.java | 38 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerPrometheusFormatter.java b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerPrometheusFormatter.java index b93a1db94be..2ea9752fb02 100644 --- a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerPrometheusFormatter.java +++ b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerPrometheusFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2024 Oracle and/or its affiliates. + * Copyright (c) 2023, 2025 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -92,7 +92,7 @@ public static String normalizeNameToPrometheus(String name) { } // Replace non-identifier characters. - result = result.replaceAll("[^A-Za-z0-9_]", "_"); + result = result.replaceAll("[^A-Za-z0-9_:]", "_"); return result; } diff --git a/metrics/providers/micrometer/src/test/java/io/helidon/metrics/providers/micrometer/TestPrometheusFormatting.java b/metrics/providers/micrometer/src/test/java/io/helidon/metrics/providers/micrometer/TestPrometheusFormatting.java index 10a98c31036..c051c4b2fec 100644 --- a/metrics/providers/micrometer/src/test/java/io/helidon/metrics/providers/micrometer/TestPrometheusFormatting.java +++ b/metrics/providers/micrometer/src/test/java/io/helidon/metrics/providers/micrometer/TestPrometheusFormatting.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Oracle and/or its affiliates. + * Copyright (c) 2023, 2025 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -202,6 +202,42 @@ void testRetrievingByScope() { endsWith(OPENMETRICS_EOF))); } + @Test + void testMeterNameWithColon() { + Counter withColon = meterRegistry.getOrCreate(Counter.builder("c:withColon")); + withColon.increment(); + + Counter withoutColon = meterRegistry.getOrCreate(Counter.builder("cWithoutColon")); + withoutColon.increment(2L); + + Counter withQuestionMark = meterRegistry.getOrCreate(Counter.builder("c?withQuestionMark")); + withQuestionMark.increment(); + + MicrometerPrometheusFormatter formatter = MicrometerPrometheusFormatter.builder(meterRegistry) + .resultMediaType(MediaTypes.APPLICATION_OPENMETRICS_TEXT) + .scopeTagName(SCOPE_TAG_NAME) + .scopeSelection(Set.of("app")) + .build(); + + Optional outputOpt = formatter.format(); + + assertThat("Formatted output", + checkAndCast(outputOpt), + allOf(containsString(scopeExpr("c:withColon_total", + "this_scope", + "app", + "1.0")), + containsString(scopeExpr("cWithoutColon_total", + "this_scope", + "app", + "2.0")), + containsString(scopeExpr("c_withQuestionMark_total", + "this_scope", + "app", + "1.0")), + endsWith(OPENMETRICS_EOF))); + } + private static String scopeExpr(String meterName, String key, String value, String suffix) { return meterName + "{" + key + "=\"" + value + "\"} " + suffix; }