Repository: camel Updated Branches: refs/heads/master 718d76779 -> 9b7852b40
CAMEL-7696: camel-metrics - Add a route policy to expose route stats as codehale metrics. Work in progress. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/2ff43ad4 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2ff43ad4 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2ff43ad4 Branch: refs/heads/master Commit: 2ff43ad42f4819184d374b2b6708aa40187fd000 Parents: 718d767 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Aug 15 14:23:33 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Aug 15 14:23:33 2014 +0200 ---------------------------------------------------------------------- .../routepolicy/MetricsRegistryService.java | 47 ++++++++++++++-- .../metrics/routepolicy/MetricsRoutePolicy.java | 58 +++++++++++++++----- .../routepolicy/MetricsRoutePolicyFactory.java | 47 +++++++++++++++- .../routepolicy/MetricsRoutePolicyTest.java | 22 +++++--- 4 files changed, 146 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/2ff43ad4/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryService.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryService.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryService.java index efa3663..07a494f 100644 --- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryService.java +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryService.java @@ -22,18 +22,28 @@ import com.codahale.metrics.JmxReporter; import com.codahale.metrics.MetricRegistry; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.spi.ManagementAgent; import org.apache.camel.support.ServiceSupport; +/** + * Service holding the {@link MetricRegistry} which registers all metrics. + */ public final class MetricsRegistryService extends ServiceSupport implements CamelContextAware { private CamelContext camelContext; private MetricRegistry registry; private JmxReporter reporter; + private boolean useJmx; + private String jmxDomain = "org.apache.camel.metrics"; public MetricRegistry getRegistry() { return registry; } + public void setRegistry(MetricRegistry registry) { + this.registry = registry; + } + public CamelContext getCamelContext() { return camelContext; } @@ -42,15 +52,40 @@ public final class MetricsRegistryService extends ServiceSupport implements Came this.camelContext = camelContext; } + public boolean isUseJmx() { + return useJmx; + } + + public void setUseJmx(boolean useJmx) { + this.useJmx = useJmx; + } + + public String getJmxDomain() { + return jmxDomain; + } + + public void setJmxDomain(String jmxDomain) { + this.jmxDomain = jmxDomain; + } + @Override protected void doStart() throws Exception { - registry = new MetricRegistry(); + if (registry == null) { + registry = new MetricRegistry(); + } - MBeanServer server = getCamelContext().getManagementStrategy().getManagementAgent().getMBeanServer(); - if (server != null) { - String domain = "org.apache.camel.metrics." + getCamelContext().getManagementName(); - reporter = JmxReporter.forRegistry(registry).registerWith(server).inDomain(domain).build(); - reporter.start(); + if (useJmx) { + ManagementAgent agent = getCamelContext().getManagementStrategy().getManagementAgent(); + if (agent != null) { + MBeanServer server = agent.getMBeanServer(); + if (server != null) { + String domain = jmxDomain + "." + getCamelContext().getManagementName(); + reporter = JmxReporter.forRegistry(registry).registerWith(server).inDomain(domain).build(); + reporter.start(); + } + } else { + throw new IllegalStateException("CamelContext has not enabled JMX"); + } } } http://git-wip-us.apache.org/repos/asf/camel/blob/2ff43ad4/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicy.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicy.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicy.java index d640611..ff1de91 100644 --- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicy.java +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicy.java @@ -18,7 +18,9 @@ package org.apache.camel.component.metrics.routepolicy; import com.codahale.metrics.Counter; import com.codahale.metrics.Meter; +import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.Timer; +import org.apache.camel.CamelContext; import org.apache.camel.Exchange; import org.apache.camel.Route; import org.apache.camel.impl.RoutePolicySupport; @@ -31,11 +33,10 @@ import org.apache.camel.util.ObjectHelper; */ public class MetricsRoutePolicy extends RoutePolicySupport { - // TODO: allow to configure which counters/meters/timers to capture - // TODO: allow to configure the reporter and jmx domain etc on MetricsRegistryService - // TODO: allow to lookup and get hold of com.codahale.metrics.MetricRegistry from java api - - private MetricsRegistryService registry; + private MetricRegistry registry; + private MetricsRegistryService registryService; + private boolean useJmx = true; + private String jmxDomain = "org.apache.camel.metrics"; private MetricsStatistics statistics; private Route route; @@ -71,31 +72,60 @@ public class MetricsRoutePolicy extends RoutePolicySupport { } } + public MetricRegistry getRegistry() { + return registry; + } + + public void setRegistry(MetricRegistry registry) { + this.registry = registry; + } + + public boolean isUseJmx() { + return useJmx; + } + + public void setUseJmx(boolean useJmx) { + this.useJmx = useJmx; + } + + public String getJmxDomain() { + return jmxDomain; + } + + public void setJmxDomain(String jmxDomain) { + this.jmxDomain = jmxDomain; + } + @Override public void onInit(Route route) { super.onInit(route); this.route = route; try { - registry = route.getRouteContext().getCamelContext().hasService(MetricsRegistryService.class); - if (registry == null) { - registry = new MetricsRegistryService(); - route.getRouteContext().getCamelContext().addService(registry); + registryService = route.getRouteContext().getCamelContext().hasService(MetricsRegistryService.class); + if (registryService == null) { + registryService = new MetricsRegistryService(); + registryService.setRegistry(getRegistry()); + registryService.setUseJmx(isUseJmx()); + registryService.setJmxDomain(getJmxDomain()); + route.getRouteContext().getCamelContext().addService(registryService); } } catch (Exception e) { throw ObjectHelper.wrapRuntimeCamelException(e); } // create statistics holder - Counter total = registry.getRegistry().counter(createName("total")); - Counter inflight = registry.getRegistry().counter(createName("inflight")); - Meter requests = registry.getRegistry().meter(createName("requests")); - Timer responses = registry.getRegistry().timer(createName("responses")); + Counter total = registryService.getRegistry().counter(createName("total")); + Counter inflight = registryService.getRegistry().counter(createName("inflight")); + Meter requests = registryService.getRegistry().meter(createName("requests")); + Timer responses = registryService.getRegistry().timer(createName("responses")); statistics = new MetricsStatistics(total, inflight, requests, responses); } private String createName(String type) { - return route.getRouteContext().getCamelContext().getManagementName() + "-" + route.getId() + "-" + type; + CamelContext context = route.getRouteContext().getCamelContext(); + String name = context.getManagementName() != null ? context.getManagementName() : context.getName(); + return name + "-" + route.getId() + "-" + type; } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/2ff43ad4/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java index b354225..2e523a6 100644 --- a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyFactory.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.metrics.routepolicy; +import com.codahale.metrics.MetricRegistry; import org.apache.camel.CamelContext; import org.apache.camel.model.RouteDefinition; import org.apache.camel.spi.RoutePolicy; @@ -26,8 +27,52 @@ import org.apache.camel.spi.RoutePolicyFactory; */ public class MetricsRoutePolicyFactory implements RoutePolicyFactory { + private MetricRegistry registry; + private boolean useJmx = true; + private String jmxDomain = "org.apache.camel.metrics"; + + /** + * To use a specific {@link com.codahale.metrics.MetricRegistry} instance. + * <p/> + * If no instance has been configured, then Camel will create a shared instance to be used. + */ + public void setRegistry(MetricRegistry registry) { + this.registry = registry; + } + + public MetricRegistry getRegistry() { + return registry; + } + + public boolean isUseJmx() { + return useJmx; + } + + /** + * Whether to use JMX reported to enlist JMX MBeans with the metrics statistics. + */ + public void setUseJmx(boolean useJmx) { + this.useJmx = useJmx; + } + + public String getJmxDomain() { + return jmxDomain; + } + + /** + * The JMX domain name to use for the enlisted JMX MBeans. + */ + public void setJmxDomain(String jmxDomain) { + this.jmxDomain = jmxDomain; + } + @Override public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition routeDefinition) { - return new MetricsRoutePolicy(); + MetricsRoutePolicy answer = new MetricsRoutePolicy(); + answer.setRegistry(getRegistry()); + answer.setUseJmx(isUseJmx()); + answer.setJmxDomain(getJmxDomain()); + return answer; } + } http://git-wip-us.apache.org/repos/asf/camel/blob/2ff43ad4/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyTest.java b/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyTest.java index 95a4ad4..cd01b73 100644 --- a/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyTest.java +++ b/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/MetricsRoutePolicyTest.java @@ -16,15 +16,26 @@ */ package org.apache.camel.component.metrics.routepolicy; +import com.codahale.metrics.MetricRegistry; +import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; public class MetricsRoutePolicyTest extends CamelTestSupport { + private MetricRegistry registry = new MetricRegistry(); + @Override - protected boolean useJmx() { - return true; + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + + MetricsRoutePolicyFactory factory = new MetricsRoutePolicyFactory(); + factory.setUseJmx(false); + factory.setRegistry(registry); + context.addRoutePolicyFactory(factory); + + return context; } @Test @@ -41,7 +52,8 @@ public class MetricsRoutePolicyTest extends CamelTestSupport { assertMockEndpointsSatisfied(); - // TODO: assert the jmx mbeans + // there should be 2x4 names + assertEquals(8, registry.getNames().size()); } @Override @@ -49,14 +61,10 @@ public class MetricsRoutePolicyTest extends CamelTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { - context.addRoutePolicyFactory(new MetricsRoutePolicyFactory()); - from("seda:foo").routeId("foo") - .delayer(100) .to("mock:result"); from("seda:bar").routeId("bar") - .delayer(250) .to("mock:result"); } };