Implemented metrics:histogram endpoint.

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/0ad223ee
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/0ad223ee
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/0ad223ee

Branch: refs/heads/master
Commit: 0ad223eeec339e636f5ffd8bf9f4523b90d00ae3
Parents: 225d11d
Author: Lauri Kimmel <lauri.kim...@gmx.com>
Authored: Tue May 13 23:23:02 2014 +1000
Committer: Lauri Kimmel <lauri.kim...@gmx.com>
Committed: Tue May 13 23:23:02 2014 +1000

----------------------------------------------------------------------
 .../apache/camel/metrics/MetricsComponent.java  |  4 +
 .../metrics/histogram/HistogramEndpoint.java    | 39 ++++++++++
 .../metrics/histogram/HistogramProducer.java    | 34 +++++++++
 .../metrics/MetricsComponentRouteTest.java      |  2 +
 .../camel/metrics/MetricsComponentTest.java     |  7 +-
 .../histogram/HistogramEndpointTest.java        | 74 +++++++++++++++++++
 .../histogram/HistogramProducerTest.java        | 78 ++++++++++++++++++++
 7 files changed, 236 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/main/java/org/apache/camel/metrics/MetricsComponent.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/camel/metrics/MetricsComponent.java 
b/src/main/java/org/apache/camel/metrics/MetricsComponent.java
index b6af8af..7d7d5ef 100644
--- a/src/main/java/org/apache/camel/metrics/MetricsComponent.java
+++ b/src/main/java/org/apache/camel/metrics/MetricsComponent.java
@@ -7,6 +7,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.camel.metrics.counter.CounterEndpoint;
+import org.apache.camel.metrics.histogram.HistogramEndpoint;
 import org.apache.camel.metrics.meter.MeterEndpoint;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.util.ObjectHelper;
@@ -57,6 +58,9 @@ public class MetricsComponent extends DefaultComponent {
             case METER:
                 endpoint = new MeterEndpoint(registry, metricsName);
                 break;
+            case HISTOGRAM:
+                endpoint = new HistogramEndpoint(registry, metricsName);
+                break;
             default:
                 throw new RuntimeCamelException("Metrics type \"" + 
type.toString() + "\" not supported");
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/main/java/org/apache/camel/metrics/histogram/HistogramEndpoint.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/camel/metrics/histogram/HistogramEndpoint.java 
b/src/main/java/org/apache/camel/metrics/histogram/HistogramEndpoint.java
new file mode 100644
index 0000000..8024289
--- /dev/null
+++ b/src/main/java/org/apache/camel/metrics/histogram/HistogramEndpoint.java
@@ -0,0 +1,39 @@
+package org.apache.camel.metrics.histogram;
+
+import org.apache.camel.Producer;
+import org.apache.camel.metrics.AbstractMetricsEndpoint;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+
+import com.codahale.metrics.MetricRegistry;
+
+@UriEndpoint(scheme = "metrics:histogram")
+public class HistogramEndpoint extends AbstractMetricsEndpoint {
+
+    public static String ENDPOINT_URI = "metrics:histogram";
+
+    @UriParam
+    private Long value;
+
+    public HistogramEndpoint(MetricRegistry registry, String metricsName) {
+        super(registry, metricsName);
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new HistogramProducer(this);
+    }
+
+    public Long getValue() {
+        return value;
+    }
+
+    public void setValue(Long value) {
+        this.value = value;
+    }
+
+    @Override
+    protected String createEndpointUri() {
+        return ENDPOINT_URI;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/main/java/org/apache/camel/metrics/histogram/HistogramProducer.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/camel/metrics/histogram/HistogramProducer.java 
b/src/main/java/org/apache/camel/metrics/histogram/HistogramProducer.java
new file mode 100644
index 0000000..9a15607
--- /dev/null
+++ b/src/main/java/org/apache/camel/metrics/histogram/HistogramProducer.java
@@ -0,0 +1,34 @@
+package org.apache.camel.metrics.histogram;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultProducer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.MetricRegistry;
+
+public class HistogramProducer extends DefaultProducer {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(HistogramProducer.class);
+
+    public HistogramProducer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        HistogramEndpoint endpoint = (HistogramEndpoint) getEndpoint();
+        MetricRegistry registry = endpoint.getRegistry();
+        String metricsName = endpoint.getMetricsName();
+        Histogram histogram = registry.histogram(metricsName);
+        Long value = endpoint.getValue();
+        if (value != null) {
+            histogram.update(value);
+        }
+        else {
+            LOG.warn("Cannot update histogram \"{}\" with null value", 
metricsName);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/test/java/org/apache/camel/metrics/MetricsComponentRouteTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/camel/metrics/MetricsComponentRouteTest.java 
b/src/test/java/org/apache/camel/metrics/MetricsComponentRouteTest.java
index b005b93..5ff0ed4 100644
--- a/src/test/java/org/apache/camel/metrics/MetricsComponentRouteTest.java
+++ b/src/test/java/org/apache/camel/metrics/MetricsComponentRouteTest.java
@@ -35,6 +35,8 @@ public class MetricsComponentRouteTest extends 
CamelTestSupport {
                         .to("metrics:counter:C")
                         .to("metrics:meter:D")
                         .to("metrics:meter:D?mark=90001")
+                        .to("metrics:histogram:E")
+                        .to("metrics:histogram:E?value=12000000031")
                         .to("mock:result");
             }
         };

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/test/java/org/apache/camel/metrics/MetricsComponentTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/camel/metrics/MetricsComponentTest.java 
b/src/test/java/org/apache/camel/metrics/MetricsComponentTest.java
index f8dd013..7c1c189 100644
--- a/src/test/java/org/apache/camel/metrics/MetricsComponentTest.java
+++ b/src/test/java/org/apache/camel/metrics/MetricsComponentTest.java
@@ -16,6 +16,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.metrics.counter.CounterEndpoint;
+import org.apache.camel.metrics.histogram.HistogramEndpoint;
 import org.apache.camel.metrics.meter.MeterEndpoint;
 import org.apache.camel.spi.Registry;
 import org.junit.Before;
@@ -135,9 +136,11 @@ public class MetricsComponentTest {
         component.createNewEndpoint(metricRegistry, MetricsType.GAUGE, "a 
name");
     }
 
-    @Test(expected = RuntimeCamelException.class)
+    @Test
     public void testCreateNewEndpointForHistogram() throws Exception {
-        component.createNewEndpoint(metricRegistry, MetricsType.HISTOGRAM, "a 
name");
+        Endpoint endpoint = component.createNewEndpoint(metricRegistry, 
MetricsType.HISTOGRAM, "a name");
+        assertThat(endpoint, is(notNullValue()));
+        assertThat(endpoint, is(instanceOf(HistogramEndpoint.class)));
     }
 
     @Test(expected = RuntimeCamelException.class)

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/test/java/org/apache/camel/metrics/histogram/HistogramEndpointTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/camel/metrics/histogram/HistogramEndpointTest.java 
b/src/test/java/org/apache/camel/metrics/histogram/HistogramEndpointTest.java
new file mode 100644
index 0000000..3ba9ea1
--- /dev/null
+++ 
b/src/test/java/org/apache/camel/metrics/histogram/HistogramEndpointTest.java
@@ -0,0 +1,74 @@
+package org.apache.camel.metrics.histogram;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+
+import org.apache.camel.Producer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import com.codahale.metrics.MetricRegistry;
+
+@RunWith(MockitoJUnitRunner.class)
+public class HistogramEndpointTest {
+
+    private static final String METRICS_NAME = "metrics.name";
+    private static final Long VALUE = System.currentTimeMillis();
+
+    @Mock
+    private MetricRegistry registry;
+
+    private HistogramEndpoint endpoint;
+
+    private InOrder inOrder;
+
+    @Before
+    public void setUp() throws Exception {
+        endpoint = new HistogramEndpoint(registry, METRICS_NAME);
+        inOrder = Mockito.inOrder(registry);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testHistogramEndpoint() throws Exception {
+        assertThat(endpoint, is(notNullValue()));
+        assertThat(endpoint.getRegistry(), is(registry));
+        assertThat(endpoint.getMetricsName(), is(METRICS_NAME));
+    }
+
+    @Test
+    public void testCreateProducer() throws Exception {
+        Producer producer = endpoint.createProducer();
+        assertThat(producer, is(notNullValue()));
+        assertThat(producer, is(HistogramProducer.class));
+    }
+
+    @Test
+    public void testGetValue() throws Exception {
+        assertThat(endpoint.getValue(), is(nullValue()));
+    }
+
+    @Test
+    public void testSetValue() throws Exception {
+        assertThat(endpoint.getValue(), is(nullValue()));
+        endpoint.setValue(VALUE);
+        assertThat(endpoint.getValue(), is(VALUE));
+    }
+
+    @Test
+    public void testCreateEndpointUri() throws Exception {
+        assertThat(endpoint.createEndpointUri(), 
is(HistogramEndpoint.ENDPOINT_URI));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0ad223ee/src/test/java/org/apache/camel/metrics/histogram/HistogramProducerTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/camel/metrics/histogram/HistogramProducerTest.java 
b/src/test/java/org/apache/camel/metrics/histogram/HistogramProducerTest.java
new file mode 100644
index 0000000..296c52c
--- /dev/null
+++ 
b/src/test/java/org/apache/camel/metrics/histogram/HistogramProducerTest.java
@@ -0,0 +1,78 @@
+package org.apache.camel.metrics.histogram;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.when;
+
+import org.apache.camel.Exchange;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.MetricRegistry;
+
+@RunWith(MockitoJUnitRunner.class)
+public class HistogramProducerTest {
+
+    private static final String METRICS_NAME = "metrics.name";
+    private static final Long VALUE = System.currentTimeMillis();
+
+    @Mock
+    private HistogramEndpoint endpoint;
+
+    @Mock
+    private MetricRegistry registry;
+
+    @Mock
+    private Histogram histogram;
+
+    @Mock
+    private Exchange exchange;
+
+    private HistogramProducer producer;
+
+    private InOrder inOrder;
+
+    @Before
+    public void setUp() throws Exception {
+        producer = new HistogramProducer(endpoint);
+        inOrder = Mockito.inOrder(endpoint, registry, histogram, exchange);
+        when(endpoint.getRegistry()).thenReturn(registry);
+        when(endpoint.getMetricsName()).thenReturn(METRICS_NAME);
+        when(registry.histogram(METRICS_NAME)).thenReturn(histogram);
+    }
+
+    @Test
+    public void testHistogramProducer() throws Exception {
+        assertThat(producer.getEndpoint().equals(endpoint), is(true));
+    }
+
+    @Test
+    public void testProcessValueSet() throws Exception {
+        when(endpoint.getValue()).thenReturn(VALUE);
+        producer.process(exchange);
+        inOrder.verify(endpoint, times(1)).getRegistry();
+        inOrder.verify(endpoint, times(1)).getMetricsName();
+        inOrder.verify(registry, times(1)).histogram(METRICS_NAME);
+        inOrder.verify(endpoint, times(1)).getValue();
+        inOrder.verify(histogram, times(1)).update(VALUE);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void testProcessValueNotSet() throws Exception {
+        when(endpoint.getValue()).thenReturn(null);
+        producer.process(exchange);
+        inOrder.verify(endpoint, times(1)).getRegistry();
+        inOrder.verify(endpoint, times(1)).getMetricsName();
+        inOrder.verify(registry, times(1)).histogram(METRICS_NAME);
+        inOrder.verify(endpoint, times(1)).getValue();
+        inOrder.verifyNoMoreInteractions();
+    }
+}

Reply via email to