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/16 13:34:01 UTC

lucene-solr:jira/solr-9858: SOLR-9858 More cleanup & tests.

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-9858 f0ea3b792 -> 4fea121b3


SOLR-9858 More cleanup & tests.


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

Branch: refs/heads/jira/solr-9858
Commit: 4fea121b33d6bcaf185ba707f49b48060ba72e59
Parents: f0ea3b7
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Thu Feb 16 14:33:45 2017 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Thu Feb 16 14:33:45 2017 +0100

----------------------------------------------------------------------
 .../handler/admin/MetricsCollectorHandler.java  | 12 ++--
 .../apache/solr/metrics/SolrMetricManager.java  |  4 +-
 .../reporters/solr/SolrOverseerReporter.java    | 71 +++++++++++++-------
 .../reporters/solr/SolrReplicaReporter.java     | 35 ++++++----
 .../metrics/reporters/solr/SolrReporter.java    | 61 +++++++++--------
 .../src/test-files/solr/solr-solrreporter.xml   |  4 +-
 .../reporters/solr/SolrCloudReportersTest.java  | 28 ++++++--
 .../reporters/solr/SolrReplicaReporterTest.java |  7 +-
 8 files changed, 139 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 fd47768..bf1e657 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
@@ -68,12 +68,12 @@ import org.slf4j.LoggerFactory;
  * </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>
+ *   &lt;doc&gt;
+ *     &lt;field name="_group_"&gt;solr.core.collection1.shard1.leader&lt;/field&gt;
+ *     &lt;field name="_reporter_"&gt;core_node3&lt;/field&gt;
+ *     &lt;field name="metric"&gt;INDEX.merge.errors&lt;/field&gt;
+ *     &lt;field name="value"&gt;0&lt;/field&gt;
+ *   &lt;/doc&gt;
  * </pre>
  */
 public class MetricsCollectorHandler extends RequestHandlerBase {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 af920b1..da1ee96 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
@@ -892,7 +892,7 @@ public class SolrMetricManager {
     attrs.put("group", "replica");
     Map<String, Object> initArgs = new HashMap<>();
     initArgs.put("groupId", leaderRegistryName);
-    initArgs.put("period", 30);
+    initArgs.put("period", 60);
     PluginInfo defaultPlugin = new PluginInfo("reporter", attrs, new NamedList(), null);
 
     // collect infos and normalize
@@ -917,7 +917,7 @@ public class SolrMetricManager {
     attrs.put("name", "overseerDefault");
     attrs.put("group", "overseer");
     Map<String, Object> initArgs = new HashMap<>();
-    initArgs.put("period", 30);
+    initArgs.put("period", 60);
     PluginInfo defaultPlugin = new PluginInfo("reporter", attrs, new NamedList(), null);
     List<PluginInfo> infos = prepareCloudPlugins(pluginInfos, "overseer", SolrOverseerReporter.class.getName(),
         attrs, initArgs, defaultPlugin);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 f1f22a9..f05d6c1 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
@@ -16,7 +16,6 @@ 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;
@@ -28,27 +27,47 @@ import org.slf4j.LoggerFactory;
 
 /**
  * This reporter sends selected metrics from local registries to {@link Overseer}.
+ * <p>The following configuration properties are supported:</p>
+ * <ul>
+ *   <li>handler - (optional str) handler path where reports are sent. Default is
+ *   {@link MetricsCollectorHandler#HANDLER_PATH}.</li>
+ *   <li>period - (optional int) how often reports are sent, in seconds. Default is 60. Setting this
+ *   to 0 disables the reporter.</li>
+ *   <li>report - (optional multiple lst) report configuration(s), see below.</li>
+ * </ul>
+ * Each report configuration consist of the following properties:
+ * <ul>
+ *   <li>registry - (required str) regex pattern matching source registries (see {@link SolrMetricManager#registryNames(String...)}),
+ *   may contain capture groups.</li>
+ *   <li>group - (required str) target registry name where metrics will be grouped. This can be a regex pattern that
+ *   contains back-references to capture groups collected by <code>registry</code> pattern</li>
+ *   <li>label - (optional str) optional prefix to prepend to metric names, may contain back-references to
+ *   capture groups collected by <code>registry</code> pattern</li>
+ *   <li>filter - (optional multiple str) regex expression(s) matching selected metrics to be reported.</li>
+ * </ul>
+ * NOTE: this reporter uses predefined "overseer" group, and it's always created even if explicit configuration
+ * is missing. Default configuration uses report specifications from {@link #DEFAULT_REPORTS}.
  * <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>
+ *       &lt;reporter name="test" group="overseer"&gt;
+ *         &lt;str name="handler"&gt;/admin/metrics/collector&lt;/str&gt;
+ *         &lt;int name="period"&gt;11&lt;/int&gt;
+ *         &lt;lst name="report"&gt;
+ *           &lt;str name="group"&gt;overseer&lt;/str&gt;
+ *           &lt;str name="label"&gt;jvm&lt;/str&gt;
+ *           &lt;str name="registry"&gt;solr\.jvm&lt;/str&gt;
+ *           &lt;str name="filter"&gt;memory\.total\..*&lt;/str&gt;
+ *           &lt;str name="filter"&gt;memory\.heap\..*&lt;/str&gt;
+ *           &lt;str name="filter"&gt;os\.SystemLoadAverage&lt;/str&gt;
+ *           &lt;str name="filter"&gt;threads\.count&lt;/str&gt;
+ *         &lt;/lst&gt;
+ *         &lt;lst name="report"&gt;
+ *           &lt;str name="group"&gt;overseer&lt;/str&gt;
+ *           &lt;str name="label"&gt;leader.$1&lt;/str&gt;
+ *           &lt;str name="registry"&gt;solr\.core\.(.*)\.leader&lt;/str&gt;
+ *           &lt;str name="filter"&gt;UPDATE\./update/.*&lt;/str&gt;
+ *         &lt;/lst&gt;
+ *       &lt;/reporter&gt;
  * </pre>
  *
  */
@@ -94,7 +113,7 @@ public class SolrOverseerReporter extends SolrMetricReporter {
    * Create a reporter for metrics managed in a named registry.
    *
    * @param metricManager metric manager
-   * @param registryName  unlike in other reporters, this is the node id
+   * @param registryName  this is ignored
    */
   public SolrOverseerReporter(SolrMetricManager metricManager, String registryName) {
     super(metricManager, registryName);
@@ -147,6 +166,9 @@ public class SolrOverseerReporter extends SolrMetricReporter {
   }
 
   public void setCoreContainer(CoreContainer cc) {
+    if (reporter != null) {
+      reporter.close();;
+    }
     // start reporter only in cloud mode
     if (!cc.isZooKeeperAware()) {
       return;
@@ -157,7 +179,7 @@ public class SolrOverseerReporter extends SolrMetricReporter {
     HttpClient httpClient = cc.getUpdateShardHandler().getHttpClient();
     ZkController zk = cc.getZkController();
     String reporterId = zk.getNodeName();
-    reporter = SolrReporter.Builder.forRegistries(metricManager, reports)
+    reporter = SolrReporter.Builder.forReports(metricManager, reports)
         .convertRatesTo(TimeUnit.SECONDS)
         .convertDurationsTo(TimeUnit.MILLISECONDS)
         .withHandler(handler)
@@ -172,7 +194,8 @@ public class SolrOverseerReporter extends SolrMetricReporter {
   }
 
   // TODO: fix this when there is an elegant way to retrieve URL of a node that runs Overseer leader.
-  private static class OverseerUrlSupplier implements Supplier<String> {
+  // package visibility for unit tests
+  static class OverseerUrlSupplier implements Supplier<String> {
     private static final long DEFAULT_INTERVAL = 30000; // 30s
     private ZkController zk;
     private String lastKnownUrl = null;
@@ -188,7 +211,7 @@ public class SolrOverseerReporter extends SolrMetricReporter {
       if (zk == null) {
         return null;
       }
-      // primitive caching for interval
+      // primitive caching for lastKnownUrl
       long now = System.currentTimeMillis();
       if (lastKnownUrl != null && (now - lastCheckTime) < interval) {
         return lastKnownUrl;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 a303ffc..4496e8c 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
@@ -19,7 +19,6 @@ 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;
@@ -38,13 +37,23 @@ import org.slf4j.LoggerFactory;
 
 /**
  * This class reports selected metrics from replicas to shard leader.
+ * <p>The following configuration properties are supported:</p>
+ * <ul>
+ *   <li>handler - (optional str) handler path where reports are sent. Default is
+ *   {@link MetricsCollectorHandler#HANDLER_PATH}.</li>
+ *   <li>period - (optional int) how often reports are sent, in seconds. Default is 60. Setting this
+ *   to 0 disables the reporter.</li>
+ *   <li>filter - (optional multiple str) regex expression(s) matching selected metrics to be reported.</li>
+ * </ul>
+ * NOTE: this reporter uses predefined "replica" group, and it's always created even if explicit configuration
+ * is missing. Default configuration uses filters defined in {@link #DEFAULT_FILTERS}.
  * <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>
+ *    &lt;reporter name="test" group="replica"&gt;
+ *      &lt;int name="period"&gt;11&lt;/int&gt;
+ *      &lt;str name="filter"&gt;UPDATE\./update/.*requests&lt;/str&gt;
+ *      &lt;str name="filter"&gt;QUERY\./select.*requests&lt;/str&gt;
+ *    &lt;/reporter&gt;
  * </pre>
  */
 public class SolrReplicaReporter extends SolrMetricReporter {
@@ -69,7 +78,7 @@ public class SolrReplicaReporter extends SolrMetricReporter {
   /**
    * Create a reporter for metrics managed in a named registry.
    *
-   * @param metricManager
+   * @param metricManager metric manager
    * @param registryName  registry to use, one of registries managed by
    *                      {@link SolrMetricManager}
    */
@@ -89,11 +98,6 @@ public class SolrReplicaReporter extends SolrMetricReporter {
     this.period = period;
   }
 
-  // for unit tests
-  int getPeriod() {
-    return period;
-  }
-
   public void setFilter(List<String> filterConfig) {
     if (filterConfig == null || filterConfig.isEmpty()) {
       return;
@@ -101,6 +105,11 @@ public class SolrReplicaReporter extends SolrMetricReporter {
     filters = filterConfig;
   }
 
+  // for unit tests
+  int getPeriod() {
+    return period;
+  }
+
   @Override
   protected void validate() throws IllegalStateException {
     if (period < 1) {
@@ -134,7 +143,7 @@ public class SolrReplicaReporter extends SolrMetricReporter {
     // our id is coreNodeName
     String id = core.getCoreDescriptor().getCloudDescriptor().getCoreNodeName();
     SolrReporter.Report spec = new SolrReporter.Report(groupId, null, registryName, filters);
-    reporter = SolrReporter.Builder.forRegistries(metricManager, Collections.singletonList(spec))
+    reporter = SolrReporter.Builder.forReports(metricManager, Collections.singletonList(spec))
         .convertRatesTo(TimeUnit.SECONDS)
         .convertDurationsTo(TimeUnit.MILLISECONDS)
         .withHandler(handler)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 3e8597d..d3e8759 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
@@ -117,7 +117,7 @@ public class SolrReporter extends ScheduledReporter {
 
   public static class Builder {
     private final SolrMetricManager metricManager;
-    private final List<Report> metrics;
+    private final List<Report> reports;
     private String reporterId;
     private TimeUnit rateUnit;
     private TimeUnit durationUnit;
@@ -130,17 +130,16 @@ public class SolrReporter extends ScheduledReporter {
     /**
      * Create a builder for SolrReporter.
      * @param metricManager metric manager that is the source of metrics
-     * @param metrics patterns to select registries, see {@link SolrMetricManager#registryNames(String...)},
-     *                and the corresponding metrics prefixes, see {@link org.apache.solr.metrics.SolrMetricManager.PrefixFilter}.
+     * @param reports report definitions
      * @return builder
      */
-    public static Builder forRegistries(SolrMetricManager metricManager, List<Report> metrics) {
-      return new Builder(metricManager, metrics);
+    public static Builder forReports(SolrMetricManager metricManager, List<Report> reports) {
+      return new Builder(metricManager, reports);
     }
 
-    private Builder(SolrMetricManager metricManager, List<Report> metrics) {
+    private Builder(SolrMetricManager metricManager, List<Report> reports) {
       this.metricManager = metricManager;
-      this.metrics = metrics;
+      this.reports = reports;
       this.rateUnit = TimeUnit.SECONDS;
       this.durationUnit = TimeUnit.MILLISECONDS;
       this.skipHistograms = false;
@@ -172,7 +171,7 @@ public class SolrReporter extends ScheduledReporter {
     /**
      * Histograms are difficult / impossible to aggregate, so it may not be
      * worth to report them.
-     * @param skipHistograms
+     * @param skipHistograms when true then skip histograms from reports
      * @return {@code this}
      */
     public Builder skipHistograms(boolean skipHistograms) {
@@ -182,7 +181,7 @@ public class SolrReporter extends ScheduledReporter {
 
     /**
      * Individual values from {@link org.apache.solr.metrics.AggregateMetric} may not be worth to report.
-     * @param skipAggregateValues
+     * @param skipAggregateValues when tru then skip reporting individual values from the metric
      * @return {@code this}
      */
     public Builder skipAggregateValues(boolean skipAggregateValues) {
@@ -204,7 +203,7 @@ public class SolrReporter extends ScheduledReporter {
     /**
      * Use this id to identify metrics from this instance.
      *
-     * @param reporterId
+     * @param reporterId reporter id
      * @return {@code this}
      */
     public Builder withReporterId(String reporterId) {
@@ -243,7 +242,7 @@ public class SolrReporter extends ScheduledReporter {
      * @return configured instance of reporter
      */
     public SolrReporter build(HttpClient client, Supplier<String> urlProvider) {
-      return new SolrReporter(client, urlProvider, metricManager, metrics, handler, reporterId, rateUnit, durationUnit,
+      return new SolrReporter(client, urlProvider, metricManager, reports, handler, reporterId, rateUnit, durationUnit,
           params, skipHistograms, skipAggregateValues, cloudClient);
     }
 
@@ -253,7 +252,7 @@ public class SolrReporter extends ScheduledReporter {
   private String handler;
   private Supplier<String> urlProvider;
   private SolrClientCache clientCache;
-  private List<CompiledSpecification> specs;
+  private List<CompiledReport> compiledReports;
   private SolrMetricManager metricManager;
   private boolean skipHistograms;
   private boolean skipAggregateValues;
@@ -261,17 +260,17 @@ public class SolrReporter extends ScheduledReporter {
   private ModifiableSolrParams params;
   private Map<String, Object> metadata;
 
-  private static final class CompiledSpecification {
+  private static final class CompiledReport {
     String group;
     String label;
     Pattern registryPattern;
     MetricFilter filter;
 
-    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.metricFilters);
+    CompiledReport(Report report) throws PatternSyntaxException {
+      this.group = report.groupPattern;
+      this.label = report.labelPattern;
+      this.registryPattern = Pattern.compile(report.registryPattern);
+      this.filter = new SolrMetricManager.RegexFilter(report.metricFilters);
     }
   }
 
@@ -288,14 +287,14 @@ public class SolrReporter extends ScheduledReporter {
     }
     this.handler = handler;
     this.clientCache = new SolrClientCache(httpClient);
-    this.specs = new ArrayList<>();
-    metrics.forEach(spec -> {
-      MetricFilter filter = new SolrMetricManager.RegexFilter(spec.metricFilters);
+    this.compiledReports = new ArrayList<>();
+    metrics.forEach(report -> {
+      MetricFilter filter = new SolrMetricManager.RegexFilter(report.metricFilters);
       try {
-        CompiledSpecification cs = new CompiledSpecification(spec);
-        specs.add(cs);
+        CompiledReport cs = new CompiledReport(report);
+        compiledReports.add(cs);
       } catch (PatternSyntaxException e) {
-        log.warn("Skipping spec with invalid registryPattern: " + spec.registryPattern, e);
+        log.warn("Skipping report with invalid registryPattern: " + report.registryPattern, e);
       }
     });
     this.skipHistograms = skipHistograms;
@@ -333,24 +332,24 @@ public class SolrReporter extends ScheduledReporter {
     }
     UpdateRequest req = new UpdateRequest(handler);
     req.setParams(params);
-    specs.forEach(spec -> {
-      Set<String> registryNames = metricManager.registryNames(spec.registryPattern);
+    compiledReports.forEach(report -> {
+      Set<String> registryNames = metricManager.registryNames(report.registryPattern);
       registryNames.forEach(registryName -> {
-        String label = spec.label;
+        String label = report.label;
         if (label != null && label.indexOf('$') != -1) {
           // label with back-references
-          Matcher m = spec.registryPattern.matcher(registryName);
+          Matcher m = report.registryPattern.matcher(registryName);
           label = m.replaceFirst(label);
         }
         final String effectiveLabel = label;
-        String group = spec.group;
+        String group = report.group;
         if (group.indexOf('$') != -1) {
           // group with back-references
-          Matcher m = spec.registryPattern.matcher(registryName);
+          Matcher m = report.registryPattern.matcher(registryName);
           group = m.replaceFirst(group);
         }
         final String effectiveGroup = group;
-        MetricUtils.toSolrInputDocuments(metricManager.registry(registryName), Collections.singletonList(spec.filter), MetricFilter.ALL,
+        MetricUtils.toSolrInputDocuments(metricManager.registry(registryName), Collections.singletonList(report.filter), MetricFilter.ALL,
             skipHistograms, skipAggregateValues, metadata, doc -> {
               doc.setField(REGISTRY_ID, registryName);
               doc.setField(GROUP_ID, effectiveGroup);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 05420d4..d341d45 100644
--- a/solr/core/src/test-files/solr/solr-solrreporter.xml
+++ b/solr/core/src/test-files/solr/solr-solrreporter.xml
@@ -39,13 +39,13 @@
 
   <metrics>
     <reporter name="test" group="replica">
-      <int name="period">11</int>
+      <int name="period">5</int>
       <str name="filter">UPDATE\./update/.*requests</str>
       <str name="filter">QUERY\./select.*requests</str>
     </reporter>
     <reporter name="test" group="overseer">
       <str name="handler">/admin/metrics/collector</str>
-      <int name="period">11</int>
+      <int name="period">5</int>
       <lst name="report">
         <str name="group">overseer</str>
         <str name="label">jvm</str>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/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 1539e16..f7431df 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
@@ -19,10 +19,12 @@ package org.apache.solr.metrics.reporters.solr;
 import java.nio.file.Paths;
 import java.util.Map;
 
+import com.codahale.metrics.Metric;
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.core.CoreContainer;
+import org.apache.solr.metrics.AggregateMetric;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.apache.solr.metrics.SolrMetricReporter;
 import org.junit.Before;
@@ -55,6 +57,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
         .setMaxShardsPerNode(4)
         .process(cluster.getSolrClient());
     waitForState("Expected test_collection with 2 shards and 2 replicas", "test_collection", clusterShape(2, 2));
+    Thread.sleep(10000);
     cluster.getJettySolrRunners().forEach(jetty -> {
       CoreContainer cc = jetty.getCoreContainer();
       SolrMetricManager metricManager = cc.getMetricManager();
@@ -64,7 +67,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
       assertNotNull(reporter);
       assertTrue(reporter.toString(), reporter instanceof SolrOverseerReporter);
       SolrOverseerReporter sor = (SolrOverseerReporter)reporter;
-      assertEquals(11, sor.getPeriod());
+      assertEquals(5, sor.getPeriod());
       for (String registryName : metricManager.registryNames(".*\\.shard[0-9]\\.core.*")) {
         reporters = metricManager.getReporters(registryName);
         assertEquals(reporters.toString(), 1, reporters.size());
@@ -72,12 +75,29 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
         assertNotNull(reporter);
         assertTrue(reporter.toString(), reporter instanceof SolrReplicaReporter);
         SolrReplicaReporter srr = (SolrReplicaReporter)reporter;
-        assertEquals(11, srr.getPeriod());
+        assertEquals(5, srr.getPeriod());
       }
       for (String registryName : metricManager.registryNames(".*\\.leader")) {
         reporters = metricManager.getReporters(registryName);
         // no reporters registered for leader registry
         assertEquals(reporters.toString(), 0, reporters.size());
+        // verify specific metrics
+        Map<String, Metric> metrics = metricManager.registry(registryName).getMetrics();
+        String key = "QUERY./select.requests.count";
+        assertTrue(key, metrics.containsKey(key));
+        assertTrue(key, metrics.get(key) instanceof AggregateMetric);
+        key = "UPDATE./update/json.requests.count";
+        assertTrue(key, metrics.containsKey(key));
+        assertTrue(key, metrics.get(key) instanceof AggregateMetric);
+      }
+      if (metricManager.registryNames().contains("solr.overseer")) {
+        Map<String,Metric> metrics = metricManager.registry("solr.overseer").getMetrics();
+        String key = "jvm.memory.heap.init.value";
+        assertTrue(key, metrics.containsKey(key));
+        assertTrue(key, metrics.get(key) instanceof AggregateMetric);
+        key = "leader.test_collection.shard1.UPDATE./update/json.requests.count.max";
+        assertTrue(key, metrics.containsKey(key));
+        assertTrue(key, metrics.get(key) instanceof AggregateMetric);
       }
     });
   }
@@ -102,7 +122,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
       assertNotNull(reporter);
       assertTrue(reporter.toString(), reporter instanceof SolrOverseerReporter);
       SolrOverseerReporter sor = (SolrOverseerReporter)reporter;
-      assertEquals(30, sor.getPeriod());
+      assertEquals(60, sor.getPeriod());
       for (String registryName : metricManager.registryNames(".*\\.shard[0-9]\\.core.*")) {
         reporters = metricManager.getReporters(registryName);
         assertEquals(reporters.toString(), 1, reporters.size());
@@ -110,7 +130,7 @@ public class SolrCloudReportersTest extends SolrCloudTestCase {
         assertNotNull(reporter);
         assertTrue(reporter.toString(), reporter instanceof SolrReplicaReporter);
         SolrReplicaReporter srr = (SolrReplicaReporter)reporter;
-        assertEquals(30, srr.getPeriod());
+        assertEquals(60, srr.getPeriod());
       }
       for (String registryName : metricManager.registryNames(".*\\.leader")) {
         reporters = metricManager.getReporters(registryName);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4fea121b/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrReplicaReporterTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrReplicaReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrReplicaReporterTest.java
index 6b25a32..d18d0e3 100644
--- a/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrReplicaReporterTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/reporters/solr/SolrReplicaReporterTest.java
@@ -29,6 +29,11 @@ public class SolrReplicaReporterTest extends AbstractFullDistribZkTestBase {
     schemaString = "schema15.xml";      // we need a string id
   }
 
+  @Override
+  public String getSolrXml() {
+    return "solr-solrreporter.xml";
+  }
+
   @Test
   public void test() throws Exception {
     waitForRecoveriesToFinish("control_collection",
@@ -37,7 +42,7 @@ public class SolrReplicaReporterTest extends AbstractFullDistribZkTestBase {
         jettys.get(0).getCoreContainer().getZkController().getZkStateReader(), false);
     printLayout();
     // wait for at least two reports
-    Thread.sleep(30000);
+    Thread.sleep(10000);
     ClusterState state = jettys.get(0).getCoreContainer().getZkController().getClusterState();
     for (JettySolrRunner jetty : jettys) {
       CoreContainer cc = jetty.getCoreContainer();