You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/02/15 19:00:56 UTC

[52/52] [abbrv] lucene-solr:jira/solr-9858: SOLR-9858 Improve configuration of replica and overseer reporters.

SOLR-9858 Improve configuration of replica and overseer reporters.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f0ea3b79
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f0ea3b79
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f0ea3b79

Branch: refs/heads/jira/solr-9858
Commit: f0ea3b792cc7288489453476e3a23e89e71b63a7
Parents: 537cbf7
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Wed Feb 15 19:59:17 2017 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Wed Feb 15 19:59:17 2017 +0100

----------------------------------------------------------------------
 .../org/apache/solr/core/CoreContainer.java     |  2 +-
 .../handler/admin/MetricsCollectorHandler.java  | 31 ++++++++--
 .../apache/solr/metrics/SolrMetricManager.java  |  1 -
 .../reporters/solr/SolrOverseerReporter.java    | 62 +++++++++++++++++---
 .../reporters/solr/SolrReplicaReporter.java     | 41 +++++++++----
 .../metrics/reporters/solr/SolrReporter.java    | 62 +++++++++++++-------
 .../src/test-files/solr/solr-solrreporter.xml   | 22 ++++++-
 .../reporters/solr/SolrCloudReportersTest.java  |  4 +-
 8 files changed, 174 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/core/CoreContainer.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index a659cf5..b23937d 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -515,7 +515,7 @@ public class CoreContainer {
     configSetsHandler = createHandler(CONFIGSETS_HANDLER_PATH, cfg.getConfigSetsHandlerClass(), ConfigSetsHandler.class);
     metricsHandler = createHandler(METRICS_PATH, MetricsHandler.class.getName(), MetricsHandler.class);
     metricsCollectorHandler = createHandler(MetricsCollectorHandler.HANDLER_PATH, MetricsCollectorHandler.class.getName(), MetricsCollectorHandler.class);
-    // nocommit add some configuration here
+    // may want to add some configuration here in the future
     metricsCollectorHandler.init(null);
     containerHandlers.put(AUTHZ_PATH, securityConfHandler);
     securityConfHandler.initializeMetrics(metricManager, SolrInfoMBean.Group.node.toString(), AUTHZ_PATH);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/handler/admin/MetricsCollectorHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/MetricsCollectorHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/MetricsCollectorHandler.java
index 829541e..fd47768 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsCollectorHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsCollectorHandler.java
@@ -51,7 +51,30 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Handler to collect and aggregate metric reports.
+ * Handler to collect and aggregate metric reports.  Each report indicates the target registry where
+ * metrics values should be collected and aggregated. Mtrics with the same names are
+ * aggregated using {@link AggregateMetric} instances, which track the source of updates and
+ * their count, as well as providing simple statistics over collected values.
+ *
+ * Each report consists of {@link SolrInputDocument}-s that are expected to contain
+ * the following fields:
+ * <ul>
+ *   <li>{@link SolrReporter#GROUP_ID} - (required) specifies target registry name where metrics will be grouped.</li>
+ *   <li>{@link SolrReporter#REPORTER_ID} - (required) id of the reporter that sent this update. This can be eg.
+ *   node name or replica name or other id that uniquely identifies the source of metrics values.</li>
+ *   <li>{@link MetricUtils#METRIC_NAME} - (required) metric name (in the source registry)</li>
+ *   <li>{@link SolrReporter#LABEL_ID} - (optional) label to prepend to metric names in the target registry.</li>
+ *   <li>{@link SolrReporter#REGISTRY_ID} - (optional) name of the source registry.</li>
+ * </ul>
+ * Remaining fields are assumed to be single-valued, and to contain metric attributes and their values. Example:
+ * <pre>
+ *   <doc>
+ *     <field name="_group_">solr.core.collection1.shard1.leader</field>
+ *     <field name="_reporter_">solr.core.collection1.shard1.replica1.core_node3</field>
+ *     <field name="metric">INDEX.merge.errors</field>
+ *     <field name="value">0</field>
+ *   </doc>
+ * </pre>
  */
 public class MetricsCollectorHandler extends RequestHandlerBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -127,7 +150,7 @@ public class MetricsCollectorHandler extends RequestHandlerBase {
       }
       String metricName = (String)doc.getFieldValue(MetricUtils.METRIC_NAME);
       if (metricName == null) {
-        log.warn("Missing metric " + MetricUtils.METRIC_NAME + " field in document, skipping: " + doc);
+        log.warn("Missing " + MetricUtils.METRIC_NAME + " field in document, skipping: " + doc);
         return;
       }
       doc.remove(MetricUtils.METRIC_NAME);
@@ -135,13 +158,13 @@ public class MetricsCollectorHandler extends RequestHandlerBase {
       doc.remove(SolrReporter.REGISTRY_ID);
       String groupId = (String)doc.getFieldValue(SolrReporter.GROUP_ID);
       if (groupId == null) {
-        log.warn("Missing metric " + SolrReporter.GROUP_ID + " field in document, skipping: " + doc);
+        log.warn("Missing " + SolrReporter.GROUP_ID + " field in document, skipping: " + doc);
         return;
       }
       doc.remove(SolrReporter.GROUP_ID);
       String reporterId = (String)doc.getFieldValue(SolrReporter.REPORTER_ID);
       if (reporterId == null) {
-        log.warn("Missing metric " + SolrReporter.REPORTER_ID + " field in document, skipping: " + doc);
+        log.warn("Missing " + SolrReporter.REPORTER_ID + " field in document, skipping: " + doc);
         return;
       }
       doc.remove(SolrReporter.REPORTER_ID);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
index 28b8833..af920b1 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
@@ -913,7 +913,6 @@ public class SolrMetricManager {
     if (!cc.isZooKeeperAware()) {
       return;
     }
-    // load even for non-leader replicas, as their status may change unexpectedly
     Map<String, String> attrs = new HashMap<>();
     attrs.put("name", "overseerDefault");
     attrs.put("group", "overseer");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrOverseerReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrOverseerReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrOverseerReporter.java
index 7f5de69..f1f22a9 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrOverseerReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrOverseerReporter.java
@@ -7,6 +7,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
@@ -15,6 +16,7 @@ import org.apache.solr.cloud.Overseer;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
+import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrInfoMBean;
 import org.apache.solr.handler.admin.MetricsCollectorHandler;
@@ -25,6 +27,29 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
+ * This reporter sends selected metrics from local registries to {@link Overseer}.
+ * <p>Example configuration:</p>
+ * <pre>
+ *       <reporter name="test" group="overseer">
+ *         <str name="handler">/admin/metrics/collector</str>
+ *         <int name="period">11</int>
+ *         <lst name="report">
+ *           <str name="group">overseer</str>
+ *           <str name="label">jvm</str>
+ *           <str name="registry">solr\.jvm</str>
+ *           <str name="filter">memory\.total\..*</str>
+ *           <str name="filter">memory\.heap\..*</str>
+ *           <str name="filter">os\.SystemLoadAverage</str>
+ *           <str name="filter">threads\.count</str>
+ *         </lst>
+ *         <lst name="report">
+ *           <str name="group">overseer</str>
+ *           <str name="label">leader.$1</str>
+ *           <str name="registry">solr\.core\.(.*)\.leader</str>
+ *           <str name="filter">UPDATE\./update/.*</str>
+ *         </lst>
+ *       </reporter>
+ * </pre>
  *
  */
 public class SolrOverseerReporter extends SolrMetricReporter {
@@ -32,22 +57,25 @@ public class SolrOverseerReporter extends SolrMetricReporter {
 
   public static final String OVERSEER_GROUP = SolrMetricManager.overridableRegistryName(SolrInfoMBean.Group.overseer.toString());
 
-  public static final List<SolrReporter.Specification> DEFAULT_METRICS = new ArrayList<SolrReporter.Specification>() {{
-    add(new SolrReporter.Specification(OVERSEER_GROUP, "jetty",
+  public static final List<SolrReporter.Report> DEFAULT_REPORTS = new ArrayList<SolrReporter.Report>() {{
+    add(new SolrReporter.Report(OVERSEER_GROUP, "jetty",
         SolrMetricManager.overridableRegistryName(SolrInfoMBean.Group.jetty.toString()),
         Collections.emptySet())); // all metrics
-    add(new SolrReporter.Specification(OVERSEER_GROUP, "jvm",
+    add(new SolrReporter.Report(OVERSEER_GROUP, "jvm",
         SolrMetricManager.overridableRegistryName(SolrInfoMBean.Group.jvm.toString()),
         new HashSet<String>() {{
           add("memory\\.total\\..*");
           add("memory\\.heap\\..*");
           add("os\\.SystemLoadAverage");
+          add("os\\.FreePhysicalMemorySize");
+          add("os\\.FreeSwapSpaceSize");
+          add("os\\.OpenFileDescriptorCount");
           add("threads\\.count");
         }})); // all metrics
     // XXX anything interesting here?
     //add(new SolrReporter.Specification(OVERSEER_GROUP, "node", SolrMetricManager.overridableRegistryName(SolrInfoMBean.Group.node.toString()),
     //    Collections.emptySet())); // all metrics
-    add(new SolrReporter.Specification(OVERSEER_GROUP, "leader.$1", "solr\\.core\\.(.*)\\.leader",
+    add(new SolrReporter.Report(OVERSEER_GROUP, "leader.$1", "solr\\.core\\.(.*)\\.leader",
         new HashSet<String>(){{
           add("UPDATE\\./update/.*");
           add("QUERY\\./select.*");
@@ -58,7 +86,7 @@ public class SolrOverseerReporter extends SolrMetricReporter {
 
   private String handler = MetricsCollectorHandler.HANDLER_PATH;
   private int period = 60;
-  private List<SolrReporter.Specification> metrics = DEFAULT_METRICS;
+  private List<SolrReporter.Report> reports = new ArrayList<>();
 
   private SolrReporter reporter;
 
@@ -80,17 +108,35 @@ public class SolrOverseerReporter extends SolrMetricReporter {
     this.period = period;
   }
 
+  public void setReport(List<Map> reportConfig) {
+    if (reportConfig == null || reportConfig.isEmpty()) {
+      return;
+    }
+    reportConfig.forEach(map -> {
+      SolrReporter.Report r = SolrReporter.Report.fromMap(map);
+      if (r != null) {
+        reports.add(r);
+      }
+    });
+  }
+
   // for unit tests
-  public int getPeriod() {
+  int getPeriod() {
     return period;
   }
 
+  List<SolrReporter.Report> getReports() {
+    return reports;
+  }
+
   @Override
   protected void validate() throws IllegalStateException {
     if (period < 1) {
       log.info("Turning off node reporter, period=" + period);
     }
-    // start in setCoreContainer(...)
+    if (reports.isEmpty()) { // set defaults
+      reports = DEFAULT_REPORTS;
+    }
   }
 
   @Override
@@ -111,7 +157,7 @@ public class SolrOverseerReporter extends SolrMetricReporter {
     HttpClient httpClient = cc.getUpdateShardHandler().getHttpClient();
     ZkController zk = cc.getZkController();
     String reporterId = zk.getNodeName();
-    reporter = SolrReporter.Builder.forRegistries(metricManager, metrics)
+    reporter = SolrReporter.Builder.forRegistries(metricManager, reports)
         .convertRatesTo(TimeUnit.SECONDS)
         .convertDurationsTo(TimeUnit.MILLISECONDS)
         .withHandler(handler)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReplicaReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReplicaReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReplicaReporter.java
index 06a4f92..a303ffc 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReplicaReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReplicaReporter.java
@@ -18,8 +18,10 @@ package org.apache.solr.metrics.reporters.solr;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
@@ -35,19 +37,32 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * This class reports selected metrics from replicas to a shard leader.
+ * This class reports selected metrics from replicas to shard leader.
+ * <p>Example configuration:</p>
+ * <pre>
+ *    <reporter name="test" group="replica">
+ *      <int name="period">11</int>
+ *      <str name="filter">UPDATE\./update/.*requests</str>
+ *      <str name="filter">QUERY\./select.*requests</str>
+ *    </reporter>
+ * </pre>
  */
 public class SolrReplicaReporter extends SolrMetricReporter {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  public static final String[] DEFAULT_METRICS = {
-    "TLOG.*", "REPLICATION.*", "INDEX.flush.*", "INDEX.merge.major.*", "UPDATE\\./update/.*requests", "QUERY\\./select.*requests"
-  };
+  public static final List<String> DEFAULT_FILTERS = new ArrayList(){{
+    add("TLOG.*");
+    add("REPLICATION.*");
+    add("INDEX.flush.*");
+    add("INDEX.merge.major.*");
+    add("UPDATE\\./update/.*requests");
+    add("QUERY\\./select.*requests");
+  }};
 
   private String groupId;
   private String handler = MetricsCollectorHandler.HANDLER_PATH;
   private int period = 60;
-  private String[] metrics = DEFAULT_METRICS;
+  private List<String> filters = new ArrayList<>();
 
   private SolrReporter reporter;
 
@@ -75,18 +90,15 @@ public class SolrReplicaReporter extends SolrMetricReporter {
   }
 
   // for unit tests
-  public int getPeriod() {
+  int getPeriod() {
     return period;
   }
 
-  public void setMetrics(String prefixList) {
-    if (prefixList == null || prefixList.isEmpty()) {
+  public void setFilter(List<String> filterConfig) {
+    if (filterConfig == null || filterConfig.isEmpty()) {
       return;
     }
-    String[] newMetrics = prefixList.split("[\\s,]+");
-    if (newMetrics.length > 0) {
-      metrics = newMetrics;
-    }
+    filters = filterConfig;
   }
 
   @Override
@@ -94,6 +106,9 @@ public class SolrReplicaReporter extends SolrMetricReporter {
     if (period < 1) {
       log.info("Turning off replica reporter, period=" + period);
     }
+    if (filters.isEmpty()) {
+      filters = DEFAULT_FILTERS;
+    }
     // start in inform(...) only when core is available
   }
 
@@ -118,7 +133,7 @@ public class SolrReplicaReporter extends SolrMetricReporter {
     }
     // our id is coreNodeName
     String id = core.getCoreDescriptor().getCloudDescriptor().getCoreNodeName();
-    SolrReporter.Specification spec = new SolrReporter.Specification(groupId, null, registryName, Arrays.asList(metrics));
+    SolrReporter.Report spec = new SolrReporter.Report(groupId, null, registryName, filters);
     reporter = SolrReporter.Builder.forRegistries(metricManager, Collections.singletonList(spec))
         .convertRatesTo(TimeUnit.SECONDS)
         .convertDurationsTo(TimeUnit.MILLISECONDS)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReporter.java
index a2fe50b..3e8597d 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrReporter.java
@@ -66,36 +66,58 @@ public class SolrReporter extends ScheduledReporter {
   /**
    * Specification of what registries and what metrics to send.
    */
-  public static final class Specification {
+  public static final class Report {
     public String groupPattern;
     public String labelPattern;
     public String registryPattern;
-    public Set<String> metricPatterns = new HashSet<>();
+    public Set<String> metricFilters = new HashSet<>();
 
     /**
-     * Create a specification
-     * @param groupPattern logical group for these metrics. This is used in {@link MetricsCollectorHandler} to select
-     *              the target registry for metrics to aggregate. It may contain back-references to capture groups from
-     *                     {@code registryPattern}
-     * @param labelPattern name of this group of metrics. This is used in {@link MetricsCollectorHandler} to prefix
-     *              metric names. May be null or empty. It may contain back-references to capture groups from
-     *                     {@code registryPattern}.
+     * Create a report specification
+     * @param groupPattern logical group for these metrics. This is used in {@link MetricsCollectorHandler}
+     *                     to select the target registry for metrics to aggregate. Must not be null or empty.
+     *                     It may contain back-references to capture groups from {@code registryPattern}
+     * @param labelPattern name of this group of metrics. This is used in {@link MetricsCollectorHandler}
+     *                     to prefix metric names. May be null or empty. It may contain back-references
+     *                     to capture groups from {@code registryPattern}.
      * @param registryPattern pattern for selecting matching registries, see {@link SolrMetricManager#registryNames(String...)}
-     * @param metricPatterns patterns for selecting matching metrics, see {@link SolrMetricManager.RegexFilter}
+     * @param metricFilters patterns for selecting matching metrics, see {@link SolrMetricManager.RegexFilter}
      */
-    public Specification(String groupPattern, String labelPattern, String registryPattern, Collection<String> metricPatterns) {
+    public Report(String groupPattern, String labelPattern, String registryPattern, Collection<String> metricFilters) {
       this.groupPattern = groupPattern;
       this.labelPattern = labelPattern;
       this.registryPattern = registryPattern;
-      if (metricPatterns != null) {
-        this.metricPatterns.addAll(metricPatterns);
+      if (metricFilters != null) {
+        this.metricFilters.addAll(metricFilters);
       }
     }
+
+    public static Report fromMap(Map<?, ?> map) {
+      String groupPattern = (String)map.get("group");
+      String labelPattern = (String)map.get("label");
+      String registryPattern = (String)map.get("registry");
+      Object oFilters = map.get("filter");
+      Collection<String> metricFilters = Collections.emptyList();
+      if (oFilters != null) {
+        if (oFilters instanceof String) {
+          metricFilters = Collections.singletonList((String)oFilters);
+        } else if (oFilters instanceof Collection) {
+          metricFilters = (Collection<String>)oFilters;
+        } else {
+          log.warn("Invalid report filters, ignoring: " + oFilters);
+        }
+      }
+      if (groupPattern == null || registryPattern == null) {
+        log.warn("Invalid report configuration, group and registry required!: " + map);
+        return null;
+      }
+      return new Report(groupPattern, labelPattern, registryPattern, metricFilters);
+    }
   }
 
   public static class Builder {
     private final SolrMetricManager metricManager;
-    private final List<Specification> metrics;
+    private final List<Report> metrics;
     private String reporterId;
     private TimeUnit rateUnit;
     private TimeUnit durationUnit;
@@ -112,11 +134,11 @@ public class SolrReporter extends ScheduledReporter {
      *                and the corresponding metrics prefixes, see {@link org.apache.solr.metrics.SolrMetricManager.PrefixFilter}.
      * @return builder
      */
-    public static Builder forRegistries(SolrMetricManager metricManager, List<Specification> metrics) {
+    public static Builder forRegistries(SolrMetricManager metricManager, List<Report> metrics) {
       return new Builder(metricManager, metrics);
     }
 
-    private Builder(SolrMetricManager metricManager, List<Specification> metrics) {
+    private Builder(SolrMetricManager metricManager, List<Report> metrics) {
       this.metricManager = metricManager;
       this.metrics = metrics;
       this.rateUnit = TimeUnit.SECONDS;
@@ -245,16 +267,16 @@ public class SolrReporter extends ScheduledReporter {
     Pattern registryPattern;
     MetricFilter filter;
 
-    CompiledSpecification(Specification spec) throws PatternSyntaxException {
+    CompiledSpecification(Report spec) throws PatternSyntaxException {
       this.group = spec.groupPattern;
       this.label = spec.labelPattern;
       this.registryPattern = Pattern.compile(spec.registryPattern);
-      this.filter = new SolrMetricManager.RegexFilter(spec.metricPatterns);
+      this.filter = new SolrMetricManager.RegexFilter(spec.metricFilters);
     }
   }
 
   public SolrReporter(HttpClient httpClient, Supplier<String> urlProvider, SolrMetricManager metricManager,
-                      List<Specification> metrics, String handler,
+                      List<Report> metrics, String handler,
                       String reporterId, TimeUnit rateUnit, TimeUnit durationUnit,
                       SolrParams params, boolean skipHistograms, boolean skipAggregateValues, boolean cloudClient) {
     super(null, "solr-reporter", MetricFilter.ALL, rateUnit, durationUnit);
@@ -268,7 +290,7 @@ public class SolrReporter extends ScheduledReporter {
     this.clientCache = new SolrClientCache(httpClient);
     this.specs = new ArrayList<>();
     metrics.forEach(spec -> {
-      MetricFilter filter = new SolrMetricManager.RegexFilter(spec.metricPatterns);
+      MetricFilter filter = new SolrMetricManager.RegexFilter(spec.metricFilters);
       try {
         CompiledSpecification cs = new CompiledSpecification(spec);
         specs.add(cs);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/test-files/solr/solr-solrreporter.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/solr-solrreporter.xml b/solr/core/src/test-files/solr/solr-solrreporter.xml
index 1351e38..05420d4 100644
--- a/solr/core/src/test-files/solr/solr-solrreporter.xml
+++ b/solr/core/src/test-files/solr/solr-solrreporter.xml
@@ -39,10 +39,28 @@
 
   <metrics>
     <reporter name="test" group="replica">
-      <int name="period">111</int>
+      <int name="period">11</int>
+      <str name="filter">UPDATE\./update/.*requests</str>
+      <str name="filter">QUERY\./select.*requests</str>
     </reporter>
     <reporter name="test" group="overseer">
-      <int name="period">111</int>
+      <str name="handler">/admin/metrics/collector</str>
+      <int name="period">11</int>
+      <lst name="report">
+        <str name="group">overseer</str>
+        <str name="label">jvm</str>
+        <str name="registry">solr\.jvm</str>
+        <str name="filter">memory\.total\..*</str>
+        <str name="filter">memory\.heap\..*</str>
+        <str name="filter">os\.SystemLoadAverage</str>
+        <str name="filter">threads\.count</str>
+      </lst>
+      <lst name="report">
+        <str name="group">overseer</str>
+        <str name="label">leader.$1</str>
+        <str name="registry">solr\.core\.(.*)\.leader</str>
+        <str name="filter">UPDATE\./update/.*</str>
+      </lst>
     </reporter>
   </metrics>
 </solr>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f0ea3b79/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrCloudReportersTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrCloudReportersTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrCloudReportersTest.java
index 261d186..1539e16 100644
--- a/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrCloudReportersTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrCloudReportersTest.java
@@ -64,7 +64,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
       assertNotNull(reporter);
       assertTrue(reporter.toString(), reporter instanceof SolrOverseerReporter);
       SolrOverseerReporter sor = (SolrOverseerReporter)reporter;
-      assertEquals(111, sor.getPeriod());
+      assertEquals(11, sor.getPeriod());
       for (String registryName : metricManager.registryNames(".*\\.shard[0-9]\\.core.*")) {
         reporters = metricManager.getReporters(registryName);
         assertEquals(reporters.toString(), 1, reporters.size());
@@ -72,7 +72,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
         assertNotNull(reporter);
         assertTrue(reporter.toString(), reporter instanceof SolrReplicaReporter);
         SolrReplicaReporter srr = (SolrReplicaReporter)reporter;
-        assertEquals(111, srr.getPeriod());
+        assertEquals(11, srr.getPeriod());
       }
       for (String registryName : metricManager.registryNames(".*\\.leader")) {
         reporters = metricManager.getReporters(registryName);