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.*
+ ```