Add support for excluding metrics Add configuration option "excludeMetrics" This basically copies the approach from metrics-reporter-cloudwatch. Change-Id: I1990422de9a698c8620bc7303ff78bb8dc2e6904
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritGraphiteReporter.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritGraphiteReporter.java index 59796cf..c220597 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritGraphiteReporter.java +++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritGraphiteReporter.java
@@ -14,6 +14,7 @@ package com.googlesource.gerrit.plugins.metricsreporters; import static com.codahale.metrics.MetricRegistry.name; +import static java.util.stream.Collectors.toList; import com.codahale.metrics.MetricFilter; import com.codahale.metrics.MetricRegistry; @@ -28,7 +29,11 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.regex.Pattern; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,6 +48,7 @@ private static final String KEY_PORT = "port"; private static final String KEY_PREFIX = "prefix"; private static final String KEY_RATE = "rate"; + private static final String KEY_EXCLUDE = "excludeMetrics"; private static final int DEFAULT_PORT = 2003; private static final String DEFAULT_PREFIX = "gerrit"; private static final TimeUnit DEFAULT_RATE_UNIT = TimeUnit.SECONDS; @@ -57,6 +63,9 @@ Config config = configFactory.getGlobalPluginConfig(pluginName); String host = config.getString(SECTION_GRAPHITE, null, KEY_HOST); + MetricFilter exclusionFilter = + buildExclusionFilter(config.getStringList(SECTION_GRAPHITE, null, KEY_EXCLUDE)); + if (host != null) { int port; try { @@ -100,7 +109,7 @@ .convertRatesTo(TimeUnit.MINUTES) .convertDurationsTo(TimeUnit.MILLISECONDS) .prefixedWith(prefix) - .filter(MetricFilter.ALL) + .filter(exclusionFilter) .build(new Graphite(new InetSocketAddress(host, port))); } else { log.warn("No hostname configured; not reporting to Graphite"); @@ -109,6 +118,14 @@ } } + private MetricFilter buildExclusionFilter(String[] exclusionList) { + final List<Pattern> excludedMetricPatterns = + Arrays.stream(exclusionList).map(Pattern::compile).collect(toList()); + Predicate<String> filter = + s -> excludedMetricPatterns.stream().anyMatch(e -> e.matcher(s).matches()); + return (s, metric) -> !filter.test(s); + } + @Override public void start() { if (graphiteReporter != null) {
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index b1f8e71..a4fabed 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -23,3 +23,28 @@ units such as 'm', 's', 'ms', etc, but will be converted to seconds. The lowest supported rate is `1 s`. Defaults to `60 s`. + +graphite.excludeMetrics +: Regex pattern used to exclude metrics from the report. + + The matching is done against the Gerrit metrics names as documented on + ['Metrics'](@URL@Documentation/metrics.html). The pattern matching is done + internally using `regex.Matcher.matches()` and can match anywhere (not + necessarly starting at the beginning of the metric name) + + By default no metric is excluded. + + For examples: + + To exclude all metrics matching `cache` at some place in their key, use: + `excludeMetrics = cache.*` + + To exclude multiple metrics: + ``` + [graphite] + excludeMetrics = ^http/server/rest_api/.* + excludeMetrics = ^license/cla_check_count + excludeMetrics = ^plugin/latency/.* + excludeMetrics = ^reviewer_suggestion/.* + excludeMetrics = ^sequence/next_id_latency.* + ```