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(); + } +}