Merge pull request #269 from jbonofre/KARAF-7154

[KARAF-7154] Improve prometheus appender
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 e85bfaa..e9f1d2e 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,6 +28,8 @@
 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;
 
@@ -41,15 +43,18 @@
     @Reference
     HttpService httpService;
 
-    private String alias = "/decanter/prometheus";
+    private Dictionary<String, Object> config;
+
+    private String alias;
+    private boolean filtered = false;
 
     private Map<String, Gauge> gauges = new HashMap<>();
 
     @Activate
     public void activate(ComponentContext componentContext) throws Exception {
-        if (componentContext.getProperties().get("alias") != null) {
-            alias = componentContext.getProperties().get("alias").toString();
-        }
+        config = componentContext.getProperties();
+        setFiltered();
+        alias = (config.get("alias") != null) ? (String) config.get("alias") : "/decanter/prometheus";
         httpService.registerServlet(alias, new MetricsServlet(), null, null);
     }
 
@@ -61,20 +66,51 @@
     @Override
     public void handleEvent(Event event) {
         for (String property : event.getPropertyNames()) {
-            if (event.getProperty(property) instanceof Long || event.getProperty(property) instanceof Integer) {
-                String convertedProperty = property.replace(".", "_");
-                Gauge gauge = gauges.get(convertedProperty);
-                if (gauge == null) {
-                    gauge = Gauge.build().name(convertedProperty).help(property).register();
-                    gauges.put(convertedProperty, gauge);
+            if (!filtered || (filtered && config.get("prometheus.key." + property) != null)) {
+                if (event.getProperty(property) instanceof Map) {
+                    Map<String, Object> map = (Map) event.getProperty(property);
+                    for (Map.Entry<String, Object> entry : map.entrySet()) {
+                        if (entry.getValue() instanceof Long || entry.getValue() instanceof Integer) {
+                            String convertedProperty = (property + "." + entry.getKey()).replace(".", "_");
+                            Gauge gauge = gauges.get(convertedProperty);
+                            if (gauge == null) {
+                                gauge = Gauge.build().name(convertedProperty).help(property + "." + entry.getKey()).register();
+                                gauges.put(convertedProperty, gauge);
+                            }
+                            if (entry.getValue() instanceof Long) {
+                                gauge.set((Long) entry.getValue());
+                            } else if (entry.getValue() instanceof Integer) {
+                                gauge.set((Integer) entry.getValue());
+                            }
+                        }
+                    }
                 }
-                if (event.getProperty(property) instanceof Long) {
-                    gauge.set((Long) event.getProperty(property));
-                } else if (event.getProperty(property) instanceof Integer) {
-                    gauge.set((Integer) event.getProperty(property));
+                if (event.getProperty(property) instanceof Long || event.getProperty(property) instanceof Integer) {
+                    String convertedProperty = property.replace(".", "_");
+                    Gauge gauge = gauges.get(convertedProperty);
+                    if (gauge == null) {
+                        gauge = Gauge.build().name(convertedProperty).help(property).register();
+                        gauges.put(convertedProperty, gauge);
+                    }
+                    if (event.getProperty(property) instanceof Long) {
+                        gauge.set((Long) event.getProperty(property));
+                    } else if (event.getProperty(property) instanceof Integer) {
+                        gauge.set((Integer) event.getProperty(property));
+                    }
                 }
             }
         }
     }
 
+    private void setFiltered() {
+        Enumeration<String> keys = config.keys();
+        while (keys.hasMoreElements()) {
+            String key = keys.nextElement();
+            if (key.startsWith("prometheus.key")) {
+                filtered = true;
+                return;
+            }
+        }
+    }
+
 }