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;