CAMEL-8044: Camel commands useable for remote JVMs using jolokia

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a8784983
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a8784983
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a8784983

Branch: refs/heads/master
Commit: a878498388b234c2f8c1099030a9fd58678162d6
Parents: 9544da8
Author: Claus Ibsen <davscl...@apache.org>
Authored: Tue Dec 16 20:03:29 2014 +0100
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Tue Dec 16 20:03:29 2014 +0100

----------------------------------------------------------------------
 .../commands/AbstractLocalCamelController.java  | 39 ++++++++--
 .../camel/commands/ContextInfoCommand.java      | 79 +++++++++++---------
 .../jolokia/DefaultJolokiaCamelController.java  | 49 ++++++++----
 3 files changed, 113 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a8784983/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
----------------------------------------------------------------------
diff --git 
a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
 
b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
index 2ee1f57..8a547a2 100644
--- 
a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
+++ 
b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/AbstractLocalCamelController.java
@@ -80,12 +80,6 @@ public abstract class AbstractLocalCamelController extends 
AbstractCamelControll
                 answer.put("property." + entry.getKey(), entry.getValue());
             }
 
-            answer.put("typeConverter.statisticsEnabled", 
context.getTypeConverterRegistry().getStatistics().isStatisticsEnabled());
-            answer.put("typeConverter.attemptCounter", 
context.getTypeConverterRegistry().getStatistics().getAttemptCounter());
-            answer.put("typeConverter.hitCounter", 
context.getTypeConverterRegistry().getStatistics().getHitCounter());
-            answer.put("typeConverter.missCounter", 
context.getTypeConverterRegistry().getStatistics().getMissCounter());
-            answer.put("typeConverter.failedCounter", 
context.getTypeConverterRegistry().getStatistics().getFailedCounter());
-
             long activeRoutes = 0;
             long inactiveRoutes = 0;
             List<Route> routeList = context.getRoutes();
@@ -98,6 +92,39 @@ public abstract class AbstractLocalCamelController extends 
AbstractCamelControll
             }
             answer.put("startedRoutes", activeRoutes);
             answer.put("totalRoutes", activeRoutes + inactiveRoutes);
+
+            // add type converter details
+            answer.put("typeConverter.numberOfTypeConverters", 
context.getTypeConverterRegistry().size());
+            answer.put("typeConverter.statisticsEnabled", 
context.getTypeConverterRegistry().getStatistics().isStatisticsEnabled());
+            answer.put("typeConverter.attemptCounter", 
context.getTypeConverterRegistry().getStatistics().getAttemptCounter());
+            answer.put("typeConverter.hitCounter", 
context.getTypeConverterRegistry().getStatistics().getHitCounter());
+            answer.put("typeConverter.missCounter", 
context.getTypeConverterRegistry().getStatistics().getMissCounter());
+            answer.put("typeConverter.failedCounter", 
context.getTypeConverterRegistry().getStatistics().getFailedCounter());
+
+            // add stream caching details if enabled
+            if (context.getStreamCachingStrategy().isEnabled()) {
+                answer.put("streamCachingEnabled", true);
+                answer.put("streamCaching.spoolDirectory", 
context.getStreamCachingStrategy().getSpoolDirectory());
+                answer.put("streamCaching.spoolChiper", 
context.getStreamCachingStrategy().getSpoolChiper());
+                answer.put("streamCaching.spoolThreshold", 
context.getStreamCachingStrategy().getSpoolThreshold());
+                answer.put("streamCaching.spoolUsedHeapMemoryThreshold", 
context.getStreamCachingStrategy().getSpoolUsedHeapMemoryThreshold());
+                answer.put("streamCaching.spoolUsedHeapMemoryLimit", 
context.getStreamCachingStrategy().getSpoolUsedHeapMemoryLimit());
+                answer.put("streamCaching.anySpoolRules", 
context.getStreamCachingStrategy().isAnySpoolRules());
+                answer.put("streamCaching.bufferSize", 
context.getStreamCachingStrategy().getBufferSize());
+                answer.put("streamCaching.removeSpoolDirectoryWhenStopping", 
context.getStreamCachingStrategy().isRemoveSpoolDirectoryWhenStopping());
+                answer.put("streamCaching.statisticsEnabled", 
context.getStreamCachingStrategy().getStatistics().isStatisticsEnabled());
+
+                if 
(context.getStreamCachingStrategy().getStatistics().isStatisticsEnabled()) {
+                    answer.put("streamCaching.cacheMemoryCounter", 
context.getStreamCachingStrategy().getStatistics().getCacheMemoryCounter());
+                    answer.put("streamCaching.cacheMemorySize", 
context.getStreamCachingStrategy().getStatistics().getCacheMemorySize());
+                    answer.put("streamCaching.cacheMemoryAverageSize", 
context.getStreamCachingStrategy().getStatistics().getCacheMemoryAverageSize());
+                    answer.put("streamCaching.cacheSpoolCounter", 
context.getStreamCachingStrategy().getStatistics().getCacheSpoolCounter());
+                    answer.put("streamCaching.cacheSpoolSize", 
context.getStreamCachingStrategy().getStatistics().getCacheSpoolSize());
+                    answer.put("streamCaching.cacheSpoolAverageSize", 
context.getStreamCachingStrategy().getStatistics().getCacheSpoolAverageSize());
+                }
+            } else {
+                answer.put("streamCachingEnabled", false);
+            }
         }
 
         return answer;

http://git-wip-us.apache.org/repos/asf/camel/blob/a8784983/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/ContextInfoCommand.java
----------------------------------------------------------------------
diff --git 
a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/ContextInfoCommand.java
 
b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/ContextInfoCommand.java
index 53cd624..6b12e18 100644
--- 
a/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/ContextInfoCommand.java
+++ 
b/platforms/commands/commands-core/src/main/java/org/apache/camel/commands/ContextInfoCommand.java
@@ -97,7 +97,8 @@ public class ContextInfoCommand extends AbstractCamelCommand {
 
             printStatistics(camelController, out);
 
-            // add type converter statistics if enabled
+            // add type converter details
+            out.println(stringEscape.unescapeJava("\tNumber of type 
converters: " + row.get("typeConverter.numberOfTypeConverters")));
             boolean enabled = false;
             if (row.get("typeConverter.statisticsEnabled") != null) {
                 enabled = (boolean) row.get("typeConverter.statisticsEnabled");
@@ -107,7 +108,41 @@ public class ContextInfoCommand extends 
AbstractCamelCommand {
                 long hit = (long) row.get("typeConverter.hitCounter");
                 long miss = (long) row.get("typeConverter.missCounter");
                 long failed = (long) row.get("typeConverter.failedCounter");
-                
out.println(stringEscape.unescapeJava(String.format("\tTypeConverterRegistry 
utilization: [attempts=%s, hits=%s, misses=%s, failures=%s]", attempt, hit, 
miss, failed)));
+                out.println(stringEscape.unescapeJava(String.format("\tType 
converter usage: [attempts=%s, hits=%s, misses=%s, failures=%s]", attempt, hit, 
miss, failed)));
+            }
+
+            // add stream caching details if enabled
+            enabled = (boolean) row.get("streamCachingEnabled");
+            if (enabled) {
+                Object spoolDirectory = 
safeNull(row.get("streamCaching.spoolDirectory"));
+                Object spoolChiper = 
safeNull(row.get("streamCaching.spoolChiper"));
+                Object spoolThreshold = 
safeNull(row.get("streamCaching.spoolThreshold"));
+                Object spoolUsedHeapMemoryThreshold = 
safeNull(row.get("streamCaching.spoolUsedHeapMemoryThreshold"));
+                Object spoolUsedHeapMemoryLimit = 
safeNull(row.get("streamCaching.spoolUsedHeapMemoryLimit"));
+                Object anySpoolRules = 
safeNull(row.get("streamCaching.anySpoolRules"));
+                Object bufferSize = 
safeNull(row.get("streamCaching.bufferSize"));
+                Object removeSpoolDirectoryWhenStopping = 
safeNull(row.get("streamCaching.removeSpoolDirectoryWhenStopping"));
+                boolean statisticsEnabled = (boolean) 
row.get("streamCaching.statisticsEnabled");
+
+                String text = String.format("\tStream caching: 
[spoolDirectory=%s, spoolChiper=%s, spoolThreshold=%s, 
spoolUsedHeapMemoryThreshold=%s, "
+                                + "spoolUsedHeapMemoryLimit=%s, 
anySpoolRules=%s, bufferSize=%s, removeSpoolDirectoryWhenStopping=%s, 
statisticsEnabled=%s]",
+                        spoolDirectory, spoolChiper, spoolThreshold, 
spoolUsedHeapMemoryThreshold, spoolUsedHeapMemoryLimit, anySpoolRules, 
bufferSize,
+                        removeSpoolDirectoryWhenStopping, statisticsEnabled);
+                out.println(stringEscape.unescapeJava(text));
+
+                if (statisticsEnabled) {
+                    Object cacheMemoryCounter = 
safeNull(row.get("streamCaching.cacheMemoryCounter"));
+                    Object cacheMemorySize = 
safeNull(row.get("streamCaching.cacheMemorySize"));
+                    Object cacheMemoryAverageSize = 
safeNull(row.get("streamCaching.cacheMemoryAverageSize"));
+                    Object cacheSpoolCounter = 
safeNull(row.get("streamCaching.cacheSpoolCounter"));
+                    Object cacheSpoolSize = 
safeNull(row.get("streamCaching.cacheSpoolSize"));
+                    Object cacheSpoolAverageSize = 
safeNull(row.get("streamCaching.cacheSpoolAverageSize"));
+
+                    text = String.format("\t                       
[cacheMemoryCounter=%s, cacheMemorySize=%s, cacheMemoryAverageSize=%s, 
cacheSpoolCounter=%s, "
+                            + "cacheSpoolSize=%s, cacheSpoolAverageSize=%s]",
+                            cacheMemoryCounter, cacheMemorySize, 
cacheMemoryAverageSize, cacheSpoolCounter, cacheSpoolSize, 
cacheSpoolAverageSize);
+                    out.println(stringEscape.unescapeJava(text));
+                }
             }
 
             long totalRoutes = (long) row.get("totalRoutes");
@@ -171,40 +206,16 @@ public class ContextInfoCommand extends 
AbstractCamelCommand {
                 String text = new 
SimpleDateFormat(OUTPUT_TIMESTAMP_FORMAT).format(date);
                 out.println(stringEscape.unescapeJava("\tLast Exchange Date: " 
+ text));
             }
-
-            // TODO: put that info in the controller
-            /*
-
-                // add stream caching details if enabled
-                if (camelContext.getStreamCachingStrategy().isEnabled()) {
-                    out.println(stringEscape.unescapeJava(
-                            String.format("\tStreamCachingStrategy: 
[spoolDirectory=%s, spoolChiper=%s, spoolThreshold=%s, 
spoolUsedHeapMemoryThreshold=%s, "
-                                            + "spoolUsedHeapMemoryLimit=%s, 
anySpoolRules=%s, bufferSize=%s, removeSpoolDirectoryWhenStopping=%s, 
statisticsEnabled=%s]",
-                                    
camelContext.getStreamCachingStrategy().getSpoolDirectory(),
-                                    
camelContext.getStreamCachingStrategy().getSpoolChiper(),
-                                    
camelContext.getStreamCachingStrategy().getSpoolThreshold(),
-                                    
camelContext.getStreamCachingStrategy().getSpoolUsedHeapMemoryThreshold(),
-                                    
camelContext.getStreamCachingStrategy().getSpoolUsedHeapMemoryLimit(),
-                                    
camelContext.getStreamCachingStrategy().isAnySpoolRules(),
-                                    
camelContext.getStreamCachingStrategy().getBufferSize(),
-                                    
camelContext.getStreamCachingStrategy().isRemoveSpoolDirectoryWhenStopping(),
-                                    
camelContext.getStreamCachingStrategy().getStatistics().isStatisticsEnabled())));
-
-                    if 
(camelContext.getStreamCachingStrategy().getStatistics().isStatisticsEnabled()) 
{
-                        out.println(stringEscape.unescapeJava(
-                                String.format("\t                       
[cacheMemoryCounter=%s, cacheMemorySize=%s, cacheMemoryAverageSize=%s, 
cacheSpoolCounter=%s, "
-                                                + "cacheSpoolSize=%s, 
cacheSpoolAverageSize=%s]",
-                                        
camelContext.getStreamCachingStrategy().getStatistics().getCacheMemoryCounter(),
-                                        
printUnitFromBytes(camelContext.getStreamCachingStrategy().getStatistics().getCacheMemorySize()),
-                                        
printUnitFromBytes(camelContext.getStreamCachingStrategy().getStatistics().getCacheMemoryAverageSize()),
-                                        
camelContext.getStreamCachingStrategy().getStatistics().getCacheSpoolCounter(),
-                                        
printUnitFromBytes(camelContext.getStreamCachingStrategy().getStatistics().getCacheSpoolSize()),
-                                        
printUnitFromBytes(camelContext.getStreamCachingStrategy().getStatistics().getCacheSpoolAverageSize()))));
-                    }
-                }
-            }*/
         }
 
     }
 
+    private static String safeNull(Object value) {
+        if (value == null) {
+            return "";
+        } else {
+            return value.toString();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/a8784983/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java
----------------------------------------------------------------------
diff --git 
a/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java
 
b/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java
index ce44a3e..b07fd29 100644
--- 
a/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java
+++ 
b/platforms/commands/commands-jolokia/src/main/java/org/apache/camel/commands/jolokia/DefaultJolokiaCamelController.java
@@ -23,6 +23,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
+import javax.management.InstanceNotFoundException;
 import javax.management.ObjectName;
 
 import org.apache.camel.commands.AbstractCamelController;
@@ -30,6 +31,7 @@ import org.apache.camel.util.LRUCache;
 import org.apache.camel.util.StringHelper;
 import org.jolokia.client.J4pClient;
 import org.jolokia.client.exception.J4pException;
+import org.jolokia.client.exception.J4pRemoteException;
 import org.jolokia.client.request.J4pExecRequest;
 import org.jolokia.client.request.J4pExecResponse;
 import org.jolokia.client.request.J4pReadRequest;
@@ -101,8 +103,6 @@ public class DefaultJolokiaCamelController extends 
AbstractCamelController imple
             throw new IllegalStateException("Need to connect to remote jolokia 
first");
         }
 
-        // 
org.apache.camel:context=camel-1,type=services,name=DefaultTypeConverter
-
         Map<String, Object> answer = new LinkedHashMap<String, Object>();
 
         ObjectName found = lookupCamelContext(camelContextName);
@@ -111,7 +111,7 @@ public class DefaultJolokiaCamelController extends 
AbstractCamelController imple
             String pattern = 
String.format("%s:context=%s,type=services,name=DefaultTypeConverter", 
found.getDomain(), found.getKeyProperty("context"));
             ObjectName tc = ObjectName.getInstance(pattern);
 
-            List<J4pReadRequest> list = new ArrayList<>();
+            List<J4pReadRequest> list = new ArrayList<J4pReadRequest>();
             list.add(new J4pReadRequest(found));
             list.add(new J4pReadRequest(tc));
 
@@ -124,24 +124,45 @@ public class DefaultJolokiaCamelController extends 
AbstractCamelController imple
                 }
 
                 // type converter attributes
-                if (rr.size() == 2) {
+                if (rr.size() >= 2) {
                     J4pReadResponse second = rr.get(1);
                     for (String key : second.getAttributes()) {
-
                         answer.put("typeConverter." + asKey(key), 
second.getValue(key));
                     }
                 }
+            }
 
-                // store some data using special names as that is what the 
core-commands expects
-                answer.put("name", answer.get("camelId"));
-                answer.put("status", answer.get("state"));
-                answer.put("version", answer.get("camelVersion"));
-                answer.put("suspended", 
"Suspended".equals(answer.get("state")));
-                TimeUnit unit = TimeUnit.valueOf((String) 
answer.get("timeUnit"));
-                long timeout = (Long) answer.get("timeout");
-                answer.put("shutdownTimeout", "" + unit.toSeconds(timeout));
-                answer.put("applicationContextClassLoader", 
answer.get("applicationContextClassName"));
+            // would be great if there was an api in jolokia to read optional 
(eg ignore if an mbean does not exists)
+            answer.put("streamCachingEnabled", false);
+            try {
+                pattern = 
String.format("%s:context=%s,type=services,name=DefaultStreamCachingStrategy", 
found.getDomain(), found.getKeyProperty("context"));
+                ObjectName sc = ObjectName.getInstance(pattern);
+
+                // there is only a mbean if stream caching is enabled
+                J4pReadResponse rsc = jolokia.execute(new J4pReadRequest(sc));
+                if (rsc != null) {
+                    for (String key : rsc.getAttributes()) {
+                        answer.put("streamCaching." + asKey(key), 
rsc.getValue(key));
+                    }
+                }
+                answer.put("streamCachingEnabled", true);
+            } catch (J4pRemoteException e) {
+                // ignore
+                boolean ignore = 
InstanceNotFoundException.class.getName().equals(e.getErrorType());
+                if (!ignore) {
+                    throw e;
+                }
             }
+
+            // store some data using special names as that is what the 
core-commands expects
+            answer.put("name", answer.get("camelId"));
+            answer.put("status", answer.get("state"));
+            answer.put("version", answer.get("camelVersion"));
+            answer.put("suspended", "Suspended".equals(answer.get("state")));
+            TimeUnit unit = TimeUnit.valueOf((String) answer.get("timeUnit"));
+            long timeout = (Long) answer.get("timeout");
+            answer.put("shutdownTimeout", "" + unit.toSeconds(timeout));
+            answer.put("applicationContextClassLoader", 
answer.get("applicationContextClassName"));
         }
 
         return answer;

Reply via email to