diff --git a/solr/core/src/java/org/apache/solr/handler/component/SlowNodeDetector.java b/solr/core/src/java/org/apache/solr/handler/component/SlowNodeDetector.java index f951812a87f3..b3bdaca64c7b 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/SlowNodeDetector.java +++ b/solr/core/src/java/org/apache/solr/handler/component/SlowNodeDetector.java @@ -13,8 +13,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import org.apache.solr.core.SolrInfoBean; -import org.apache.solr.metrics.SolrMetricManager; import org.apache.solr.metrics.SolrMetricProducer; import org.apache.solr.metrics.SolrMetricsContext; import org.slf4j.Logger; @@ -33,6 +31,7 @@ class SlowNodeDetector implements SolrMetricProducer { private final int maxSlowResponsePercentage; private final int minShardCountPerRequest; private final int slowLatencyThreshold; + private SolrMetricsContext metricsContext; /** * @param latencyDropRatioThreshold identify as a latency drop point when current latency is < 0.5 @@ -213,29 +212,15 @@ public String toString() { @Override public void initializeMetrics(SolrMetricsContext parentContext, String scope) { - String nodeRegistry = SolrMetricManager.getRegistryName(SolrInfoBean.Group.node); - SolrMetricManager manager = parentContext.getMetricManager(); - manager.registerGauge( - parentContext, - nodeRegistry, - slowNodes::keySet, - parentContext.getTag(), - SolrMetricManager.ResolutionStrategy.REPLACE, - "slowNodes", - scope); - manager.registerGauge( - parentContext, - nodeRegistry, - slowNodes::size, - parentContext.getTag(), - SolrMetricManager.ResolutionStrategy.REPLACE, - "slowNodeCount", - scope); + metricsContext = parentContext.getChildContext(this); + + metricsContext.gauge(slowNodes::keySet, true, "slowNodes", scope); + metricsContext.gauge(slowNodes::size, true, "slowNodeCount", scope); } @Override public SolrMetricsContext getSolrMetricsContext() { // using the same context as parent - return null; + return metricsContext; } static class Builder { diff --git a/solr/core/src/java/org/apache/solr/handler/component/TimeLimitingHttpShardHandlerFactory.java b/solr/core/src/java/org/apache/solr/handler/component/TimeLimitingHttpShardHandlerFactory.java index 67042cb6b4c8..d3619fac710a 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/TimeLimitingHttpShardHandlerFactory.java +++ b/solr/core/src/java/org/apache/solr/handler/component/TimeLimitingHttpShardHandlerFactory.java @@ -17,6 +17,7 @@ package org.apache.solr.handler.component; import com.codahale.metrics.Counter; +import java.io.IOException; import java.lang.invoke.MethodHandles; import java.util.concurrent.ExecutorService; import org.apache.solr.common.util.ExecutorUtil; @@ -45,7 +46,6 @@ public class TimeLimitingHttpShardHandlerFactory extends HttpShardHandlerFactory private static final String DRY_RUN_CONFIG_KEY = "dryRun"; private SlowNodeDetector slowNodeDetector; - private SolrMetricsContext solrMetricsContext; Counter cancelledSlowNodeRequests; Counter cancelledDryRunSlowNodeRequests; private ExecutorService executorService; @@ -153,26 +153,28 @@ public void init(PluginInfo info) { @Override public void initializeMetrics(SolrMetricsContext parentContext, String scope) { super.initializeMetrics(parentContext, scope); - solrMetricsContext = parentContext.getChildContext(this); String expandedScope = SolrMetricManager.mkName(scope, SolrInfoBean.Category.QUERY.name()); cancelledSlowNodeRequests = - solrMetricsContext.counter("cancelledSlowNodeRequests", expandedScope); + getSolrMetricsContext().counter("cancelledSlowNodeRequests", expandedScope); cancelledDryRunSlowNodeRequests = - solrMetricsContext.counter("cancelledDryRunSlowNodeRequests", expandedScope); + getSolrMetricsContext().counter("cancelledDryRunSlowNodeRequests", expandedScope); if (slowNodeDetector != null) { - slowNodeDetector.initializeMetrics(solrMetricsContext, expandedScope); + slowNodeDetector.initializeMetrics(getSolrMetricsContext(), expandedScope); } } - @Override - public SolrMetricsContext getSolrMetricsContext() { - return solrMetricsContext; - } - @Override public void close() { super.close(); + if (slowNodeDetector != null) { + try { + slowNodeDetector.close(); + } catch (IOException e) { + log.warn("Failed to close the slowNodeDetector", e); + } + } + if (executorService != null) { ExecutorUtil.shutdownNowAndAwaitTermination(executorService); }