This is an automated email from the ASF dual-hosted git repository. dsmiley pushed a commit to branch branch_10_0 in repository https://gitbox.apache.org/repos/asf/solr.git
commit 703e5e77c5785cf10a452634563c90f470e6f70b Author: David Smiley <[email protected]> AuthorDate: Fri Nov 7 17:30:12 2025 -0500 SOLR-17458: OTEL metrics: some renames (#3826) Units: index & disk size metric units changes from bytes (long) to megabytes (double). Affects: solr_disk_space, solr_core_disk_space, solr_core_index_size, solr_core_replication_index_size, solr_core_indexsearcher_index_commit_size Renames: * solr_executor to solr_core_executor or solr_node_executor * solr_replication to solr_core_replication * solr_field_cache to solr_core_field_cache * solr_searcher to solr_core_indexsearcher * solr_indexwriter to solr_core_indexwriter * solr_searcher_timer to solr_core_indexsearcher_open_time and solr_core_indexsearcher_open_warmup_time * attribute executor_name to name When aggregating core metrics to the node level: * don't strip off these attributes: internal, replica_type * keep solr_core prefix, even when aggregated to node, since they relate to cores Moved instrumentedExecutorService() to SolrMetricsContext (cherry picked from commit 4d8057abbe4da68d19de6a847eba204f13b9734a) --- .../solr/cluster/placement/impl/MetricImpl.java | 16 +++---- .../cluster/placement/impl/NodeMetricImpl.java | 4 +- .../cluster/placement/impl/ReplicaMetricImpl.java | 2 +- .../java/org/apache/solr/core/CoreContainer.java | 16 +++---- .../src/java/org/apache/solr/core/SolrCore.java | 51 ++++++++++++---------- .../apache/solr/handler/ReplicationHandler.java | 35 +++++++++------ .../solr/handler/admin/CoreAdminHandler.java | 17 ++++---- .../handler/component/HttpShardHandlerFactory.java | 5 +-- .../apache/solr/metrics/SolrMetricsContext.java | 13 ++++++ .../instruments/AttributedInstrumentFactory.java | 23 +++++----- .../org/apache/solr/search/SolrFieldCacheBean.java | 4 +- .../org/apache/solr/search/SolrIndexSearcher.java | 26 ++++++----- .../org/apache/solr/search/stats/StatsCache.java | 2 +- .../org/apache/solr/update/SolrIndexWriter.java | 11 ++--- .../org/apache/solr/update/UpdateShardHandler.java | 9 ++-- .../org/apache/solr/util/stats/MetricUtils.java | 36 ++++----------- .../stats/OtelInstrumentedExecutorService.java | 29 ++++++------ .../cloud/CloudExitableDirectoryReaderTest.java | 4 +- .../org/apache/solr/cloud/MigrateReplicasTest.java | 4 +- .../org/apache/solr/cloud/ReplaceNodeTest.java | 4 +- .../apache/solr/cloud/TestBaseStatsCacheCloud.java | 8 ++-- .../impl/CollectionMetricsBuilderTest.java | 25 +++++------ .../solr/handler/RequestHandlerMetricsTest.java | 10 +++-- .../solr/handler/admin/StatsReloadRaceTest.java | 2 +- .../solr/metrics/SolrMetricsIntegrationTest.java | 4 +- .../apache/solr/search/TestMainQueryCaching.java | 2 +- .../apache/solr/search/TestSolrFieldCacheBean.java | 4 +- .../apache/solr/update/SolrIndexMetricsTest.java | 16 +++---- .../stats/OtelInstrumentedExecutorServiceTest.java | 26 ++++++----- .../solr/client/solrj/impl/NodeValueFetcher.java | 11 +++-- solr/solrj/gradle.lockfile | 7 +++ .../apache/solr/cluster/placement/Builders.java | 2 +- .../org/apache/solr/util/SolrMetricTestUtils.java | 9 +++- 33 files changed, 230 insertions(+), 207 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java index 7cc5d7eb347..b3c5782bd13 100644 --- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java +++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java @@ -23,8 +23,6 @@ import org.apache.solr.cluster.placement.Metric; /** Base class for {@link Metric} implementations. */ public abstract class MetricImpl<T> implements Metric<T> { - public static final double GB = 1024 * 1024 * 1024; - /** * Identity converter. It returns the raw value unchanged IFF the value's type can be cast to the * generic type of this attribute, otherwise it returns null. @@ -40,25 +38,25 @@ public abstract class MetricImpl<T> implements Metric<T> { }; /** - * Bytes to gigabytes converter. Supports converting number or string representations of raw - * values expressed in bytes. + * Megabytes to gigabytes converter. Supports converting number or string representations of raw + * values expressed in megabytes. */ - public static final Function<Object, Double> BYTES_TO_GB_CONVERTER = + public static final Function<Object, Double> MB_TO_GB_CONVERTER = v -> { - double sizeInBytes; + double sizeInMB; if (!(v instanceof Number)) { if (v == null) { return null; } try { - sizeInBytes = Double.parseDouble(String.valueOf(v)); + sizeInMB = Double.parseDouble(String.valueOf(v)); } catch (Exception nfe) { return null; } } else { - sizeInBytes = ((Number) v).doubleValue(); + sizeInMB = ((Number) v).doubleValue(); } - return sizeInBytes / GB; + return sizeInMB / 1024.0; }; protected final String name; diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java index 2e62ffab60c..75fac2406d0 100644 --- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java +++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java @@ -26,11 +26,11 @@ public class NodeMetricImpl<T> extends MetricImpl<T> implements NodeMetric<T> { /** Total disk space in GB. */ public static final NodeMetricImpl<Double> TOTAL_DISK_GB = - new NodeMetricImpl<>("totaldisk", BYTES_TO_GB_CONVERTER); + new NodeMetricImpl<>("totaldisk", MB_TO_GB_CONVERTER); /** Free (usable) disk space in GB. */ public static final NodeMetricImpl<Double> FREE_DISK_GB = - new NodeMetricImpl<>("freedisk", BYTES_TO_GB_CONVERTER); + new NodeMetricImpl<>("freedisk", MB_TO_GB_CONVERTER); /** Number of all cores. */ public static final NodeMetricImpl<Integer> NUM_CORES = diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java index a7b98e0daf8..2cb0b785809 100644 --- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java +++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java @@ -26,7 +26,7 @@ import org.apache.solr.cluster.placement.ReplicaMetric; public class ReplicaMetricImpl<T> extends MetricImpl<T> implements ReplicaMetric<T> { /** Replica index size in GB. */ public static final ReplicaMetricImpl<Double> INDEX_SIZE_GB = - new ReplicaMetricImpl<>("sizeGB", "solr_core_index_size_bytes", BYTES_TO_GB_CONVERTER); + new ReplicaMetricImpl<>("sizeGB", "solr_core_index_size_megabytes", MB_TO_GB_CONVERTER); public ReplicaMetricImpl(String name, String internalName) { super(name, internalName); 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 a5b6b1ce69c..f9c88031ab6 100644 --- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java +++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java @@ -913,17 +913,17 @@ public class CoreContainer { Path dataHome = cfg.getSolrDataHome() != null ? cfg.getSolrDataHome() : cfg.getCoreRootDirectory(); - solrMetricsContext.observableLongGauge( + solrMetricsContext.observableDoubleGauge( "solr_disk_space", "Disk metrics for Solr's data home directory (" + dataHome + ")", measurement -> { try { var fileStore = Files.getFileStore(dataHome); measurement.record( - fileStore.getTotalSpace(), + MetricUtils.bytesToMegabytes(fileStore.getTotalSpace()), containerAttrs.toBuilder().put(TYPE_ATTR, "total_space").build()); measurement.record( - fileStore.getUsableSpace(), + MetricUtils.bytesToMegabytes(fileStore.getUsableSpace()), containerAttrs.toBuilder().put(TYPE_ATTR, "usable_space").build()); } catch (IOException e) { throw new SolrException( @@ -932,7 +932,7 @@ public class CoreContainer { e); } }, - OtelUnit.BYTES); + OtelUnit.MEGABYTES); SolrFieldCacheBean fieldCacheBean = new SolrFieldCacheBean(); fieldCacheBean.initializeMetrics( @@ -940,13 +940,13 @@ public class CoreContainer { // setup executor to load cores in parallel coreLoadExecutor = - MetricUtils.instrumentedExecutorService( + solrMetricsContext.instrumentedExecutorService( ExecutorUtil.newMDCAwareFixedThreadPool( cfg.getCoreLoadThreadCount(isZooKeeperAware()), new SolrNamedThreadFactory("coreLoadExecutor")), - solrMetricsContext, - SolrInfoBean.Category.CONTAINER, - "coreLoadExecutor"); + "solr_node_executor", + "coreLoadExecutor", + SolrInfoBean.Category.CONTAINER); coreSorter = loader.newInstance( 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 5beca634fe3..5c719e26745 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrCore.java +++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java @@ -181,6 +181,7 @@ import org.apache.solr.util.circuitbreaker.CircuitBreakerRegistry; import org.apache.solr.util.plugin.NamedListInitializedPlugin; import org.apache.solr.util.plugin.PluginInfoInitialized; import org.apache.solr.util.plugin.SolrCoreAware; +import org.apache.solr.util.stats.MetricUtils; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.data.Stat; import org.eclipse.jetty.io.RuntimeIOException; @@ -489,7 +490,7 @@ public class SolrCore implements SolrInfoBean, Closeable { } /** - * Recalculates the index size. + * Calculates the index size. * * <p>Should only be called from {@code getIndexSize}. * @@ -515,6 +516,7 @@ public class SolrCore implements SolrInfoBean, Closeable { return size; } + /** The index size in bytes, of the index that the current searcher is pointed to. */ public long getIndexSize() { SolrRequestInfo requestInfo = SolrRequestInfo.getRequestInfo(); if (requestInfo != null) { @@ -1345,10 +1347,6 @@ public class SolrCore implements SolrInfoBean, Closeable { .put(CATEGORY_ATTR, Category.CORE.toString()) .build(); - var baseSearcherTimerMetric = - parentContext.longHistogram( - "solr_searcher_timer", "Timer for opening new searchers", OtelUnit.MILLISECONDS); - newSearcherCounter = new AttributedLongCounter( parentContext.longCounter( @@ -1370,13 +1368,19 @@ public class SolrCore implements SolrInfoBean, Closeable { newSearcherTimer = new AttributedLongTimer( - baseSearcherTimerMetric, - Attributes.builder().putAll(baseSearcherAttributes).put(TYPE_ATTR, "new").build()); + parentContext.longHistogram( + "solr_core_indexsearcher_open_time", + "Time to open new searchers", + OtelUnit.MILLISECONDS), + baseSearcherAttributes); newSearcherWarmupTimer = new AttributedLongTimer( - baseSearcherTimerMetric, - Attributes.builder().putAll(baseSearcherAttributes).put(TYPE_ATTR, "warmup").build()); + parentContext.longHistogram( + "solr_core_indexsearcher_open_warmup_time", + "Time to warmup new searchers", + OtelUnit.MILLISECONDS), + baseSearcherAttributes); observables.add( parentContext.observableLongGauge( @@ -1387,10 +1391,10 @@ public class SolrCore implements SolrInfoBean, Closeable { }))); observables.add( - parentContext.observableLongGauge( + parentContext.observableDoubleGauge( "solr_core_disk_space", "Solr core disk space metrics", - (observableLongMeasurement -> { + (observableDoubleMeasurement -> { // initialize disk total / free metrics Path dataDirPath = Path.of(dataDir); @@ -1405,29 +1409,32 @@ public class SolrCore implements SolrInfoBean, Closeable { .put(TYPE_ATTR, "usable_space") .build(); try { - observableLongMeasurement.record( - Files.getFileStore(dataDirPath).getTotalSpace(), totalSpaceAttributes); + observableDoubleMeasurement.record( + MetricUtils.bytesToMegabytes(Files.getFileStore(dataDirPath).getTotalSpace()), + totalSpaceAttributes); } catch (IOException e) { - observableLongMeasurement.record(0L, totalSpaceAttributes); + observableDoubleMeasurement.record(0.0, totalSpaceAttributes); } try { - observableLongMeasurement.record( - Files.getFileStore(dataDirPath).getUsableSpace(), usableSpaceAttributes); + observableDoubleMeasurement.record( + MetricUtils.bytesToMegabytes(Files.getFileStore(dataDirPath).getUsableSpace()), + usableSpaceAttributes); } catch (IOException e) { - observableLongMeasurement.record(0L, usableSpaceAttributes); + observableDoubleMeasurement.record(0.0, usableSpaceAttributes); } }), - OtelUnit.BYTES)); + OtelUnit.MEGABYTES)); observables.add( - parentContext.observableLongGauge( + parentContext.observableDoubleGauge( "solr_core_index_size", "Index size for a Solr core", - (observableLongMeasurement -> { + (observableDoubleMeasurement -> { if (!isClosed()) - observableLongMeasurement.record(getIndexSize(), baseGaugeCoreAttributes); + observableDoubleMeasurement.record( + MetricUtils.bytesToMegabytes(getIndexSize()), baseGaugeCoreAttributes); }), - OtelUnit.BYTES)); + OtelUnit.MEGABYTES)); parentContext.observableLongGauge( "solr_core_segments", diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java index a1781fddddd..888e371426a 100644 --- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java @@ -32,6 +32,7 @@ import static org.apache.solr.handler.admin.api.ReplicationAPIBase.TLOG_FILE; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.BatchCallback; +import io.opentelemetry.api.metrics.ObservableDoubleMeasurement; import io.opentelemetry.api.metrics.ObservableLongMeasurement; import java.io.FileNotFoundException; import java.io.IOException; @@ -114,6 +115,7 @@ import org.apache.solr.util.NumberUtils; import org.apache.solr.util.PropertiesInputStream; import org.apache.solr.util.RefCounted; import org.apache.solr.util.plugin.SolrCoreAware; +import org.apache.solr.util.stats.MetricUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; @@ -850,59 +852,64 @@ public class ReplicationHandler extends RequestHandlerBase .build(); super.initializeMetrics(parentContext, replicationAttributes); - ObservableLongMeasurement indexSizeMetric = - solrMetricsContext.longGaugeMeasurement( - "solr_replication_index_size", "Size of the index in bytes", OtelUnit.BYTES); + ObservableDoubleMeasurement indexSizeMetric = + solrMetricsContext.doubleGaugeMeasurement( + "solr_core_replication_index_size", + "Size of the index in megabytes", + OtelUnit.MEGABYTES); ObservableLongMeasurement indexVersionMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_index_version", "Current index version"); + "solr_core_replication_index_version", "Current index version"); ObservableLongMeasurement indexGenerationMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_index_generation", "Current index generation"); + "solr_core_replication_index_generation", "Current index generation"); ObservableLongMeasurement isLeaderMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_is_leader", "Whether this node is a leader (1) or not (0)"); + "solr_core_replication_is_leader", "Whether this node is a leader (1) or not (0)"); ObservableLongMeasurement isFollowerMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_is_follower", "Whether this node is a follower (1) or not (0)"); + "solr_core_replication_is_follower", "Whether this node is a follower (1) or not (0)"); ObservableLongMeasurement replicationEnabledMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_is_enabled", "Whether replication is enabled (1) or not (0)"); + "solr_core_replication_is_enabled", "Whether replication is enabled (1) or not (0)"); ObservableLongMeasurement isPollingDisabledMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_is_polling_disabled", "Whether polling is disabled (1) or not (0)"); + "solr_core_replication_is_polling_disabled", + "Whether polling is disabled (1) or not (0)"); ObservableLongMeasurement isReplicatingMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_is_replicating", "Whether replication is in progress (1) or not (0)"); + "solr_core_replication_is_replicating", + "Whether replication is in progress (1) or not (0)"); ObservableLongMeasurement timeElapsedMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_time_elapsed", + "solr_core_replication_time_elapsed", "Time elapsed during replication in seconds", OtelUnit.SECONDS); ObservableLongMeasurement bytesDownloadedMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_downloaded_size", + "solr_core_replication_downloaded_size", "Total bytes downloaded during replication", OtelUnit.BYTES); ObservableLongMeasurement downloadSpeedMetric = solrMetricsContext.longGaugeMeasurement( - "solr_replication_download_speed", "Download speed in bytes per second"); + "solr_core_replication_download_speed", "Download speed in bytes per second"); metricsCallback = solrMetricsContext.batchCallback( () -> { if (core != null && !core.isClosed()) { - indexSizeMetric.record(core.getIndexSize(), replicationAttributes); + indexSizeMetric.record( + MetricUtils.bytesToMegabytes(core.getIndexSize()), replicationAttributes); CommitVersionInfo vInfo = getIndexVersion(); if (vInfo != null) { diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java index cf31a418e80..c6d9474e0de 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java @@ -79,7 +79,6 @@ import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.AuthorizationContext; import org.apache.solr.security.PermissionNameProvider; -import org.apache.solr.util.stats.MetricUtils; import org.apache.solr.util.tracing.TraceUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,18 +130,18 @@ public class CoreAdminHandler extends RequestHandlerBase implements PermissionNa public void initializeMetrics(SolrMetricsContext parentContext, Attributes attributes) { super.initializeMetrics(parentContext, attributes); coreAdminAsyncTracker.standardExecutor = - MetricUtils.instrumentedExecutorService( + solrMetricsContext.instrumentedExecutorService( coreAdminAsyncTracker.standardExecutor, - solrMetricsContext, - getCategory(), - "parallelCoreAdminExecutor"); + "solr_node_executor", + "asyncCoreAdminExecutor", + getCategory()); coreAdminAsyncTracker.expensiveExecutor = - MetricUtils.instrumentedExecutorService( + solrMetricsContext.instrumentedExecutorService( coreAdminAsyncTracker.expensiveExecutor, - solrMetricsContext, - getCategory(), - "parallelCoreExpensiveAdminExecutor"); + "solr_node_executor", + "asyncCoreExpensiveAdminExecutor", + getCategory()); } @Override diff --git a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java index 07e57fe3cb7..0a78e179019 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java +++ b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandlerFactory.java @@ -61,7 +61,6 @@ import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.security.HttpClientBuilderPlugin; import org.apache.solr.update.UpdateShardHandlerConfig; import org.apache.solr.util.stats.InstrumentedHttpListenerFactory; -import org.apache.solr.util.stats.MetricUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -436,7 +435,7 @@ public class HttpShardHandlerFactory extends ShardHandlerFactory solrMetricsContext = parentContext.getChildContext(this); httpListenerFactory.initializeMetrics(solrMetricsContext, Attributes.empty()); commExecutor = - MetricUtils.instrumentedExecutorService( - commExecutor, solrMetricsContext, SolrInfoBean.Category.QUERY, "httpShardExecutor"); + solrMetricsContext.instrumentedExecutorService( + commExecutor, "solr_core_executor", "httpShardExecutor", SolrInfoBean.Category.QUERY); } } diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java index ddd069bdfeb..db338da6b37 100644 --- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java +++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricsContext.java @@ -35,9 +35,12 @@ import io.opentelemetry.api.metrics.ObservableLongMeasurement; import io.opentelemetry.api.metrics.ObservableMeasurement; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; import java.util.function.Consumer; import org.apache.solr.common.util.IOUtils; +import org.apache.solr.core.SolrInfoBean; import org.apache.solr.metrics.otel.OtelUnit; +import org.apache.solr.util.stats.OtelInstrumentedExecutorService; /** * This class represents a metrics context that ties together components with the same life-cycle @@ -253,6 +256,16 @@ public class SolrMetricsContext { return batchCallback; } + /** Returns an instrumented wrapper over the given executor service. */ + public ExecutorService instrumentedExecutorService( + ExecutorService delegate, + String metricNamePrefix, + String executorName, + SolrInfoBean.Category category) { + return new OtelInstrumentedExecutorService( + delegate, this, metricNamePrefix, executorName, category); + } + public void unregister() { IOUtils.closeQuietly(closeables); closeables.clear(); diff --git a/solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedInstrumentFactory.java b/solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedInstrumentFactory.java index 189672bcb0f..b4cd5cd514f 100644 --- a/solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedInstrumentFactory.java +++ b/solr/core/src/java/org/apache/solr/metrics/otel/instruments/AttributedInstrumentFactory.java @@ -16,10 +16,8 @@ */ package org.apache.solr.metrics.otel.instruments; -import static org.apache.solr.handler.component.SearchHandler.INTERNAL_ATTR; import static org.apache.solr.metrics.SolrCoreMetricManager.COLLECTION_ATTR; import static org.apache.solr.metrics.SolrCoreMetricManager.CORE_ATTR; -import static org.apache.solr.metrics.SolrCoreMetricManager.REPLICA_TYPE_ATTR; import static org.apache.solr.metrics.SolrCoreMetricManager.SHARD_ATTR; import io.opentelemetry.api.common.AttributeKey; @@ -36,16 +34,19 @@ import org.apache.solr.metrics.otel.OtelUnit; * Factory for creating metrics instruments that can write to either single or dual registries (core * and node). */ +// TODO consider making this a base abstraction with a simple impl and another "Dual" one. public class AttributedInstrumentFactory { + // These attributes are on a core but don't want to aggregate them. private static final Set<AttributeKey<?>> FILTER_ATTRS_SET = - Set.of(COLLECTION_ATTR, CORE_ATTR, SHARD_ATTR, REPLICA_TYPE_ATTR, INTERNAL_ATTR); + Set.of(COLLECTION_ATTR, CORE_ATTR, SHARD_ATTR); + private final SolrMetricsContext primaryMetricsContext; private final Attributes primaryAttributes; private final boolean aggregateToNodeRegistry; private final boolean primaryIsNodeRegistry; - private SolrMetricsContext nodeMetricsContext = null; - private Attributes nodeAttributes = null; + private final SolrMetricsContext nodeMetricsContext; + private final Attributes nodeAttributes; public AttributedInstrumentFactory( SolrMetricsContext primaryMetricsContext, @@ -66,6 +67,9 @@ public class AttributedInstrumentFactory { new SolrMetricsContext( primaryMetricsContext.getMetricManager(), SolrMetricManager.NODE_REGISTRY); this.nodeAttributes = createNodeAttributes(primaryAttributes); + } else { + this.nodeMetricsContext = null; + this.nodeAttributes = null; } } @@ -77,8 +81,7 @@ public class AttributedInstrumentFactory { Attributes finalNodeAttrs = appendAttributes(nodeAttributes, additionalAttributes); LongCounter primaryCounter = primaryMetricsContext.longCounter(metricName, description); - LongCounter nodeCounter = - nodeMetricsContext.longCounter(toNodeMetricName(metricName), description); + LongCounter nodeCounter = nodeMetricsContext.longCounter(metricName, description); return new DualRegistryAttributedLongCounter( primaryCounter, finalPrimaryAttrs, nodeCounter, finalNodeAttrs); } else { @@ -97,8 +100,7 @@ public class AttributedInstrumentFactory { LongUpDownCounter primaryCounter = primaryMetricsContext.longUpDownCounter(metricName, description); - LongUpDownCounter nodeCounter = - nodeMetricsContext.longUpDownCounter(toNodeMetricName(metricName), description); + LongUpDownCounter nodeCounter = nodeMetricsContext.longUpDownCounter(metricName, description); return new DualRegistryAttributedLongUpDownCounter( primaryCounter, finalPrimaryAttrs, nodeCounter, finalNodeAttrs); } else { @@ -117,8 +119,7 @@ public class AttributedInstrumentFactory { Attributes finalNodeAttrs = appendAttributes(nodeAttributes, additionalAttributes); LongHistogram primaryHistogram = primaryMetricsContext.longHistogram(metricName, description, unit); - LongHistogram nodeHistogram = - nodeMetricsContext.longHistogram(toNodeMetricName(metricName), description, unit); + LongHistogram nodeHistogram = nodeMetricsContext.longHistogram(metricName, description, unit); return new DualRegistryAttributedLongTimer( primaryHistogram, finalPrimaryAttrs, nodeHistogram, finalNodeAttrs); } else { diff --git a/solr/core/src/java/org/apache/solr/search/SolrFieldCacheBean.java b/solr/core/src/java/org/apache/solr/search/SolrFieldCacheBean.java index 883dcaf66a0..fb8d92120a2 100644 --- a/solr/core/src/java/org/apache/solr/search/SolrFieldCacheBean.java +++ b/solr/core/src/java/org/apache/solr/search/SolrFieldCacheBean.java @@ -60,10 +60,10 @@ public class SolrFieldCacheBean implements SolrInfoBean { this.solrMetricsContext = parentContext; var solrCacheStats = solrMetricsContext.longGaugeMeasurement( - "solr_field_cache_entries", "Number of field cache entries"); + "solr_core_field_cache_entries", "Number of field cache entries"); var solrCacheSize = solrMetricsContext.longGaugeMeasurement( - "solr_field_cache_size", "Size of field cache in bytes", OtelUnit.BYTES); + "solr_core_field_cache_size", "Size of field cache in bytes", OtelUnit.BYTES); this.toClose = solrMetricsContext.batchCallback( () -> { diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java index 15cf7ecc431..3604f84d0fc 100644 --- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java +++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java @@ -120,6 +120,7 @@ import org.apache.solr.update.IndexFingerprint; import org.apache.solr.update.SolrIndexConfig; import org.apache.solr.util.IOFunction; import org.apache.solr.util.ThreadCpuTimer; +import org.apache.solr.util.stats.MetricUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -611,7 +612,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI caffeineCache.initializeMetrics( solrMetricsContext, core.getCoreAttributes().toBuilder().put(NAME_ATTR, cache.name()).build(), - "solr_searcher_cache"); + "solr_core_indexsearcher_cache"); } } initializeMetrics(solrMetricsContext, core.getCoreAttributes()); @@ -2626,12 +2627,14 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI warmupTimer = new AttributedLongTimer( solrMetricsContext.longHistogram( - "solr_searcher_warmup_time", "Searcher warmup time (ms)", OtelUnit.MILLISECONDS), + "solr_core_indexsearcher_warmup_time", + "Searcher warmup time (ms)", + OtelUnit.MILLISECONDS), baseAttributes); toClose.add( solrMetricsContext.observableLongCounter( - "solr_searcher_live_docs_cache", + "solr_core_indexsearcher_live_docs_cache", "LiveDocs cache metrics", obs -> { obs.record( @@ -2647,7 +2650,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI // reader stats (numeric) toClose.add( solrMetricsContext.observableLongGauge( - "solr_searcher_index_num_docs", + "solr_core_indexsearcher_index_num_docs", "Number of live docs in the index", obs -> { try { @@ -2659,7 +2662,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI toClose.add( solrMetricsContext.observableLongGauge( - "solr_searcher_index_docs", + "solr_core_indexsearcher_index_docs", "Total number of docs in the index (including deletions)", obs -> { try { @@ -2670,7 +2673,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI // indexVersion (numeric) toClose.add( solrMetricsContext.observableLongGauge( - "solr_searcher_index_version", + "solr_core_indexsearcher_index_version", "Lucene index version", obs -> { try { @@ -2680,20 +2683,21 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI })); // size of the currently opened commit toClose.add( - solrMetricsContext.observableLongGauge( - "solr_searcher_index_commit_size_bytes", - "Size of the current index commit (bytes)", + solrMetricsContext.observableDoubleGauge( + "solr_core_indexsearcher_index_commit_size", + "Size of the current index commit (megabytes)", obs -> { try { long total = 0L; for (String file : reader.getIndexCommit().getFileNames()) { total += DirectoryFactory.sizeOf(reader.directory(), file); } - obs.record(total, baseAttributes); + obs.record(MetricUtils.bytesToMegabytes(total), baseAttributes); } catch (Exception e) { // skip recording if unavailable (no nullNumber in OTel) } - })); + }, + OtelUnit.MEGABYTES)); } public long getWarmupTime() { diff --git a/solr/core/src/java/org/apache/solr/search/stats/StatsCache.java b/solr/core/src/java/org/apache/solr/search/stats/StatsCache.java index 5f163e842af..e79051449de 100644 --- a/solr/core/src/java/org/apache/solr/search/stats/StatsCache.java +++ b/solr/core/src/java/org/apache/solr/search/stats/StatsCache.java @@ -336,7 +336,7 @@ public abstract class StatsCache implements PluginInfoInitialized, SolrInfoBean .build(); this.toClose = solrMetricsContext.observableLongGauge( - "solr_searcher_termstats_cache", + "solr_core_indexsearcher_termstats_cache", "Operation counts for the searcher term statistics cache, reported per operation type", obs -> { var cacheMetrics = getCacheMetrics(); diff --git a/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java b/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java index b17c5ecd74e..2f028f08587 100644 --- a/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java +++ b/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java @@ -258,21 +258,22 @@ public class SolrIndexWriter extends IndexWriter { mergesCounter = solrMetricsContext.longCounter( - "solr_indexwriter_merges", "Number of total merge operations, " + descSuffix); + "solr_core_indexwriter_merges", "Number of total merge operations, " + descSuffix); mergeDocsCounter = solrMetricsContext.longCounter( - "solr_indexwriter_merge_docs", "Number of documents involved in merge, " + descSuffix); + "solr_core_indexwriter_merge_docs", + "Number of documents involved in merge, " + descSuffix); mergeSegmentsCounter = solrMetricsContext.longCounter( - "solr_indexwriter_merge_segments", + "solr_core_indexwriter_merge_segments", "Number of segments involved in merge, " + descSuffix); flushesCounter = solrMetricsContext.longCounter( - "solr_indexwriter_flushes", "Number of flush to disk operations triggered"); + "solr_core_indexwriter_flushes", "Number of flush to disk operations triggered"); var mergesTimerBase = solrMetricsContext.longHistogram( - "solr_indexwriter_merge_time", + "solr_core_indexwriter_merge_time", "Time spent merging segments, " + descSuffix, OtelUnit.MILLISECONDS); majorMergeTimer = diff --git a/solr/core/src/java/org/apache/solr/update/UpdateShardHandler.java b/solr/core/src/java/org/apache/solr/update/UpdateShardHandler.java index 3eab808565f..8410de18ffa 100644 --- a/solr/core/src/java/org/apache/solr/update/UpdateShardHandler.java +++ b/solr/core/src/java/org/apache/solr/update/UpdateShardHandler.java @@ -37,7 +37,6 @@ import org.apache.solr.security.HttpClientBuilderPlugin; import org.apache.solr.update.processor.DistributedUpdateProcessor; import org.apache.solr.update.processor.DistributingUpdateProcessorFactory; import org.apache.solr.util.stats.InstrumentedHttpListenerFactory; -import org.apache.solr.util.stats.MetricUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -167,11 +166,11 @@ public class UpdateShardHandler implements SolrInfoBean { solrMetricsContext = parentContext.getChildContext(this); trackHttpSolrMetrics.initializeMetrics(solrMetricsContext, Attributes.empty()); updateExecutor = - MetricUtils.instrumentedExecutorService( - updateExecutor, solrMetricsContext, getCategory(), "updateOnlyExecutor"); + solrMetricsContext.instrumentedExecutorService( + updateExecutor, "solr_core_executor", "updateOnlyExecutor", getCategory()); recoveryExecutor = - MetricUtils.instrumentedExecutorService( - recoveryExecutor, solrMetricsContext, getCategory(), "recoveryExecutor"); + solrMetricsContext.instrumentedExecutorService( + recoveryExecutor, "solr_core_executor", "recoveryExecutor", getCategory()); } @Override diff --git a/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java b/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java index 23e6ca33ff2..5c878ab6476 100644 --- a/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java +++ b/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java @@ -18,24 +18,14 @@ package org.apache.solr.util.stats; import com.codahale.metrics.Snapshot; import com.codahale.metrics.Timer; -import java.lang.invoke.MethodHandles; import java.lang.management.OperatingSystemMXBean; -import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; -import java.util.function.Predicate; import org.apache.solr.common.util.NamedList; -import org.apache.solr.core.SolrInfoBean; -import org.apache.solr.metrics.SolrMetricsContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** Metrics specific utility functions. */ public class MetricUtils { - private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - public static final String METRIC_NAME = "metric"; public static final String VALUE = "value"; - public static final String VALUES = "values"; private static final String MS = "_ms"; @@ -59,8 +49,6 @@ public class MetricUtils { private static final String P999 = "p999"; private static final String P999_MS = P999 + MS; - public static final Predicate<CharSequence> ALL_PROPERTIES = (name) -> true; - /** * Adds metrics from a Timer to a NamedList, using well-known back-compat names. * @@ -90,13 +78,14 @@ public class MetricUtils { return ns / TimeUnit.MILLISECONDS.toNanos(1); } - // optionally convert ns to ms - static double nsToMs(boolean convert, double value) { - if (convert) { - return nsToMs(value); - } else { - return value; - } + /** + * Converts bytes to megabytes. + * + * @param bytes the number of bytes + * @return the number of megabytes + */ + public static double bytesToMegabytes(long bytes) { + return bytes / (1024.0 * 1024.0); } /** @@ -110,13 +99,4 @@ public class MetricUtils { "com.sun.management.UnixOperatingSystemMXBean", "com.ibm.lang.management.OperatingSystemMXBean" }; - - /** Returns an instrumented wrapper over the given executor service. */ - public static ExecutorService instrumentedExecutorService( - ExecutorService delegate, - SolrMetricsContext ctx, - SolrInfoBean.Category category, - String name) { - return new OtelInstrumentedExecutorService(delegate, ctx, category, name); - } } diff --git a/solr/core/src/java/org/apache/solr/util/stats/OtelInstrumentedExecutorService.java b/solr/core/src/java/org/apache/solr/util/stats/OtelInstrumentedExecutorService.java index b0d76fcc43c..aaad15d6bbf 100644 --- a/solr/core/src/java/org/apache/solr/util/stats/OtelInstrumentedExecutorService.java +++ b/solr/core/src/java/org/apache/solr/util/stats/OtelInstrumentedExecutorService.java @@ -17,9 +17,9 @@ package org.apache.solr.util.stats; import static org.apache.solr.metrics.SolrMetricProducer.CATEGORY_ATTR; +import static org.apache.solr.metrics.SolrMetricProducer.NAME_ATTR; import static org.apache.solr.metrics.SolrMetricProducer.TYPE_ATTR; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import java.util.ArrayList; import java.util.Collection; @@ -47,8 +47,6 @@ import org.apache.solr.metrics.otel.instruments.AttributedLongUpDownCounter; * com.codahale.metrics.InstrumentedExecutorService. */ public class OtelInstrumentedExecutorService implements ExecutorService { - public static final AttributeKey<String> EXECUTOR_NAME_ATTR = - AttributeKey.stringKey("executor_name"); private final ExecutorService delegate; private final String executorName; @@ -62,8 +60,9 @@ public class OtelInstrumentedExecutorService implements ExecutorService { public OtelInstrumentedExecutorService( ExecutorService delegate, SolrMetricsContext ctx, - SolrInfoBean.Category category, - String executorName) { + String metricPrefix, + String executorName, + SolrInfoBean.Category category) { this.delegate = delegate; this.executorName = executorName; this.observableMetrics = new ArrayList<>(); @@ -71,12 +70,12 @@ public class OtelInstrumentedExecutorService implements ExecutorService { Attributes attrs = Attributes.builder() .put(CATEGORY_ATTR, category.toString()) - .put(EXECUTOR_NAME_ATTR, executorName) + .put(NAME_ATTR, executorName) .build(); // Each metric type needs a separate name to avoid obscuring other types var executorTaskCounter = - ctx.longCounter("solr_executor_tasks", "Number of ExecutorService tasks"); + ctx.longCounter(metricPrefix + "_tasks", "Number of ExecutorService tasks"); this.submitted = new AttributedLongCounter( executorTaskCounter, attrs.toBuilder().put(TYPE_ATTR, "submitted").build()); @@ -86,11 +85,11 @@ public class OtelInstrumentedExecutorService implements ExecutorService { this.running = new AttributedLongUpDownCounter( ctx.longUpDownCounter( - "solr_executor_tasks_running", "Number of running ExecutorService tasks"), + metricPrefix + "_tasks_running", "Number of running ExecutorService tasks"), attrs); var executorTaskTimer = ctx.longHistogram( - "solr_executor_task_times", "Timing of ExecutorService tasks", OtelUnit.MILLISECONDS); + metricPrefix + "_task_times", "Timing of ExecutorService tasks", OtelUnit.MILLISECONDS); this.idle = new AttributedLongTimer( executorTaskTimer, attrs.toBuilder().put(TYPE_ATTR, "idle").build()); @@ -102,7 +101,7 @@ public class OtelInstrumentedExecutorService implements ExecutorService { ThreadPoolExecutor threadPool = (ThreadPoolExecutor) delegate; observableMetrics.add( ctx.observableLongGauge( - "solr_executor_thread_pool_size", + metricPrefix + "_thread_pool_size", "Thread pool size", measurement -> { measurement.record( @@ -117,7 +116,7 @@ public class OtelInstrumentedExecutorService implements ExecutorService { final BlockingQueue<Runnable> taskQueue = threadPool.getQueue(); observableMetrics.add( ctx.observableLongGauge( - "solr_executor_thread_pool_tasks", + metricPrefix + "_thread_pool_tasks", "Thread pool task counts", measurement -> { measurement.record( @@ -136,7 +135,7 @@ public class OtelInstrumentedExecutorService implements ExecutorService { ForkJoinPool forkJoinPool = (ForkJoinPool) delegate; observableMetrics.add( ctx.observableLongGauge( - "solr_executor_fork_join_pool_tasks", + metricPrefix + "_fork_join_pool_tasks", "Fork join pool task counts", measurement -> { measurement.record( @@ -148,7 +147,7 @@ public class OtelInstrumentedExecutorService implements ExecutorService { })); observableMetrics.add( ctx.observableLongGauge( - "solr_executor_fork_join_pool_threads", + metricPrefix + "_fork_join_pool_threads", "Fork join pool thread counts", measurement -> { measurement.record( @@ -217,13 +216,13 @@ public class OtelInstrumentedExecutorService implements ExecutorService { @Override public void shutdown() { delegate.shutdown(); - observableMetrics.stream().forEach(IOUtils::closeQuietly); + IOUtils.closeQuietly(observableMetrics); } @Override public List<Runnable> shutdownNow() { List<Runnable> tasks = delegate.shutdownNow(); - observableMetrics.stream().forEach(IOUtils::closeQuietly); + IOUtils.closeQuietly(observableMetrics); return tasks; } diff --git a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java index 8eb6daf2ceb..041ab757eb8 100644 --- a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java @@ -101,7 +101,7 @@ public class CloudExitableDirectoryReaderTest extends SolrCloudTestCase { var reader = jetty.getCoreContainer().getMetricManager().getPrometheusMetricReader("solr.node"); - var errorsSnapshots = reader.collect((name) -> name.equals("solr_node_requests_errors")); + var errorsSnapshots = reader.collect("solr_node_requests_errors"::equals); long errorCount = 0L; if (errorsSnapshots.size() > 0) { @@ -118,7 +118,7 @@ public class CloudExitableDirectoryReaderTest extends SolrCloudTestCase { Long old = fiveHundredsByNode.put(jetty.getNodeName(), errorCount); assertNull("expecting uniq nodenames", old); - var requestsSnapshots = reader.collect((name) -> name.equals("solr_node_requests")); + var requestsSnapshots = reader.collect("solr_node_requests"::equals); if (requestsSnapshots.size() > 0) { var requestsSnapshot = diff --git a/solr/core/src/test/org/apache/solr/cloud/MigrateReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/MigrateReplicasTest.java index 46e2fb41a99..80a8377e791 100644 --- a/solr/core/src/test/org/apache/solr/cloud/MigrateReplicasTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/MigrateReplicasTest.java @@ -211,7 +211,7 @@ public class MigrateReplicasTest extends SolrCloudTestCase { var dp = SolrMetricTestUtils.getGaugeDatapoint( core, - "solr_replication_is_replicating", + "solr_core_replication_is_replicating", SolrMetricTestUtils.newCloudLabelsBuilder(core) .label("category", SolrInfoBean.Category.REPLICATION.toString()) .label("handler", "/replication") @@ -220,7 +220,7 @@ public class MigrateReplicasTest extends SolrCloudTestCase { double isReplicating = dp.getValue(); assertTrue( - "solr_replication_is_replicating should be 0 or 1, got: " + isReplicating, + "solr_core_replication_is_replicating should be 0 or 1, got: " + isReplicating, isReplicating == 0.0 || isReplicating == 1.0); } } diff --git a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java index d031196754b..e34d8bf6fda 100644 --- a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java @@ -189,7 +189,7 @@ public class ReplaceNodeTest extends SolrCloudTestCase { var dp = SolrMetricTestUtils.getGaugeDatapoint( core, - "solr_replication_is_replicating", + "solr_core_replication_is_replicating", SolrMetricTestUtils.newCloudLabelsBuilder(core) .label("category", SolrInfoBean.Category.REPLICATION.toString()) .label("handler", "/replication") @@ -198,7 +198,7 @@ public class ReplaceNodeTest extends SolrCloudTestCase { double isReplicating = dp.getValue(); assertTrue( - "solr_replication_is_replicating should be 0 or 1, got: " + isReplicating, + "solr_core_replication_is_replicating should be 0 or 1, got: " + isReplicating, isReplicating == 0.0 || isReplicating == 1.0); } } diff --git a/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java b/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java index a42e4bfb7e0..17844bc68cc 100644 --- a/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java +++ b/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java @@ -153,7 +153,7 @@ public abstract class TestBaseStatsCacheCloud extends SolrCloudTestCase { String output = new String(in.readAllBytes(), StandardCharsets.UTF_8); for (String line : output.lines().toList()) { - if (line.startsWith("solr_searcher_termstats_cache")) { + if (line.startsWith("solr_core_indexsearcher_termstats_cache")) { String type = extractTypeAttribute(line); long value = extractMetricValue(line); switch (type) { @@ -242,7 +242,7 @@ public abstract class TestBaseStatsCacheCloud extends SolrCloudTestCase { /** * Extract type label value from Prometheus format line - * "solr_searcher_stats_cache{...type="lookups",...}" -> "lookups" + * "solr_core_indexsearcher_termstats_cache{...type="lookups",...}" -> "lookups" */ private String extractTypeAttribute(String line) { java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\btype=\"([^\"]+)\""); @@ -254,8 +254,8 @@ public abstract class TestBaseStatsCacheCloud extends SolrCloudTestCase { } /** - * Extract numeric value from Prometheus format line. "solr_searcher_stats_cache{...} 123.0" -> - * 123 + * Extract numeric value from Prometheus format line. + * "solr_core_indexsearcher_termstats_cache{...} 123.0" -> 123 */ private long extractMetricValue(String line) { String valueStr = line.substring(line.lastIndexOf(' ') + 1); diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilderTest.java b/solr/core/src/test/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilderTest.java index 48ca86f0151..a17032d2d09 100644 --- a/solr/core/src/test/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilderTest.java +++ b/solr/core/src/test/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilderTest.java @@ -17,23 +17,24 @@ package org.apache.solr.cluster.placement.impl; import java.util.Arrays; -import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.SolrTestCase; import org.apache.solr.cluster.placement.CollectionMetrics; import org.apache.solr.cluster.placement.ReplicaMetric; import org.apache.solr.cluster.placement.ReplicaMetrics; import org.apache.solr.cluster.placement.ShardMetrics; import org.junit.Test; -public class CollectionMetricsBuilderTest extends SolrTestCaseJ4 { +public class CollectionMetricsBuilderTest extends SolrTestCase { + + // Some arbitrary/bogus metric; doesn't matter in this unit test + private static final ReplicaMetric<Double> METRIC = new ReplicaMetricImpl<>("aMetric", "aMetric"); @Test public void testMultipleShardLeaders() { CollectionMetricsBuilder.ReplicaMetricsBuilder r1 = - createReplicaMetricsBuilder( - "r1", ReplicaMetricImpl.INDEX_SIZE_GB, 1.5 * MetricImpl.GB, true); + createReplicaMetricsBuilder("r1", METRIC, 1.5, true); CollectionMetricsBuilder.ReplicaMetricsBuilder r2 = - createReplicaMetricsBuilder( - "r2", ReplicaMetricImpl.INDEX_SIZE_GB, 2.5 * MetricImpl.GB, true); + createReplicaMetricsBuilder("r2", METRIC, 2.5, true); CollectionMetrics metrics = collectionMetricsFromShardReplicaBuilders("shard1", r1, r2); ShardMetrics shardMetrics = metrics.getShardMetrics("shard1").get(); @@ -45,20 +46,18 @@ public class CollectionMetricsBuilderTest extends SolrTestCaseJ4 { // Both replicas claimed to be shard leader, so either metric value is acceptable, and an // exception should not be raised - Double indexSize = leaderMetrics.getReplicaMetric(ReplicaMetricImpl.INDEX_SIZE_GB).get(); + Double metricVal = leaderMetrics.getReplicaMetric(METRIC).get(); assertTrue( - "Metric value " + indexSize + " should have matched one of the replica's values", - indexSize.equals(1.5) || indexSize.equals(2.5)); + "Metric value " + metricVal + " should have matched one of the replica's values", + metricVal.equals(1.5) || metricVal.equals(2.5)); } @Test public void testNoShardLeader() { CollectionMetricsBuilder.ReplicaMetricsBuilder r1 = - createReplicaMetricsBuilder( - "r1", ReplicaMetricImpl.INDEX_SIZE_GB, 1.5 * MetricImpl.GB, false); + createReplicaMetricsBuilder("r1", METRIC, 1.5, false); CollectionMetricsBuilder.ReplicaMetricsBuilder r2 = - createReplicaMetricsBuilder( - "r2", ReplicaMetricImpl.INDEX_SIZE_GB, 2.5 * MetricImpl.GB, false); + createReplicaMetricsBuilder("r2", METRIC, 2.5, false); CollectionMetrics metrics = collectionMetricsFromShardReplicaBuilders("shard1", r1, r2); assertTrue("Shard metrics not found", metrics.getShardMetrics("shard1").isPresent()); diff --git a/solr/core/src/test/org/apache/solr/handler/RequestHandlerMetricsTest.java b/solr/core/src/test/org/apache/solr/handler/RequestHandlerMetricsTest.java index e338939b30c..4c7685692b1 100644 --- a/solr/core/src/test/org/apache/solr/handler/RequestHandlerMetricsTest.java +++ b/solr/core/src/test/org/apache/solr/handler/RequestHandlerMetricsTest.java @@ -121,30 +121,34 @@ public class RequestHandlerMetricsTest extends SolrCloudTestCase { (CounterSnapshot.CounterDataPointSnapshot) SolrMetricTestUtils.getDataPointSnapshot( nodeReader, - "solr_node_requests", + "solr_core_requests", Labels.builder() .label("category", "QUERY") .label("handler", "/select") + .label("internal", "false") + .label("replica_type", "NRT") .label("otel_scope_name", "org.apache.solr") .build()); CounterSnapshot.CounterDataPointSnapshot nodeUpdateRequests = (CounterSnapshot.CounterDataPointSnapshot) SolrMetricTestUtils.getDataPointSnapshot( nodeReader, - "solr_node_requests", + "solr_core_requests", Labels.builder() .label("category", "UPDATE") .label("handler", "/update") + .label("replica_type", "NRT") .label("otel_scope_name", "org.apache.solr") .build()); CounterSnapshot.CounterDataPointSnapshot nodeSubmittedOps = (CounterSnapshot.CounterDataPointSnapshot) SolrMetricTestUtils.getDataPointSnapshot( nodeReader, - "solr_node_update_submitted_ops", + "solr_core_update_submitted_ops", Labels.builder() .label("category", "UPDATE") .label("ops", "adds") + .label("replica_type", "NRT") .label("otel_scope_name", "org.apache.solr") .build()); diff --git a/solr/core/src/test/org/apache/solr/handler/admin/StatsReloadRaceTest.java b/solr/core/src/test/org/apache/solr/handler/admin/StatsReloadRaceTest.java index 641a6c66ed3..f54d163ebb4 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/StatsReloadRaceTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/StatsReloadRaceTest.java @@ -144,7 +144,7 @@ public class StatsReloadRaceTest extends SolrTestCaseJ4 { var datapoint = SolrMetricTestUtils.getGaugeDatapoint( reader, - "solr_searcher_index_version", + "solr_core_indexsearcher_index_version", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label("category", "SEARCHER") .build()); diff --git a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java index 8d646539c5f..dd599e1f1b4 100644 --- a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java +++ b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java @@ -84,8 +84,8 @@ public class SolrMetricsIntegrationTest extends SolrTestCaseJ4 { assertNotNull(getGaugeOpt(reader, "solr_cores_loaded", "permanent")); assertNotNull(getGaugeOpt(reader, "solr_cores_loaded", "unloaded")); - assertNotNull(getGaugeOpt(reader, "solr_disk_space_bytes", "total_space")); - assertNotNull(getGaugeOpt(reader, "solr_disk_space_bytes", "usable_space")); + assertNotNull(getGaugeOpt(reader, "solr_disk_space_megabytes", "total_space")); + assertNotNull(getGaugeOpt(reader, "solr_disk_space_megabytes", "usable_space")); } private static GaugeDataPointSnapshot getGaugeOpt( diff --git a/solr/core/src/test/org/apache/solr/search/TestMainQueryCaching.java b/solr/core/src/test/org/apache/solr/search/TestMainQueryCaching.java index 23349bf643b..afc8807a6e6 100644 --- a/solr/core/src/test/org/apache/solr/search/TestMainQueryCaching.java +++ b/solr/core/src/test/org/apache/solr/search/TestMainQueryCaching.java @@ -102,7 +102,7 @@ public class TestMainQueryCaching extends SolrTestCaseJ4 { return (long) SolrMetricTestUtils.getCounterDatapoint( core, - "solr_searcher_live_docs_cache", + "solr_core_indexsearcher_live_docs_cache", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label("category", "SEARCHER") .label("type", type) diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrFieldCacheBean.java b/solr/core/src/test/org/apache/solr/search/TestSolrFieldCacheBean.java index 726d42d2c70..466eb3e5043 100644 --- a/solr/core/src/test/org/apache/solr/search/TestSolrFieldCacheBean.java +++ b/solr/core/src/test/org/apache/solr/search/TestSolrFieldCacheBean.java @@ -31,8 +31,8 @@ import org.junit.Test; public class TestSolrFieldCacheBean extends SolrTestCaseJ4 { - private static final String ENTRIES_METRIC_NAME = "solr_field_cache_entries"; - private static final String SIZE_BYTES_METRIC_NAME = "solr_field_cache_size_bytes"; + private static final String ENTRIES_METRIC_NAME = "solr_core_field_cache_entries"; + private static final String SIZE_BYTES_METRIC_NAME = "solr_core_field_cache_size_bytes"; private static final String DISABLE_ENTRY_LIST_PROPERTY = "disableSolrFieldCacheMBeanEntryList"; private static final String DISABLE_ENTRY_LIST_JMX_PROPERTY = "disableSolrFieldCacheMBeanEntryListJmx"; diff --git a/solr/core/src/test/org/apache/solr/update/SolrIndexMetricsTest.java b/solr/core/src/test/org/apache/solr/update/SolrIndexMetricsTest.java index f7d0470c88d..68d105cc7d2 100644 --- a/solr/core/src/test/org/apache/solr/update/SolrIndexMetricsTest.java +++ b/solr/core/src/test/org/apache/solr/update/SolrIndexMetricsTest.java @@ -64,7 +64,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var indexSize = SolrMetricTestUtils.getGaugeDatapoint( core, - "solr_core_index_size_bytes", + "solr_core_index_size_megabytes", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label("category", "CORE") .build()); @@ -106,7 +106,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var minorMergeTimer = SolrMetricTestUtils.getHistogramDatapoint( core, - "solr_indexwriter_merge_time_milliseconds", + "solr_core_indexwriter_merge_time_milliseconds", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "minor") @@ -118,7 +118,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var majorMergeTimer = SolrMetricTestUtils.getHistogramDatapoint( core, - "solr_indexwriter_merge_time_milliseconds", + "solr_core_indexwriter_merge_time_milliseconds", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "major") @@ -131,7 +131,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var minorMergeDocs = SolrMetricTestUtils.getCounterDatapoint( core, - "solr_indexwriter_merge_docs", + "solr_core_indexwriter_merge_docs", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "minor") @@ -146,7 +146,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var majorMergeDocs = SolrMetricTestUtils.getCounterDatapoint( core, - "solr_indexwriter_merge_docs", + "solr_core_indexwriter_merge_docs", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "major") @@ -163,7 +163,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var minorSegmentsMergeMetric = SolrMetricTestUtils.getCounterDatapoint( core, - "solr_indexwriter_merge_segments", + "solr_core_indexwriter_merge_segments", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "minor") @@ -179,7 +179,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var majorSegmentsMergeMetric = SolrMetricTestUtils.getCounterDatapoint( core, - "solr_indexwriter_merge_segments", + "solr_core_indexwriter_merge_segments", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .label(MERGE_TYPE_ATTR.toString(), "major") @@ -196,7 +196,7 @@ public class SolrIndexMetricsTest extends SolrTestCaseJ4 { var flushCounter = SolrMetricTestUtils.getCounterDatapoint( core, - "solr_indexwriter_flushes", + "solr_core_indexwriter_flushes", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label(CATEGORY_ATTR.toString(), SolrInfoBean.Category.INDEX.toString()) .build()); diff --git a/solr/core/src/test/org/apache/solr/util/stats/OtelInstrumentedExecutorServiceTest.java b/solr/core/src/test/org/apache/solr/util/stats/OtelInstrumentedExecutorServiceTest.java index 3ae36b14db6..e6b5f1d287b 100644 --- a/solr/core/src/test/org/apache/solr/util/stats/OtelInstrumentedExecutorServiceTest.java +++ b/solr/core/src/test/org/apache/solr/util/stats/OtelInstrumentedExecutorServiceTest.java @@ -44,7 +44,6 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { public static long EXEC_TIMEOUT = 1; public static TimeUnit EXEC_TIMEOUT_UNITS = TimeUnit.SECONDS; public static final String REGISTRY_NAME = "solr-test-otel-registry"; - public static final String TAG_NAME = "solr-test-otel-tag"; public static final double DELTA = 2.4e-07; public static SolrMetricsContext metricsContext; @@ -67,10 +66,10 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { metricsContext.getMetricManager().getPrometheusMetricReader(REGISTRY_NAME).collect(); GaugeSnapshot tasksRunning = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_tasks_running"); + GaugeSnapshot.class, metrics, "solr_node_executor_tasks_running"); CounterSnapshot taskCounters = SolrMetricTestUtils.getMetricSnapshot( - CounterSnapshot.class, metrics, "solr_executor_tasks"); + CounterSnapshot.class, metrics, "solr_node_executor_tasks"); GaugeDataPointSnapshot runningTasks = tasksRunning.getDataPoints().getFirst(); CounterDataPointSnapshot submittedTasks = getCounterData(taskCounters, "submitted"); @@ -95,10 +94,10 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { metricsContext.getMetricManager().getPrometheusMetricReader(REGISTRY_NAME).collect(); GaugeSnapshot tasksRunning = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_tasks_running"); + GaugeSnapshot.class, metrics, "solr_node_executor_tasks_running"); CounterSnapshot taskCounters = SolrMetricTestUtils.getMetricSnapshot( - CounterSnapshot.class, metrics, "solr_executor_tasks"); + CounterSnapshot.class, metrics, "solr_node_executor_tasks"); GaugeDataPointSnapshot runningTasks = tasksRunning.getDataPoints().getFirst(); CounterDataPointSnapshot submittedTasks = getCounterData(taskCounters, "submitted"); @@ -129,7 +128,10 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { HistogramSnapshot taskTimers = metrics.stream() .filter( - m -> m.getMetadata().getPrometheusName().startsWith("solr_executor_task_times")) + m -> + m.getMetadata() + .getPrometheusName() + .startsWith("solr_node_executor_task_times")) .findFirst() .map(HistogramSnapshot.class::cast) .get(); @@ -163,10 +165,10 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { metricsContext.getMetricManager().getPrometheusMetricReader(REGISTRY_NAME).collect(); GaugeSnapshot sizeGauges = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_thread_pool_size"); + GaugeSnapshot.class, metrics, "solr_node_executor_thread_pool_size"); GaugeSnapshot taskGauges = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_thread_pool_tasks"); + GaugeSnapshot.class, metrics, "solr_node_executor_thread_pool_tasks"); GaugeDataPointSnapshot poolSize = getGaugeData(sizeGauges, "size"); GaugeDataPointSnapshot corePoolSize = getGaugeData(sizeGauges, "core"); @@ -205,10 +207,10 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { metricsContext.getMetricManager().getPrometheusMetricReader(REGISTRY_NAME).collect(); GaugeSnapshot taskGauges = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_fork_join_pool_tasks"); + GaugeSnapshot.class, metrics, "solr_node_executor_fork_join_pool_tasks"); GaugeSnapshot threadGauges = SolrMetricTestUtils.getMetricSnapshot( - GaugeSnapshot.class, metrics, "solr_executor_fork_join_pool_threads"); + GaugeSnapshot.class, metrics, "solr_node_executor_fork_join_pool_threads"); GaugeDataPointSnapshot stolenTasks = getGaugeData(taskGauges, "stolen"); GaugeDataPointSnapshot queuedTasks = getGaugeData(taskGauges, "queued"); @@ -224,8 +226,8 @@ public class OtelInstrumentedExecutorServiceTest extends SolrTestCase { } private static ExecutorService testExecutor(String name, ExecutorService exec) { - return MetricUtils.instrumentedExecutorService( - exec, metricsContext, SolrInfoBean.Category.ADMIN, name); + return metricsContext.instrumentedExecutorService( + exec, "solr_node_executor", name, SolrInfoBean.Category.ADMIN); } private static CounterDataPointSnapshot getCounterData(CounterSnapshot snapshot, String type) { diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/NodeValueFetcher.java b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/NodeValueFetcher.java index b9a2e439d51..bd9b237cecd 100644 --- a/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/NodeValueFetcher.java +++ b/solr/solrj-zookeeper/src/java/org/apache/solr/client/solrj/impl/NodeValueFetcher.java @@ -64,8 +64,8 @@ public class NodeValueFetcher { /** Various well known tags that can be fetched from a node */ public enum Metrics { - FREEDISK("freedisk", "solr_disk_space_bytes", "type", "usable_space"), - TOTALDISK("totaldisk", "solr_disk_space_bytes", "type", "total_space"), + FREEDISK("freedisk", "solr_disk_space_megabytes", "type", "usable_space"), + TOTALDISK("totaldisk", "solr_disk_space_megabytes", "type", "total_space"), CORES("cores", "solr_cores_loaded") { @Override public Object extractFromPrometheus(List<String> prometheusLines) { @@ -257,9 +257,8 @@ public class NodeValueFetcher { /** * Retrieve values that match metrics. Metrics names are structured like below: * - * <p>"metrics:solr_cores_filesystem_disk_space_bytes:type=usable_space" or - * "metrics:jvm_cpu_count". Metrics are fetched from /admin/metrics and parsed using shared - * utility methods. + * <p>"metrics:solr_disk_space_megabytes:type=usable_space" or "metrics:jvm_cpu_count". Metrics + * are fetched from /admin/metrics and parsed using shared utility methods. */ private void getRemoteMetrics( Set<String> requestedTagNames, SolrClientNodeStateProvider.RemoteCallCtx ctx) { @@ -346,7 +345,7 @@ public class NodeValueFetcher { /** * Create a MetricRequest from a metric tag string like "metrics:jvm_cpu_count" or - * "metrics:solr_cores_filesystem_disk_space_bytes:type=usable_space" + * "metrics:solr_disk_space_megabytes:type=usable_space" */ public static MetricRequest fromTag(String tag) { String[] parts = tag.split(":"); diff --git a/solr/solrj/gradle.lockfile b/solr/solrj/gradle.lockfile index db547de09b9..876ad1344d1 100644 --- a/solr/solrj/gradle.lockfile +++ b/solr/solrj/gradle.lockfile @@ -17,12 +17,18 @@ com.github.stephenc.jcip:jcip-annotations:1.0-1=compileClasspath,compileOnlyHelp com.google.auto.service:auto-service-annotations:1.0.1=annotationProcessor,errorprone,testAnnotationProcessor com.google.auto.value:auto-value-annotations:1.11.0=annotationProcessor,errorprone,testAnnotationProcessor com.google.auto:auto-common:1.2.2=annotationProcessor,errorprone,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=spotless865458226 com.google.errorprone:error_prone_annotation:2.41.0=annotationProcessor,errorprone,testAnnotationProcessor +com.google.errorprone:error_prone_annotations:2.18.0=spotless865458226 com.google.errorprone:error_prone_annotations:2.41.0=annotationProcessor,errorprone,jarValidation,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath com.google.errorprone:error_prone_check_api:2.41.0=annotationProcessor,errorprone,testAnnotationProcessor com.google.errorprone:error_prone_core:2.41.0=annotationProcessor,errorprone,testAnnotationProcessor +com.google.googlejavaformat:google-java-format:1.18.1=spotless865458226 com.google.googlejavaformat:google-java-format:1.27.0=annotationProcessor,errorprone,testAnnotationProcessor +com.google.guava:failureaccess:1.0.1=spotless865458226 com.google.guava:failureaccess:1.0.3=annotationProcessor,errorprone,jarValidation,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.guava:guava-parent:32.1.1-jre=spotless865458226 +com.google.guava:guava:32.1.1-jre=spotless865458226 com.google.guava:guava:33.4.8-jre=annotationProcessor,errorprone,jarValidation,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,errorprone,jarValidation,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath com.google.j2objc:j2objc-annotations:3.1=annotationProcessor,errorprone,jarValidation,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath @@ -125,6 +131,7 @@ org.apache.yetus:audience-annotations:0.12.0=permitTestUnusedDeclared org.apache.zookeeper:zookeeper-jute:3.9.4=jarValidation,permitTestUnusedDeclared,testCompileClasspath,testRuntimeClasspath org.apache.zookeeper:zookeeper:3.9.4=jarValidation,permitTestUnusedDeclared,testCompileClasspath,testRuntimeClasspath org.apiguardian:apiguardian-api:1.1.2=jarValidation,testRuntimeClasspath +org.checkerframework:checker-qual:3.33.0=spotless865458226 org.codehaus.woodstox:stax2-api:4.2.2=jarValidation,testRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.27=jarValidation,testCompileClasspath,testRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-webapp:12.0.27=jarValidation,testCompileClasspath,testRuntimeClasspath diff --git a/solr/test-framework/src/java/org/apache/solr/cluster/placement/Builders.java b/solr/test-framework/src/java/org/apache/solr/cluster/placement/Builders.java index cffbea31b4c..7185472b7a9 100644 --- a/solr/test-framework/src/java/org/apache/solr/cluster/placement/Builders.java +++ b/solr/test-framework/src/java/org/apache/solr/cluster/placement/Builders.java @@ -435,7 +435,7 @@ public class Builders { if (initialSizeGBPerShard != null) { replicaMetricsBuilder.addMetric( ReplicaMetricImpl.INDEX_SIZE_GB, - initialSizeGBPerShard.get(shardNumber - 1) * ReplicaMetricImpl.GB); + initialSizeGBPerShard.get(shardNumber - 1) * 1024); // GB to MB } if (leader == null && type != Replica.ReplicaType.PULL) { leader = replicaBuilder; diff --git a/solr/test-framework/src/java/org/apache/solr/util/SolrMetricTestUtils.java b/solr/test-framework/src/java/org/apache/solr/util/SolrMetricTestUtils.java index 548195acc59..a201c9227bd 100644 --- a/solr/test-framework/src/java/org/apache/solr/util/SolrMetricTestUtils.java +++ b/solr/test-framework/src/java/org/apache/solr/util/SolrMetricTestUtils.java @@ -85,6 +85,11 @@ public final class SolrMetricTestUtils { public static final String SUFFIX = "_testing"; + /** + * Looks up the first {@link MetricSnapshot} named {@code metricName}, and returns the first + * {@link DataPointSnapshot} having exactly these {@code labels}. Null if not found. The result is + * typically casted to something useful. + */ public static DataPointSnapshot getDataPointSnapshot( PrometheusMetricReader reader, String metricName, Labels labels) { MetricSnapshots metricSnapshots = reader.collect(); @@ -228,7 +233,7 @@ public final class SolrMetricTestUtils { SolrCore core, String cacheName, String operation) { return SolrMetricTestUtils.getCounterDatapoint( core, - "solr_searcher_cache_ops", + "solr_core_indexsearcher_cache_ops", SolrMetricTestUtils.newStandaloneLabelsBuilder(core) .label("category", "CACHE") .label("ops", operation) @@ -244,7 +249,7 @@ public final class SolrMetricTestUtils { .label("name", cacheName) .label("result", result); return SolrMetricTestUtils.getCounterDatapoint( - core, "solr_searcher_cache_lookups", builder.build()); + core, "solr_core_indexsearcher_cache_lookups", builder.build()); } public static CounterSnapshot.CounterDataPointSnapshot getCacheSearcherOpsHits(
