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>

Reply via email to