Implement configuration file usage A configuration file can be used to specify plugin properties. Unwanted metrics can be disabled via the "exclude" property. Change-Id: Ib4da8ba8ad5d6ba3f1cbb0b3f83375cfcef3af67
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/Configuration.java new file mode 100644 index 0000000..efd075d --- /dev/null +++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/Configuration.java
@@ -0,0 +1,58 @@ +// Copyright (C) 2019 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.googlesource.gerrit.plugins.metricsreporters; + +import com.google.gerrit.extensions.annotations.PluginName; +import com.google.gerrit.server.config.SitePaths; +import com.google.inject.Inject; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.FS; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Configuration { + private static final Logger log = LoggerFactory.getLogger(Configuration.class); + + // configuration parameters + private static final String METRICS_SECTION = "metrics"; + private static final String EXCLUDE_KEY = "exclude"; + + private final Set<String> excludes = new HashSet<>(); + + @Inject + public Configuration(@PluginName String pluginName, SitePaths site) { + Path pluginConfigFile = site.etc_dir.resolve(pluginName + ".config"); + + FileBasedConfig config = new FileBasedConfig(pluginConfigFile.toFile(), FS.DETECTED); + + try { + config.load(); + excludes.addAll(Arrays.asList(config.getStringList(METRICS_SECTION, null, EXCLUDE_KEY))); + } catch (IOException e) { + log.error("Failed to open configuration file '" + pluginConfigFile.toString() + "'"); + } catch (ConfigInvalidException e) { + log.error("Failed to parse configuration file '" + pluginConfigFile.toString() + "'"); + } + } + + public Set<String> getExcludes() { + return excludes; + } +}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritJmxReporter.java b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritJmxReporter.java index cdfbb22..9935c67 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritJmxReporter.java +++ b/src/main/java/com/googlesource/gerrit/plugins/metricsreporters/GerritJmxReporter.java
@@ -13,6 +13,8 @@ // limitations under the License. package com.googlesource.gerrit.plugins.metricsreporters; +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; @@ -26,8 +28,26 @@ private final JmxReporter reporter; @Inject - public GerritJmxReporter(MetricRegistry registry) { - this.reporter = JmxReporter.forRegistry(registry).build(); + 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(); } @Override
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md new file mode 100644 index 0000000..bf82194 --- /dev/null +++ b/src/main/resources/Documentation/config.md
@@ -0,0 +1,19 @@ +@PLUGIN@ Configuration +========================= + +The following fields can be specified in `$site_path/etc/@PLUGIN@.config` file: + +File '@PLUGIN@.config' +-------------------- + +### Exclude metrics + +``` +[metrics] + exclude = caches.* + exclude = events.* +``` + +```metrics.exclude``` +: String used to exclude metrics from the report. It can be specified multiple times. + Parsed as regular expression. Note, ^ and $ are automatically added around the string.