This is an automated email from the ASF dual-hosted git repository.

dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 4d8057abbe4 SOLR-17458: OTEL metrics: some renames (#3826)
4d8057abbe4 is described below

commit 4d8057abbe4da68d19de6a847eba204f13b9734a
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
---
 .../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(

Reply via email to