CAMEL-9014: Option to turn on extended JMX statistics for EIPs to track fine grained utilization statistics such as which and how often they send to dynamic endpoints.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c330b8aa Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c330b8aa Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c330b8aa Branch: refs/heads/master Commit: c330b8aad66941eda38e8197d0de76d9f9faad0b Parents: 1a576fa Author: Claus Ibsen <davscl...@apache.org> Authored: Sat Jul 25 13:46:31 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sat Jul 25 13:59:39 2015 +0200 ---------------------------------------------------------------------- .../management/mbean/ManagedEnricherMBean.java | 6 +++ .../camel/management/mbean/ManagedEnricher.java | 43 +++++++++++++++++++- .../org/apache/camel/processor/Enricher.java | 5 +++ .../camel/management/ManagedEnricherTest.java | 23 ++++++++++- 4 files changed, 74 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/c330b8aa/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEnricherMBean.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEnricherMBean.java b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEnricherMBean.java index 58666dd..f6bd8be 100644 --- a/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEnricherMBean.java +++ b/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedEnricherMBean.java @@ -16,7 +16,10 @@ */ package org.apache.camel.api.management.mbean; +import javax.management.openmbean.TabularData; + import org.apache.camel.api.management.ManagedAttribute; +import org.apache.camel.api.management.ManagedOperation; public interface ManagedEnricherMBean extends ManagedProcessorMBean { @@ -38,4 +41,7 @@ public interface ManagedEnricherMBean extends ManagedProcessorMBean { @ManagedAttribute(description = "Whether to aggregate when there was an exception thrown during calling the resource endpoint") Boolean isAggregateOnException(); + @ManagedOperation(description = "Statistics of the endpoints that has been enriched from") + TabularData endpointStatistics(); + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/c330b8aa/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEnricher.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEnricher.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEnricher.java index 12451ac..a357774 100644 --- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEnricher.java +++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedEnricher.java @@ -16,12 +16,22 @@ */ package org.apache.camel.management.mbean; +import java.util.Map; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.TabularData; +import javax.management.openmbean.TabularDataSupport; + import org.apache.camel.CamelContext; import org.apache.camel.api.management.ManagedResource; +import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes; import org.apache.camel.api.management.mbean.ManagedEnricherMBean; import org.apache.camel.model.EnrichDefinition; import org.apache.camel.processor.Enricher; +import org.apache.camel.spi.EndpointUtilizationStatistics; import org.apache.camel.spi.ManagementStrategy; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.util.URISupport; /** @@ -31,6 +41,7 @@ import org.apache.camel.util.URISupport; public class ManagedEnricher extends ManagedProcessor implements ManagedEnricherMBean { private final Enricher processor; private String uri; + private boolean sanitize; public ManagedEnricher(CamelContext context, Enricher processor, EnrichDefinition definition) { super(context, processor, definition); @@ -39,7 +50,7 @@ public class ManagedEnricher extends ManagedProcessor implements ManagedEnricher public void init(ManagementStrategy strategy) { super.init(strategy); - boolean sanitize = strategy.getManagementAgent().getMask() != null ? strategy.getManagementAgent().getMask() : false; + sanitize = strategy.getManagementAgent().getMask() != null ? strategy.getManagementAgent().getMask() : false; uri = getDefinition().getExpression().getExpression(); if (sanitize) { uri = URISupport.sanitizeUri(uri); @@ -85,4 +96,34 @@ public class ManagedEnricher extends ManagedProcessor implements ManagedEnricher public Boolean isAggregateOnException() { return processor.isAggregateOnException(); } + + @Override + public TabularData endpointStatistics() { + try { + TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.endpointsUtilizationTabularType()); + + EndpointUtilizationStatistics stats = processor.getEndpointUtilizationStatistics(); + if (stats != null) { + for (Map.Entry<String, Long> entry : stats.getStatistics().entrySet()) { + CompositeType ct = CamelOpenMBeanTypes.endpointsUtilizationCompositeType(); + String url = entry.getKey(); + if (sanitize) { + url = URISupport.sanitizeUri(url); + } + + Long hits = entry.getValue(); + if (hits == null) { + hits = 0L; + } + + CompositeData data = new CompositeDataSupport(ct, new String[]{"url", "hits"}, new Object[]{url, hits}); + answer.put(data); + } + } + return answer; + } catch (Exception e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/c330b8aa/camel-core/src/main/java/org/apache/camel/processor/Enricher.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/processor/Enricher.java b/camel-core/src/main/java/org/apache/camel/processor/Enricher.java index 99a81ba..eef072f 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/Enricher.java +++ b/camel-core/src/main/java/org/apache/camel/processor/Enricher.java @@ -30,6 +30,7 @@ import org.apache.camel.impl.DefaultExchange; import org.apache.camel.impl.EmptyProducerCache; import org.apache.camel.impl.ProducerCache; import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.apache.camel.spi.EndpointUtilizationStatistics; import org.apache.camel.spi.IdAware; import org.apache.camel.support.ServiceSupport; import org.apache.camel.util.AsyncProcessorConverterHelper; @@ -92,6 +93,10 @@ public class Enricher extends ServiceSupport implements AsyncProcessor, IdAware, return expression; } + public EndpointUtilizationStatistics getEndpointUtilizationStatistics() { + return producerCache.getEndpointUtilizationStatistics(); + } + public void setAggregationStrategy(AggregationStrategy aggregationStrategy) { this.aggregationStrategy = aggregationStrategy; } http://git-wip-us.apache.org/repos/asf/camel/blob/c330b8aa/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java index 782e899..99724b4 100644 --- a/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedEnricherTest.java @@ -20,6 +20,7 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.openmbean.TabularData; +import org.apache.camel.CamelContext; import org.apache.camel.ServiceStatus; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; @@ -29,6 +30,13 @@ import org.apache.camel.component.mock.MockEndpoint; */ public class ManagedEnricherTest extends ManagementTestSupport { + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + context.getManagementStrategy().setExtendedStatisticsEnabled(true); + return context; + } + public void testManageEnricher() throws Exception { // JMX tests dont work well on AIX CI servers (hangs them) if (isPlatform("aix")) { @@ -36,9 +44,14 @@ public class ManagedEnricherTest extends ManagementTestSupport { } MockEndpoint foo = getMockEndpoint("mock:foo"); - foo.expectedMessageCount(1); + foo.expectedMessageCount(2); + + MockEndpoint bar = getMockEndpoint("mock:bar"); + bar.expectedMessageCount(1); template.sendBodyAndHeader("direct:start", "Hello World", "whereto", "foo"); + template.sendBodyAndHeader("direct:start", "Bye World", "whereto", "foo"); + template.sendBodyAndHeader("direct:start", "Hi World", "whereto", "bar"); assertMockEndpointsSatisfied(); @@ -64,7 +77,11 @@ public class ManagedEnricherTest extends ManagementTestSupport { String uri = (String) mbeanServer.getAttribute(on, "Expression"); assertEquals("direct:${header.whereto}", uri); - TabularData data = (TabularData) mbeanServer.invoke(on, "explain", new Object[]{false}, new String[]{"boolean"}); + TabularData data = (TabularData) mbeanServer.invoke(on, "endpointStatistics", null, null); + assertNotNull(data); + assertEquals(2, data.size()); + + data = (TabularData) mbeanServer.invoke(on, "explain", new Object[]{false}, new String[]{"boolean"}); assertNotNull(data); assertEquals(2, data.size()); @@ -86,6 +103,8 @@ public class ManagedEnricherTest extends ManagementTestSupport { .enrich().simple("direct:${header.whereto}").id("mysend"); from("direct:foo").to("mock:foo"); + + from("direct:bar").to("mock:bar"); } }; }