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