Repository: camel Updated Branches: refs/heads/master 1f5872639 -> fc4cbdbe7
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/fc4cbdbe Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/fc4cbdbe Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/fc4cbdbe Branch: refs/heads/master Commit: fc4cbdbe70b319da272ed341702ce96e78eb9401 Parents: 1f58726 Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Aug 17 10:31:32 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Aug 17 10:34:53 2014 +0200 ---------------------------------------------------------------------- components/camel-metrics/pom.xml | 12 +++++++ .../routepolicy/MetricsRegistryMBean.java | 26 ++++++++++++++ .../routepolicy/MetricsRegistryService.java | 38 +++++++++++++++++++- .../metrics/routepolicy/MetricsRoutePolicy.java | 10 ++++++ .../routepolicy/MetricsRoutePolicyFactory.java | 15 +++++++- .../ManagedMetricsRoutePolicyTest.java | 12 +++++++ .../features/src/main/resources/features.xml | 4 +++ 7 files changed, 115 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/components/camel-metrics/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-metrics/pom.xml b/components/camel-metrics/pom.xml index 58aaf69..52ce3b1 100644 --- a/components/camel-metrics/pom.xml +++ b/components/camel-metrics/pom.xml @@ -49,6 +49,18 @@ <version>${metrics-version}</version> </dependency> + <!-- json support --> + <dependency> + <groupId>com.codahale.metrics</groupId> + <artifactId>metrics-json</artifactId> + <version>${metrics-version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>${jackson2-version}</version> + </dependency> + <!-- testing --> <dependency> <groupId>org.apache.camel</groupId> http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryMBean.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryMBean.java b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryMBean.java new file mode 100644 index 0000000..e37f8b6 --- /dev/null +++ b/components/camel-metrics/src/main/java/org/apache/camel/component/metrics/routepolicy/MetricsRegistryMBean.java @@ -0,0 +1,26 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.metrics.routepolicy; + +import org.apache.camel.api.management.ManagedOperation; + +public interface MetricsRegistryMBean { + + @ManagedOperation(description = "Dumps the statistics as json") + String dumpStatisticsAsJson(); + +} http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/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 dc8f584..8ec1534 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 @@ -16,25 +16,36 @@ */ package org.apache.camel.component.metrics.routepolicy; +import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import com.codahale.metrics.JmxReporter; import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.json.MetricsModule; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; +import org.apache.camel.StaticService; +import org.apache.camel.api.management.ManagedResource; import org.apache.camel.spi.ManagementAgent; import org.apache.camel.support.ServiceSupport; +import org.apache.camel.util.ObjectHelper; /** * Service holding the {@link MetricRegistry} which registers all metrics. */ -public final class MetricsRegistryService extends ServiceSupport implements CamelContextAware { +@ManagedResource(description = "MetricsRegistry") +public final class MetricsRegistryService extends ServiceSupport implements CamelContextAware, StaticService, MetricsRegistryMBean { private CamelContext camelContext; private MetricRegistry metricsRegistry; private JmxReporter reporter; private boolean useJmx; private String jmxDomain = "org.apache.camel.metrics"; + private boolean prettyPrint; + private transient ObjectMapper mapper; public MetricRegistry getMetricsRegistry() { return metricsRegistry; @@ -68,6 +79,14 @@ public final class MetricsRegistryService extends ServiceSupport implements Came this.jmxDomain = jmxDomain; } + public boolean isPrettyPrint() { + return prettyPrint; + } + + public void setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + } + @Override protected void doStart() throws Exception { if (metricsRegistry == null) { @@ -86,6 +105,9 @@ public final class MetricsRegistryService extends ServiceSupport implements Came throw new IllegalStateException("CamelContext has not enabled JMX"); } } + + // json mapper + this.mapper = new ObjectMapper().registerModule(new MetricsModule(TimeUnit.SECONDS, TimeUnit.SECONDS, false)); } @Override @@ -95,4 +117,18 @@ public final class MetricsRegistryService extends ServiceSupport implements Came reporter = null; } } + + @Override + public String dumpStatisticsAsJson() { + ObjectWriter writer = mapper.writer(); + if (isPrettyPrint()) { + writer = writer.withDefaultPrettyPrinter(); + } + try { + return writer.writeValueAsString(getMetricsRegistry()); + } catch (JsonProcessingException e) { + throw ObjectHelper.wrapRuntimeCamelException(e); + } + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/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 4f74a05..100bfa7 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 @@ -37,6 +37,7 @@ public class MetricsRoutePolicy extends RoutePolicySupport { private MetricsRegistryService registryService; private boolean useJmx = true; private String jmxDomain = "org.apache.camel.metrics"; + private boolean prettyPrint; private MetricsStatistics statistics; private Route route; @@ -96,6 +97,14 @@ public class MetricsRoutePolicy extends RoutePolicySupport { this.jmxDomain = jmxDomain; } + public boolean isPrettyPrint() { + return prettyPrint; + } + + public void setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + } + @Override public void onInit(Route route) { super.onInit(route); @@ -108,6 +117,7 @@ public class MetricsRoutePolicy extends RoutePolicySupport { registryService.setMetricsRegistry(getMetricsRegistry()); registryService.setUseJmx(isUseJmx()); registryService.setJmxDomain(getJmxDomain()); + registryService.setPrettyPrint(isPrettyPrint()); route.getRouteContext().getCamelContext().addService(registryService); } } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/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 d522567..584db54 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 @@ -28,8 +28,9 @@ import org.apache.camel.spi.RoutePolicyFactory; public class MetricsRoutePolicyFactory implements RoutePolicyFactory { private MetricRegistry metricsRegistry; - private boolean useJmx = true; + private boolean useJmx; private String jmxDomain = "org.apache.camel.metrics"; + private boolean prettyPrint; /** * To use a specific {@link com.codahale.metrics.MetricRegistry} instance. @@ -66,12 +67,24 @@ public class MetricsRoutePolicyFactory implements RoutePolicyFactory { this.jmxDomain = jmxDomain; } + public boolean isPrettyPrint() { + return prettyPrint; + } + + /** + * Whether to use pretty print when outputting JSon + */ + public void setPrettyPrint(boolean prettyPrint) { + this.prettyPrint = prettyPrint; + } + @Override public RoutePolicy createRoutePolicy(CamelContext camelContext, String routeId, RouteDefinition routeDefinition) { MetricsRoutePolicy answer = new MetricsRoutePolicy(); answer.setMetricsRegistry(getMetricsRegistry()); answer.setUseJmx(isUseJmx()); answer.setJmxDomain(getJmxDomain()); + answer.setPrettyPrint(isPrettyPrint()); return answer; } http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/ManagedMetricsRoutePolicyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/ManagedMetricsRoutePolicyTest.java b/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/ManagedMetricsRoutePolicyTest.java index 44d1ab0..209ca9c 100644 --- a/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/ManagedMetricsRoutePolicyTest.java +++ b/components/camel-metrics/src/test/java/org/apache/camel/component/metrics/routepolicy/ManagedMetricsRoutePolicyTest.java @@ -46,6 +46,7 @@ public class ManagedMetricsRoutePolicyTest extends CamelTestSupport { MetricsRoutePolicyFactory factory = new MetricsRoutePolicyFactory(); factory.setUseJmx(true); factory.setMetricsRegistry(registry); + factory.setPrettyPrint(true); context.addRoutePolicyFactory(factory); return context; @@ -71,6 +72,17 @@ public class ManagedMetricsRoutePolicyTest extends CamelTestSupport { // there should be 8 mbeans Set<ObjectName> set = getMBeanServer().queryNames(new ObjectName("org.apache.camel.metrics:*"), null); assertEquals(8, set.size()); + + String name = String.format("org.apache.camel:context=%s,type=services,name=MetricsRegistryService", context.getManagementName()); + ObjectName on = ObjectName.getInstance(name); + String json = (String) getMBeanServer().invoke(on, "dumpStatisticsAsJson", null, null); + assertNotNull(json); + log.info(json); + + assertTrue(json.contains("foo.total")); + assertTrue(json.contains("bar.total")); + assertTrue(json.contains("bar.requests")); + assertTrue(json.contains("foo.requests")); } @Override http://git-wip-us.apache.org/repos/asf/camel/blob/fc4cbdbe/platforms/karaf/features/src/main/resources/features.xml ---------------------------------------------------------------------- diff --git a/platforms/karaf/features/src/main/resources/features.xml b/platforms/karaf/features/src/main/resources/features.xml index 18d4963..b6d7212 100644 --- a/platforms/karaf/features/src/main/resources/features.xml +++ b/platforms/karaf/features/src/main/resources/features.xml @@ -793,6 +793,10 @@ </feature> <feature name='camel-metrics' version='${project.version}' resolver='(obr)' start-level='50'> <bundle dependency='true'>mvn:com.codahale.metrics/metrics-core/${metrics-version}</bundle> + <bundle dependency='true'>mvn:com.codahale.metrics/metrics-json/${metrics-version}</bundle> + <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-core/${jackson2-version}</bundle> + <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-databind/${jackson2-version}</bundle> + <bundle dependency='true'>mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson2-version}</bundle> <feature version='${project.version}'>camel-core</feature> <bundle>mvn:org.apache.camel/camel-metrics/${project.version}</bundle> </feature>