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"));
     }

Reply via email to