You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2015/03/18 13:42:07 UTC

karaf-decanter git commit: [KARAF-3618] Better support attributes of other types than String

Repository: karaf-decanter
Updated Branches:
  refs/heads/master 8b9fd6484 -> 3701da08e


[KARAF-3618] Better support attributes of other types than String


Project: http://git-wip-us.apache.org/repos/asf/karaf-decanter/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-decanter/commit/3701da08
Tree: http://git-wip-us.apache.org/repos/asf/karaf-decanter/tree/3701da08
Diff: http://git-wip-us.apache.org/repos/asf/karaf-decanter/diff/3701da08

Branch: refs/heads/master
Commit: 3701da08ebd33f56528a2e7da69084c962478b5d
Parents: 8b9fd64
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Wed Mar 18 13:41:47 2015 +0100
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Wed Mar 18 13:41:47 2015 +0100

----------------------------------------------------------------------
 .../elasticsearch/ElasticsearchAppender.java    | 47 +++++++++++++------
 collector/jmx/pom.xml                           |  5 ++
 .../decanter/collector/jmx/JmxCollector.java    | 48 +++++++++++++-------
 .../collector/jmx/TestMapAttribute.java         | 27 +++++++++++
 .../decanter/collector/log/LogAppender.java     |  1 +
 5 files changed, 97 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/3701da08/appender/elasticsearch/src/main/java/org/apache/karaf/decanter/appender/elasticsearch/ElasticsearchAppender.java
----------------------------------------------------------------------
diff --git a/appender/elasticsearch/src/main/java/org/apache/karaf/decanter/appender/elasticsearch/ElasticsearchAppender.java b/appender/elasticsearch/src/main/java/org/apache/karaf/decanter/appender/elasticsearch/ElasticsearchAppender.java
index ce9f517..e9050cd 100644
--- a/appender/elasticsearch/src/main/java/org/apache/karaf/decanter/appender/elasticsearch/ElasticsearchAppender.java
+++ b/appender/elasticsearch/src/main/java/org/apache/karaf/decanter/appender/elasticsearch/ElasticsearchAppender.java
@@ -18,9 +18,10 @@ package org.apache.karaf.decanter.appender.elasticsearch;
 
 import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.TimeZone;
@@ -88,7 +89,6 @@ public class ElasticsearchAppender implements EventHandler {
 
     @SuppressWarnings("unchecked")
     private void send(Client client, Event event) {
-        Map<String, Object> props = new HashMap<>();
         Long ts = (Long)event.getProperty("timestamp");
         Date date = ts != null ? new Date((Long)ts) : new Date();
         
@@ -96,15 +96,23 @@ public class ElasticsearchAppender implements EventHandler {
         jsonObjectBuilder.add("@timestamp", tsFormat.format(date));
         for (String key : event.getPropertyNames()) {
             Object value = event.getProperty(key);
-            if (value instanceof String) {
-                jsonObjectBuilder.add(key, (String) value);
-            } else if (value instanceof Map) {
+            if (value instanceof Map) {
                 jsonObjectBuilder.add(key, build((Map<String, Object>) value));
+            } else {
+                addProperty(jsonObjectBuilder, key, value);
             }
         }
         JsonObject jsonObject = jsonObjectBuilder.build();
         String indexName = getIndexName("karaf", date);
-        client.prepareIndex(indexName, "karaf_event").setSource(jsonObject.toString()).execute().actionGet();
+        String jsonSt = jsonObject.toString();
+        LOGGER.debug("Sending event to elastic search with content: {}", jsonSt);
+ 
+        client.prepareIndex(indexName, getType(event)).setSource(jsonSt).execute().actionGet();
+    }
+
+    private String getType(Event event) {
+        String type = (String)event.getProperty("type");
+        return type != null ? type : "karaf_event";
     }
 
     private JsonObject build(Map<String, Object> value) {
@@ -115,15 +123,24 @@ public class ElasticsearchAppender implements EventHandler {
         return innerBuilder.build();
     }
 
-    private void addProperty(JsonObjectBuilder innerBuilder, String innerKey, Object innerValue) {
-        if (innerValue instanceof String)
-            innerBuilder.add(innerKey, (String) innerValue);
-        else if (innerValue instanceof Long)
-            innerBuilder.add(innerKey, (Long) innerValue);
-        else if (innerValue instanceof Integer)
-            innerBuilder.add(innerKey, (Integer) innerValue);
-        else if (innerValue instanceof Float)
-            innerBuilder.add(innerKey, (Float) innerValue);
+    private void addProperty(JsonObjectBuilder builder, String key, Object value) {
+        if (value instanceof BigDecimal)
+            builder.add(key, (BigDecimal) value);
+        else if (value instanceof BigInteger)
+            builder.add(key, (BigInteger) value);
+        else if (value instanceof String)
+            builder.add(key, (String) value);
+        else if (value instanceof Long)
+            builder.add(key, (Long) value);
+        else if (value instanceof Integer)
+            builder.add(key, (Integer) value);
+        else if (value instanceof Float)
+            builder.add(key, (Float) value);
+        else if (value instanceof Double)
+            builder.add(key, (Double) value);
+        else if (value instanceof Boolean)
+            builder.add(key, (Boolean) value);
+
     }
 
     private String getIndexName(String prefix, Date date) {

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/3701da08/collector/jmx/pom.xml
----------------------------------------------------------------------
diff --git a/collector/jmx/pom.xml b/collector/jmx/pom.xml
index bf4357b..100ce89 100644
--- a/collector/jmx/pom.xml
+++ b/collector/jmx/pom.xml
@@ -57,6 +57,11 @@
             <artifactId>slf4j-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/3701da08/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java
----------------------------------------------------------------------
diff --git a/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java b/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java
index 5f04026..59da402 100644
--- a/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java
+++ b/collector/jmx/src/main/java/org/apache/karaf/decanter/collector/jmx/JmxCollector.java
@@ -54,7 +54,7 @@ public class JmxCollector implements Runnable {
         for (ObjectName name : names) {
             try {
                 Map<String, Object> data = harvestBean(server, name);
-                Event event = new Event("decanter/jmx", data);
+                Event event = new Event("decanter/jmx/" + getTopic(name), data);
                 eventAdmin.postEvent(event);
             } catch (Exception e) {
                 LOGGER.warn("Error reading mbean " + name, e);
@@ -64,25 +64,41 @@ public class JmxCollector implements Runnable {
         LOGGER.debug("Karaf Decanter JMX Collector harvesting done");
     }
 
-    private Map<String, Object> harvestBean(MBeanServer server, ObjectName name) throws Exception {
+    private String getTopic(ObjectName name) {
+        return name.getDomain().replace(".", "/");
+    }
+
+    Map<String, Object> harvestBean(MBeanServer server, ObjectName name) throws Exception {
         MBeanAttributeInfo[] attributes = server.getMBeanInfo(name).getAttributes();
         Map<String, Object> data = new HashMap<>();
-        data.put("mbean", name.toString());
+        data.put("type", "jmx");
         for (MBeanAttributeInfo attribute : attributes) {
-            // TODO add SLA check on attributes and filtering
-            Object attributeObject = server.getAttribute(name, attribute.getName());
-            if (attributeObject instanceof String) {
-                data.put(attribute.getName(), (String)attributeObject);
-            } else if (attributeObject instanceof CompositeDataSupport) {
-                CompositeDataSupport cds = (CompositeDataSupport)attributeObject;
-                CompositeType compositeType = cds.getCompositeType();
-                Set<String> keySet = compositeType.keySet();
-                Map<String, Object> composite = new HashMap<String, Object>();
-                for (String key : keySet) {
-                    Object cdsObject = cds.get(key);
-                    composite.put(key, cdsObject);
+            try {
+                // TODO add SLA check on attributes and filtering
+                Object attributeObject = server.getAttribute(name, attribute.getName());
+                if (attributeObject instanceof String) {
+                    data.put(attribute.getName(), (String)attributeObject);
+                } else if (attributeObject instanceof ObjectName) {
+                    data.put(attribute.getName(), ((ObjectName)attributeObject).toString());
+                } else if (attributeObject instanceof CompositeDataSupport) {
+                    CompositeDataSupport cds = (CompositeDataSupport)attributeObject;
+                    CompositeType compositeType = cds.getCompositeType();
+                    Set<String> keySet = compositeType.keySet();
+                    Map<String, Object> composite = new HashMap<String, Object>();
+                    for (String key : keySet) {
+                        Object cdsObject = cds.get(key);
+                        composite.put(key, cdsObject);
+                    }
+                    data.put(attribute.getName(), composite);
+                } else if (attributeObject instanceof Long 
+                    || attributeObject instanceof Integer 
+                    || attributeObject instanceof Boolean
+                    || attributeObject instanceof Float
+                    || attributeObject instanceof Double){
+                    data.put(attribute.getName(), attributeObject);
                 }
-                data.put(attribute.getName(), composite);
+            } catch (Exception e) {
+                LOGGER.debug("Could not read attribute " + name.toString() + " " + attribute.getName());
             }
 
         }

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/3701da08/collector/jmx/src/test/java/org/apache/karaf/decanter/collector/jmx/TestMapAttribute.java
----------------------------------------------------------------------
diff --git a/collector/jmx/src/test/java/org/apache/karaf/decanter/collector/jmx/TestMapAttribute.java b/collector/jmx/src/test/java/org/apache/karaf/decanter/collector/jmx/TestMapAttribute.java
new file mode 100644
index 0000000..9c904e3
--- /dev/null
+++ b/collector/jmx/src/test/java/org/apache/karaf/decanter/collector/jmx/TestMapAttribute.java
@@ -0,0 +1,27 @@
+package org.apache.karaf.decanter.collector.jmx;
+
+import java.lang.management.ManagementFactory;
+import java.util.Map;
+
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestMapAttribute {
+
+    @Test
+    public void testOperatingSystemMBean() throws MalformedObjectNameException, Exception {
+        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+        JmxCollector jmxCollector = new JmxCollector(null);
+        Map<String, Object> data = jmxCollector.harvestBean(server, new ObjectName("java.lang:type=OperatingSystem"));
+        Assert.assertTrue(data.size() >= 17);
+        Object freeMem = data.get("FreePhysicalMemorySize");
+        Assert.assertTrue(freeMem != null);
+        Assert.assertTrue(freeMem instanceof Long);
+        Assert.assertTrue((Long)freeMem > 10000);
+        System.out.println(data);
+    }
+}

http://git-wip-us.apache.org/repos/asf/karaf-decanter/blob/3701da08/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
----------------------------------------------------------------------
diff --git a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
index 0b52e30..9c520bc 100644
--- a/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
+++ b/collector/log/src/main/java/org/apache/karaf/decanter/collector/log/LogAppender.java
@@ -59,6 +59,7 @@ public class LogAppender implements PaxAppender {
         LOGGER.debug("Karaf Decanter Log Collector hooked ...");
 
         Map<String, Object> data = new HashMap<>();
+        data.put("type", "log");
         data.put("timeStamp", event.getTimeStamp());
         data.put("loggerClass", event.getFQNOfLoggerClass());
         data.put("loggerName", event.getLoggerName());