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/04/06 19:33:11 UTC

lucene-solr:jira/solr-9959: SOLR-9959 Add "rootName" property to SolrJmxReporter, and use it to fix the problem in MiniSolrCloudCluster where multiple CoreContainer-s would produce the same MBean names.

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-9959 d503fc8c1 -> 75dcf4f4e


SOLR-9959 Add "rootName" property to SolrJmxReporter, and use it to
fix the problem in MiniSolrCloudCluster where multiple CoreContainer-s
would produce the same MBean names.


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

Branch: refs/heads/jira/solr-9959
Commit: 75dcf4f4e6f8e59fc9665940990c24ea060e4e80
Parents: d503fc8
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Thu Apr 6 21:31:12 2017 +0200
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Thu Apr 6 21:31:12 2017 +0200

----------------------------------------------------------------------
 .../src/java/org/apache/solr/core/SolrCore.java |  5 +--
 .../solr/metrics/reporters/SolrJmxReporter.java | 33 +++++++++++++-------
 .../client/solrj/impl/CloudSolrClientTest.java  |  3 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java |  5 +++
 4 files changed, 31 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/75dcf4f4/solr/core/src/java/org/apache/solr/core/SolrCore.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 4ed7006..419cafc 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -912,8 +912,9 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
     initializeMetrics(metricManager, coreMetricManager.getRegistryName(), null);
 
     SolrFieldCacheBean solrFieldCacheBean = new SolrFieldCacheBean();
-    // XXX this should be registered at the CONTAINER level because it's not core-specific!
-    solrFieldCacheBean.initializeMetrics(metricManager, coreMetricManager.getRegistryName(), null);
+    // this is registered at the CONTAINER level because it's not core-specific - for now we
+    // also register it here for back-compat
+    solrFieldCacheBean.initializeMetrics(metricManager, coreMetricManager.getRegistryName(), getCategory().toString());
     infoRegistry.put("fieldCache", solrFieldCacheBean);
 
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/75dcf4f4/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
index 918f38d..6f13754 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
@@ -53,6 +53,7 @@ public class SolrJmxReporter extends SolrMetricReporter {
   private String domain;
   private String agentId;
   private String serviceUrl;
+  private String rootName;
 
   private JmxReporter reporter;
   private MetricRegistry registry;
@@ -83,7 +84,7 @@ public class SolrJmxReporter extends SolrMetricReporter {
       log.info("JMX monitoring disabled for registry " + registryName);
       return;
     }
-    log.info("Initializing for registry " + registryName);
+    log.debug("Initializing for registry " + registryName);
     if (serviceUrl != null && agentId != null) {
       mBeanServer = JmxUtil.findFirstMBeanServer();
       log.warn("No more than one of serviceUrl(%s) and agentId(%s) should be configured, using first MBeanServer instead of configuration.",
@@ -107,14 +108,18 @@ public class SolrJmxReporter extends SolrMetricReporter {
       return;
     }
 
-    JmxObjectNameFactory jmxObjectNameFactory = new JmxObjectNameFactory(pluginInfo.name, domain);
+    String fullDomain = domain;
+    if (rootName != null && !rootName.isEmpty()) {
+      fullDomain = rootName + "." + domain;
+    }
+    JmxObjectNameFactory jmxObjectNameFactory = new JmxObjectNameFactory(pluginInfo.name, fullDomain);
     registry = metricManager.registry(registryName);
     // filter out MetricsMap gauges - we have a better way of handling them
     MetricFilter filter = (name, metric) -> !(metric instanceof MetricsMap);
 
     reporter = JmxReporter.forRegistry(registry)
                           .registerWith(mBeanServer)
-                          .inDomain(domain)
+                          .inDomain(fullDomain)
                           .filter(filter)
                           .createsObjectNamesWith(jmxObjectNameFactory)
                           .build();
@@ -123,7 +128,7 @@ public class SolrJmxReporter extends SolrMetricReporter {
     listener = new MetricsMapListener(mBeanServer, jmxObjectNameFactory);
     registry.addListener(listener);
 
-    log.info("JMX monitoring for registry '" + registryName + "' enabled at server: " + mBeanServer);
+    log.info("JMX monitoring for '" + fullDomain + "' (registry '" + registryName + "') enabled at server: " + mBeanServer);
   }
 
   /**
@@ -153,9 +158,19 @@ public class SolrJmxReporter extends SolrMetricReporter {
     // Nothing to validate
   }
 
+
+  /**
+   * Set root name of the JMX hierarchy for this reporter. Default (null or empty) is none, ie.
+   * the hierarchy will start from the domain name.
+   * @param rootName root name of the JMX name hierarchy, or null or empty for default.
+   */
+  public void setRootName(String rootName) {
+    this.rootName = rootName;
+  }
+
   /**
    * Sets the domain with which MBeans are published. If none is set,
-   * the domain defaults to the name of the core.
+   * the domain defaults to the name of the registry.
    *
    * @param domain the domain
    */
@@ -239,8 +254,8 @@ public class SolrJmxReporter extends SolrMetricReporter {
 
   @Override
   public String toString() {
-    return String.format(Locale.ENGLISH, "[%s@%s: domain = %s, service url = %s, agent id = %s]",
-        getClass().getName(), Integer.toHexString(hashCode()), domain, serviceUrl, agentId);
+    return String.format(Locale.ENGLISH, "[%s@%s: rootName = %, domain = %s, service url = %s, agent id = %s]",
+        getClass().getName(), Integer.toHexString(hashCode()), rootName, domain, serviceUrl, agentId);
   }
 
   private static class MetricsMapListener extends MetricRegistryListener.Base {
@@ -266,10 +281,6 @@ public class SolrJmxReporter extends SolrMetricReporter {
       }
       try {
         ObjectName objectName = nameFactory.createName("gauges", nameFactory.getDomain(), name);
-        if (server.isRegistered(objectName)) {
-          // silently unregister - may have been left over from a previous reporter
-          server.unregisterMBean(objectName);
-        }
         // some MBean servers re-write object name to include additional properties
         ObjectInstance instance = server.registerMBean(gauge, objectName);
         if (instance != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/75dcf4f4/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
index 4ec1a67..5ebb650 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
@@ -448,8 +448,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
       return null;
     }
     if (scope != null) { // admin handler uses a meter instead of counter here
-      map = (Map<String,Object>)map.get(name);
-      return (Long)map.get("count");
+      return (Long)map.get(name + ".count");
     } else {
       return (Long) map.get(name);
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/75dcf4f4/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
index 15895d3..0605281 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
@@ -87,6 +87,11 @@ public class MiniSolrCloudCluster {
       "    <int name=\"distribUpdateConnTimeout\">${distribUpdateConnTimeout:45000}</int>\n" +
       "    <int name=\"distribUpdateSoTimeout\">${distribUpdateSoTimeout:340000}</int>\n" +
       "  </solrcloud>\n" +
+      "  <metrics>\n" +
+      "    <reporter name=\"default\" class=\"org.apache.solr.metrics.reporters.SolrJmxReporter\">\n" +
+      "      <str name=\"rootName\">solr_${hostPort:8983}</str>\n" +
+      "    </reporter>\n" +
+      "  </metrics>\n" +
       "  \n" +
       "</solr>\n";