This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/karaf-decanter.git
The following commit(s) were added to refs/heads/main by this push:
new 7d258a2f Use unique name for Prometheus gauge (#450)
7d258a2f is described below
commit 7d258a2f37c677879ae2b7dd8901b13418b3c9d0
Author: JB Onofré <[email protected]>
AuthorDate: Sun Mar 16 11:18:33 2025 +0100
Use unique name for Prometheus gauge (#450)
---
.../appender/prometheus/PrometheusServlet.java | 28 ++++++++---
.../appender/prometheus/TestPrometheusServlet.java | 55 ++++++++++++++++++++++
.../itests/appender/PrometheusAppenderTest.java | 5 +-
3 files changed, 80 insertions(+), 8 deletions(-)
diff --git
a/appender/prometheus/src/main/java/org/apache/karaf/decanter/appender/prometheus/PrometheusServlet.java
b/appender/prometheus/src/main/java/org/apache/karaf/decanter/appender/prometheus/PrometheusServlet.java
index 32c2414d..ec36a335 100644
---
a/appender/prometheus/src/main/java/org/apache/karaf/decanter/appender/prometheus/PrometheusServlet.java
+++
b/appender/prometheus/src/main/java/org/apache/karaf/decanter/appender/prometheus/PrometheusServlet.java
@@ -28,10 +28,7 @@ import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
import org.osgi.service.http.HttpService;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
@Component(
name = "org.apache.karaf.decanter.appender.prometheus",
@@ -63,6 +60,25 @@ public class PrometheusServlet implements EventHandler {
httpService.unregister(alias);
}
+ protected static String createUniqueGaugeName(Event event, String
mapProperty, String keyProperty) {
+ String gauge = event.getTopic();
+ if (event.getProperty("ObjectName") != null) {
+ gauge = gauge + "." + event.getProperty("ObjectName").toString();
+ } else if (event.getProperty("uuid") != null) {
+ gauge = gauge + "." + event.getProperty("uuid").toString();
+ } else {
+ gauge = gauge + "." + UUID.randomUUID();
+ }
+ if (mapProperty != null) {
+ gauge = mapProperty + "." + gauge;
+ }
+ gauge = gauge + "." + keyProperty;
+ gauge = gauge.replace(".", "_").replace("-", "_")
+ .replace(":", "_").replace(",", "_")
+ .replace("=", "_").replace("/", "_");
+ return gauge;
+ }
+
@Override
public void handleEvent(Event event) {
for (String property : event.getPropertyNames()) {
@@ -71,7 +87,7 @@ public class PrometheusServlet implements EventHandler {
Map<String, Object> map = (Map)
event.getProperty(property);
for (Map.Entry<String, Object> entry : map.entrySet()) {
if (entry.getValue() instanceof Double ||
entry.getValue() instanceof Long || entry.getValue() instanceof Integer) {
- String convertedProperty = (property + "." +
entry.getKey()).replace(".", "_");
+ String convertedProperty =
createUniqueGaugeName(event, property, entry.getKey());
Gauge gauge = gauges.get(convertedProperty);
if (gauge == null) {
gauge =
Gauge.build().name(convertedProperty).help(property + "." +
entry.getKey()).register();
@@ -88,7 +104,7 @@ public class PrometheusServlet implements EventHandler {
}
}
if (event.getProperty(property) instanceof Double ||
event.getProperty(property) instanceof Long || event.getProperty(property)
instanceof Integer) {
- String convertedProperty = property.replace(".", "_");
+ String convertedProperty = createUniqueGaugeName(event,
null, property);
Gauge gauge = gauges.get(convertedProperty);
if (gauge == null) {
gauge =
Gauge.build().name(convertedProperty).help(property).register();
diff --git
a/appender/prometheus/src/test/java/org/apache/karaf/decanter/appender/prometheus/TestPrometheusServlet.java
b/appender/prometheus/src/test/java/org/apache/karaf/decanter/appender/prometheus/TestPrometheusServlet.java
new file mode 100644
index 00000000..63115b26
--- /dev/null
+++
b/appender/prometheus/src/test/java/org/apache/karaf/decanter/appender/prometheus/TestPrometheusServlet.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.karaf.decanter.appender.prometheus;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.service.event.Event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestPrometheusServlet {
+
+ @Test
+ public void testDefaultGaugeName() throws Exception {
+ Map<String, Object> data = new HashMap<>();
+ data.put("Test", 0);
+ Event event = new Event("TestTopic", data);
+
+ String gaugeName = PrometheusServlet.createUniqueGaugeName(event,
null, "Test");
+
+ System.out.println(gaugeName);
+
+ Assert.assertTrue(gaugeName.matches("TestTopic_(.*)_Test"));
+ }
+
+ @Test
+ public void testGaugeNameWithObjectName() throws Exception {
+ Map<String, Object> data = new HashMap<>();
+ data.put("Test", 0);
+ data.put("ObjectName", "test:MyBean,name=foo,other=bar");
+ Event event = new Event("TestTopic", data);
+
+ String gaugeName = PrometheusServlet.createUniqueGaugeName(event,
null, "Test");
+
+ System.out.println(gaugeName);
+
+ Assert.assertEquals("TestTopic_test_MyBean_name_foo_other_bar_Test",
gaugeName);
+ }
+
+}
diff --git
a/itest/src/test/java/org/apache/karaf/decanter/itests/appender/PrometheusAppenderTest.java
b/itest/src/test/java/org/apache/karaf/decanter/itests/appender/PrometheusAppenderTest.java
index 6ac3307f..b7118bd0 100644
---
a/itest/src/test/java/org/apache/karaf/decanter/itests/appender/PrometheusAppenderTest.java
+++
b/itest/src/test/java/org/apache/karaf/decanter/itests/appender/PrometheusAppenderTest.java
@@ -71,6 +71,7 @@ public class PrometheusAppenderTest extends KarafTestSupport {
System.out.println("Sending test event ...");
EventAdmin dispatcher = getOsgiService(EventAdmin.class);
HashMap<String, Object> data = new HashMap<>();
+ data.put("ObjectName", "test:TestMBean,name=foo");
data.put("Test", 0);
dispatcher.sendEvent(new Event("decanter/collect/test", data));
@@ -92,9 +93,9 @@ public class PrometheusAppenderTest extends KarafTestSupport {
}
}
- System.out.println("");
+ System.out.println("-------");
System.out.println(builder.toString());
- System.out.println("");
+ System.out.println("-------");
Assert.assertTrue(builder.toString().contains("Test 0.0"));
}