Precompile exclusion patterns for better performance The exclusion patterns are matched against every metric name and we have >100 metrics. Just using String.match is expensive because it first compiles the pattern and then performs matching. Improve performance by precompiling all exclusion patterns. Change-Id: I2b5dc312b9736534f4c3b7d426251f0628d49096
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java index 31b6152..b7c96cc 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java +++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterprometheus/GerritPrometheusExporter.java
@@ -13,6 +13,8 @@ // limitations under the License. package com.googlesource.gerrit.plugins.metricsreporterprometheus; +import static java.util.stream.Collectors.toList; + import com.codahale.metrics.MetricRegistry; import com.google.common.base.Strings; import com.google.common.net.HttpHeaders; @@ -25,9 +27,9 @@ import io.prometheus.client.exporter.MetricsServlet; import java.io.IOException; import java.util.Arrays; -import java.util.HashSet; +import java.util.List; import java.util.Optional; -import java.util.Set; +import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -53,13 +55,14 @@ this.prometheusBearerToken = cfgFactory.getFromGerritConfig(pluginName).getString(PROMETHEUS_BEARER_TOKEN); - Set<String> excludedMetrics = new HashSet<>(); - excludedMetrics.addAll( - Arrays.asList(cfgFactory.getFromGerritConfig(pluginName).getStringList(EXCLUDE_KEY))); + List<Pattern> excludes = + Arrays.stream(cfgFactory.getFromGerritConfig(pluginName).getStringList(EXCLUDE_KEY)) + .map(Pattern::compile) + .collect(toList()); FilteredMetricRegistry filteredRegistry = new FilteredMetricRegistry( - registry, s -> excludedMetrics.stream().anyMatch(e -> s.matches(e))); + registry, s -> excludes.stream().anyMatch(e -> e.matcher(s).matches())); // Hook the Dropwizard registry into the Prometheus registry // via the DropwizardExports collector.