Skip to content

Commit

Permalink
Merge pull request Netflix#281 from SiIrving/master
Browse files Browse the repository at this point in the history
Codahale Metrics Filter configurable with Archaius
  • Loading branch information
benjchristensen committed Aug 27, 2014
2 parents 18899b2 + e91e335 commit af9ff7e
Show file tree
Hide file tree
Showing 3 changed files with 182 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/**
* Copyright 2013 Netflix, Inc.
*
* Licensed 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 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;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/**
* Copyright 2013 Netflix, Inc.
*
* Licensed 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 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.mock;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

/**
* 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));
}
}

0 comments on commit af9ff7e

Please sign in to comment.