diff --git a/hystrix-contrib/hystrix-codahale-metrics-publisher/build.gradle b/hystrix-contrib/hystrix-codahale-metrics-publisher/build.gradle index 3f324a096..1013cc41e 100644 --- a/hystrix-contrib/hystrix-codahale-metrics-publisher/build.gradle +++ b/hystrix-contrib/hystrix-codahale-metrics-publisher/build.gradle @@ -5,6 +5,8 @@ apply plugin: 'idea' dependencies { compile project(':hystrix-core') compile 'com.codahale.metrics:metrics-core:3.0.1' + testCompile 'junit:junit-dep:4.10' + testCompile 'org.mockito:mockito-all:1.9.5' } eclipse { diff --git a/hystrix-contrib/hystrix-codahale-metrics-publisher/src/main/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilter.java b/hystrix-contrib/hystrix-codahale-metrics-publisher/src/main/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilter.java new file mode 100644 index 000000000..31acf15ad --- /dev/null +++ b/hystrix-contrib/hystrix-codahale-metrics-publisher/src/main/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilter.java @@ -0,0 +1,70 @@ +package com.netflix.hystrix.contrib.codahalemetricspublisher; + +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricFilter; +import com.netflix.config.DynamicPropertyFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * An implementation of @MetricFilter based upon an Archaius DynamicPropertyFactory + * + * To enable this filter, the property 'filter.graphite,metrics' must be set to TRUE + * + * If this is the case, metrics will be filtered unless METRIC_NAME = true is set in + * the properties + * + * + * eg HystrixCommand.IndiciaService.GetIndicia.countFailure = true + * + * + * For detail on how the metric names are constructed, refer to the source of the + * + * {@link HystrixCodaHaleMetricsPublisherCommand} + * + * and + * + * {@link HystrixCodaHaleMetricsPublisherThreadPool} + * + * classes. + * + * @author Simon Irving + */ +public class ConfigurableCodaHaleMetricFilter implements MetricFilter{ + + private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurableCodaHaleMetricFilter.class); + + private DynamicPropertyFactory archaiusPropertyFactory; + + + public ConfigurableCodaHaleMetricFilter(DynamicPropertyFactory archaiusPropertyFactory) + { + this.archaiusPropertyFactory = archaiusPropertyFactory; + } + + @Override + public boolean matches(String s, Metric metric) { + + if (!isFilterEnabled()) + { + return true; + } + + boolean matchesFilter = archaiusPropertyFactory.getBooleanProperty(s, false).get(); + + LOGGER.debug("Does metric [{}] match filter? [{}]",s,matchesFilter); + + return matchesFilter; + } + + protected boolean isFilterEnabled() { + + boolean filterEnabled = archaiusPropertyFactory.getBooleanProperty("filter.graphite,metrics", false).get(); + + LOGGER.debug("Is filter enabled? [{}]", filterEnabled); + + return filterEnabled; + } + + +} diff --git a/hystrix-contrib/hystrix-codahale-metrics-publisher/src/test/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilterTest.java b/hystrix-contrib/hystrix-codahale-metrics-publisher/src/test/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilterTest.java new file mode 100644 index 000000000..ca69f9c00 --- /dev/null +++ b/hystrix-contrib/hystrix-codahale-metrics-publisher/src/test/java/com/netflix/hystrix/contrib/codahalemetricspublisher/ConfigurableCodaHaleMetricFilterTest.java @@ -0,0 +1,76 @@ +package com.netflix.hystrix.contrib.codahalemetricspublisher; + +import com.codahale.metrics.Metric; +import com.netflix.config.DynamicBooleanProperty; +import com.netflix.config.DynamicPropertyFactory; +import org.junit.After; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.*; + +/** + * Test the ConfigurableCodaHaleMetricFilter + * + * @author Simon Irving + */ +public class ConfigurableCodaHaleMetricFilterTest { + + private Metric metric = mock(Metric.class); + + private final static DynamicPropertyFactory archiausPropertyFactory = mock(DynamicPropertyFactory.class); + + private static final DynamicBooleanProperty DYNAMIC_BOOLEAN_TRUE = mock(DynamicBooleanProperty.class); + private static final DynamicBooleanProperty DYNAMIC_BOOLEAN_FALSE = mock(DynamicBooleanProperty.class); + + @BeforeClass + public static void initialiseMocks() + { + when(archiausPropertyFactory.getBooleanProperty(any(String.class), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_FALSE); + when(archiausPropertyFactory.getBooleanProperty(eq("this.metric.is.allowed"), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_TRUE); + when(DYNAMIC_BOOLEAN_TRUE.get()).thenReturn(true); + when(DYNAMIC_BOOLEAN_FALSE.get()).thenReturn(false); + } + + @After + public void assertMetricsNotTouched() + { + verifyZeroInteractions(metric); + } + + @Test + public void testMetricConfiguredInFilterWithFilterEnabled() + { + when(archiausPropertyFactory.getBooleanProperty(eq("filter.graphite,metrics"), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_TRUE); + ConfigurableCodaHaleMetricFilter filter = new ConfigurableCodaHaleMetricFilter(archiausPropertyFactory); + assertTrue(filter.matches("this.metric.is.allowed", metric)); + } + + @Test + public void testMetricConfiguredInFilterWithFilterDisabled() + { + when(archiausPropertyFactory.getBooleanProperty(eq("filter.graphite,metrics"), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_FALSE); + ConfigurableCodaHaleMetricFilter filter = new ConfigurableCodaHaleMetricFilter(archiausPropertyFactory); + assertTrue(filter.matches("this.metric.is.allowed", metric)); + } + + @Test + public void testMetricNotConfiguredInFilterWithFilterEnabled() + { + when(archiausPropertyFactory.getBooleanProperty(eq("filter.graphite,metrics"), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_TRUE); + ConfigurableCodaHaleMetricFilter filter = new ConfigurableCodaHaleMetricFilter(archiausPropertyFactory); + assertFalse(filter.matches("this.metric.is.not.allowed", metric)); + } + + @Test + public void testMetricNotConfiguredInFilterWithFilterDisabled() + { + when(archiausPropertyFactory.getBooleanProperty(eq("filter.graphite,metrics"), any(Boolean.class))).thenReturn(DYNAMIC_BOOLEAN_FALSE); + ConfigurableCodaHaleMetricFilter filter = new ConfigurableCodaHaleMetricFilter(archiausPropertyFactory); + assertTrue(filter.matches("this.metric.is.not.allowed", metric)); + } +}