Use JmxReporter.Builder.filter to handle exclusion rules
Since the support for excluding some metrics from being reported was
added in Ib4da8ba8ad5d6ba3f1cbb0b3f83375cfcef3af67, this metric reporter
was broken: it computed the set of metrics to be exposed once and then
exposed this fixed (sub)set forever. Any newly added metrics were not
exposed. For example: if a plugin which exposes metrics loads after this
plugin, these metrics would be exposed via JMX. Further, even some
metrics bound via a MetricModule in Gerrit core wouldn't be reported by
this plugin if that MetricModule (which is also a LifeCycleModule)
happens to receive its start() call after this plugin already computed
the snapshot of exposed metrics.
Instead of copying the set of exposed metrics in a new MetricRegistry,
apply a MetricFilter to the MetricRegistry instance from Gerrit core.
Handle exclusion rules through that filter.
Change-Id: Iaf0b4fa03293ccc2313ab0332f70a3a41ea30a25
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterjmx/GerritJmxReporter.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterjmx/GerritJmxReporter.java
index 9474814..c845362 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/metricsreporterjmx/GerritJmxReporter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporterjmx/GerritJmxReporter.java
@@ -14,14 +14,13 @@
package com.googlesource.gerrit.plugins.metricsreporterjmx;
-import com.codahale.metrics.Metric;
-import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jmx.JmxReporter;
import com.google.gerrit.extensions.annotations.Listen;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.util.function.Predicate;
@Listen
@Singleton
@@ -30,25 +29,10 @@
@Inject
public GerritJmxReporter(MetricRegistry registry, Configuration config) {
-
- /* Copy the registry to avoid filtering the global one */
- MetricRegistry filteredRegistry = new MetricRegistry();
- filteredRegistry.registerAll(registry);
-
- config
- .getExcludes()
- .forEach(
- exclude -> {
- filteredRegistry.removeMatching(
- new MetricFilter() {
- @Override
- public boolean matches(String name, Metric metric) {
- return name.matches(exclude);
- }
- });
- });
-
- this.reporter = JmxReporter.forRegistry(filteredRegistry).build();
+ Predicate<String> exclusionFilter =
+ s -> config.getExcludes().stream().anyMatch(e -> s.matches(e));
+ this.reporter =
+ JmxReporter.forRegistry(registry).filter((n, m) -> !exclusionFilter.test(n)).build();
}
@Override