Repository: camel Updated Branches: refs/heads/master 9ab0bd5c6 -> 0a96a200a
CAMEL-8165: Async routing engine - Add insight into threads blocked waiting for callbacks Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/0a96a200 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/0a96a200 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/0a96a200 Branch: refs/heads/master Commit: 0a96a200a71cfc0bab8c51c7e66dbd615b73e8c6 Parents: 9ab0bd5 Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Dec 21 13:25:35 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Dec 21 13:25:35 2014 +0100 ---------------------------------------------------------------------- .../commands/AbstractLocalCamelController.java | 10 ++++++++++ .../apache/camel/commands/ContextInfoCommand.java | 17 +++++++++++++++++ .../jolokia/DefaultJolokiaCamelController.java | 14 +++++++++++++- 3 files changed, 40 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/0a96a200/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 53c3a5f..0407871 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 @@ -102,6 +102,16 @@ public abstract class AbstractLocalCamelController extends AbstractCamelControll answer.put("typeConverter.missCounter", context.getTypeConverterRegistry().getStatistics().getMissCounter()); answer.put("typeConverter.failedCounter", context.getTypeConverterRegistry().getStatistics().getFailedCounter()); + // add async processor await manager details + answer.put("asyncProcessorAwaitManager.size", context.getAsyncProcessorAwaitManager().size()); + answer.put("asyncProcessorAwaitManager.statisticsEnabled", context.getAsyncProcessorAwaitManager().getStatistics().isStatisticsEnabled()); + answer.put("asyncProcessorAwaitManager.threadsBlocked", context.getAsyncProcessorAwaitManager().getStatistics().getThreadsBlocked()); + answer.put("asyncProcessorAwaitManager.threadsInterrupted", context.getAsyncProcessorAwaitManager().getStatistics().getThreadsInterrupted()); + answer.put("asyncProcessorAwaitManager.totalDuration", context.getAsyncProcessorAwaitManager().getStatistics().getTotalDuration()); + answer.put("asyncProcessorAwaitManager.minDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMinDuration()); + answer.put("asyncProcessorAwaitManager.maxDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMaxDuration()); + answer.put("asyncProcessorAwaitManager.meanDuration", context.getAsyncProcessorAwaitManager().getStatistics().getMeanDuration()); + // add stream caching details if enabled if (context.getStreamCachingStrategy().isEnabled()) { answer.put("streamCachingEnabled", true); http://git-wip-us.apache.org/repos/asf/camel/blob/0a96a200/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 cd2f373..ee8ecfb 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 @@ -112,6 +112,23 @@ public class ContextInfoCommand extends AbstractCamelCommand { out.println(stringEscape.unescapeJava(String.format("\tType converter usage: [noop=%s, attempts=%s, hits=%s, misses=%s, failures=%s]", noop, attempt, hit, miss, failed))); } + // add async processor await details + out.println(stringEscape.unescapeJava("\tNumber of blocked threads: " + row.get("asyncProcessorAwaitManager.size"))); + enabled = false; + if (row.get("asyncProcessorAwaitManager.statisticsEnabled") != null) { + enabled = (boolean) row.get("asyncProcessorAwaitManager.statisticsEnabled"); + } + if (enabled) { + long blocked = (long) row.get("asyncProcessorAwaitManager.threadsBlocked"); + long interrupted = (long) row.get("asyncProcessorAwaitManager.threadsInterrupted"); + long total = (long) row.get("asyncProcessorAwaitManager.totalDuration"); + long min = (long) row.get("asyncProcessorAwaitManager.minDuration"); + long max = (long) row.get("asyncProcessorAwaitManager.maxDuration"); + long mean = (long) row.get("asyncProcessorAwaitManager.meanDuration"); + out.println(stringEscape.unescapeJava(String.format("\tAsyncProcessorAwaitManager usage: [blocked=%s, interrupted=%s, total=%s msec, min=%s msec, max=%s msec, mean=%s msec]", + blocked, interrupted, total, min, max, mean))); + } + // add stream caching details if enabled enabled = (boolean) row.get("streamCachingEnabled"); if (enabled) { http://git-wip-us.apache.org/repos/asf/camel/blob/0a96a200/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 998418e..a9ee5c2 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 @@ -88,7 +88,7 @@ public class DefaultJolokiaCamelController extends AbstractCamelController imple throw new IllegalStateException("Need to connect to remote jolokia first"); } - J4pVersionResponse vr = null; + J4pVersionResponse vr; try { vr = jolokia.execute(new J4pVersionRequest()); return vr != null && vr.getValue() != null; @@ -111,9 +111,13 @@ 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); + String pattern2 = String.format("%s:context=%s,type=services,name=DefaultAsyncProcessorAwaitManager", found.getDomain(), found.getKeyProperty("context")); + ObjectName am = ObjectName.getInstance(pattern2); + List<J4pReadRequest> list = new ArrayList<J4pReadRequest>(); list.add(new J4pReadRequest(found)); list.add(new J4pReadRequest(tc)); + list.add(new J4pReadRequest(am)); List<J4pReadResponse> rr = jolokia.execute(list); if (rr != null && rr.size() > 0) { @@ -130,6 +134,14 @@ public class DefaultJolokiaCamelController extends AbstractCamelController imple answer.put("typeConverter." + asKey(key), second.getValue(key)); } } + + // async processor await manager attributes + if (rr.size() >= 3) { + J4pReadResponse second = rr.get(2); + for (String key : second.getAttributes()) { + answer.put("asyncProcessorAwaitManager." + asKey(key), second.getValue(key)); + } + } } // would be great if there was an api in jolokia to read optional (eg ignore if an mbean does not exists)