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

mlbiscoc pushed a commit to branch feature/SOLR-17458-rebased
in repository https://gitbox.apache.org/repos/asf/solr.git

commit bed6205d9b4a23a05d7b6d129686ce8f27c0ac91
Author: Matthew Biscocho <[email protected]>
AuthorDate: Fri Sep 26 14:19:49 2025 -0400

    SOLR-17806: Migrate suggest component and cross-dc metrics to OTEL (#3668)
    
    * Migrate cross-dc and suggester metrics
    
    * Change based on feedback
---
 .../src/java/org/apache/solr/core/SolrCore.java    |  6 +-
 .../solr/handler/component/SuggestComponent.java   | 35 ++++++-----
 .../apache/solr/metrics/SolrCoreMetricManager.java |  3 +-
 .../org/apache/solr/search/SolrIndexSearcher.java  | 23 +------
 .../apache/solr/cloud/TestBaseStatsCacheCloud.java |  9 ++-
 .../TestPrometheusResponseWriterCloud.java         |  2 +-
 .../update/processor/MirroringUpdateProcessor.java |  2 +-
 .../crossdc/update/processor/ProducerMetrics.java  | 73 ++++++++++++++--------
 .../processor/MirroringUpdateProcessorTest.java    | 28 +++++----
 .../solrj/impl/CloudHttp2SolrClientRetryTest.java  |  2 +-
 .../solrj/impl/CloudSolrClientRetryTest.java       |  2 +-
 .../org/apache/solr/util/SolrMetricTestUtils.java  |  6 +-
 12 files changed, 100 insertions(+), 91 deletions(-)

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 ea2b9a08e8f..2d31429eab4 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -21,7 +21,7 @@ import static 
org.apache.solr.handler.admin.MetricsHandler.OPEN_METRICS_WT;
 import static 
org.apache.solr.handler.admin.MetricsHandler.PROMETHEUS_METRICS_WT;
 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_ATTR;
+import static org.apache.solr.metrics.SolrCoreMetricManager.REPLICA_TYPE_ATTR;
 import static org.apache.solr.metrics.SolrCoreMetricManager.SHARD_ATTR;
 
 import com.github.benmanes.caffeine.cache.Cache;
@@ -572,8 +572,8 @@ public class SolrCore implements SolrInfoBean, Closeable {
                 .put(CORE_ATTR, getName())
                 .put(SHARD_ATTR, 
coreDescriptor.getCloudDescriptor().getShardId())
                 .put(
-                    REPLICA_ATTR,
-                    
Utils.parseMetricsReplicaName(coreDescriptor.getCollectionName(), getName()))
+                    REPLICA_TYPE_ATTR,
+                    
coreDescriptor.getCloudDescriptor().getReplicaType().toString())
                 .build()
             : Attributes.builder().put(CORE_ATTR, getName()).build();
   }
diff --git 
a/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java 
b/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
index f32934451ac..2702f79e58e 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
@@ -43,13 +43,14 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrEventListener;
-import org.apache.solr.metrics.MetricsMap;
 import org.apache.solr.metrics.SolrMetricProducer;
 import org.apache.solr.metrics.SolrMetricsContext;
+import org.apache.solr.metrics.otel.OtelUnit;
 import org.apache.solr.search.QueryLimits;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.spelling.suggest.SolrSuggester;
@@ -95,6 +96,8 @@ public class SuggestComponent extends SearchComponent
    */
   protected Map<String, SolrSuggester> suggesters = new ConcurrentHashMap<>();
 
+  private AutoCloseable toClose;
+
   /** Container for various labels used in the responses generated by this 
component */
   private static class SuggesterResultLabels {
     static final String SUGGEST = "suggest";
@@ -382,24 +385,20 @@ public class SuggestComponent extends SearchComponent
     return "Suggester component";
   }
 
-  // TODO SOLR-17458: Migrate to OTEL
   @Override
   public void initializeMetrics(
       SolrMetricsContext parentContext, Attributes attributes, String scope) {
     super.initializeMetrics(parentContext, attributes, scope);
-
-    this.solrMetricsContext.gauge(
-        () -> ramBytesUsed(), true, "totalSizeInBytes", 
getCategory().toString());
-    MetricsMap suggestersMap =
-        new MetricsMap(
-            map -> {
-              for (Map.Entry<String, SolrSuggester> entry : 
suggesters.entrySet()) {
-                SolrSuggester suggester = entry.getValue();
-                map.putNoEx(entry.getKey(), suggester.toString());
-              }
-            });
-    this.solrMetricsContext.gauge(
-        suggestersMap, true, "suggesters", getCategory().toString(), scope);
+    var suggesterAttributes =
+        attributes.toBuilder().put(CATEGORY_ATTR, 
getCategory().toString()).build();
+    this.toClose =
+        this.solrMetricsContext.observableLongGauge(
+            "solr_core_suggester_total_size",
+            "Total memory size in bytes of all suggester",
+            (observableLongMeasurement) -> {
+              observableLongMeasurement.record(ramBytesUsed(), 
suggesterAttributes);
+            },
+            OtelUnit.BYTES);
   }
 
   @Override
@@ -520,6 +519,12 @@ public class SuggestComponent extends SearchComponent
     return result;
   }
 
+  @Override
+  public void close() throws IOException {
+    IOUtils.closeQuietly(toClose);
+    super.close();
+  }
+
   /** Listener to build or reload the maintained {@link SolrSuggester} by this 
component */
   private static class SuggesterListener implements SolrEventListener {
     private final SolrCore core;
diff --git 
a/solr/core/src/java/org/apache/solr/metrics/SolrCoreMetricManager.java 
b/solr/core/src/java/org/apache/solr/metrics/SolrCoreMetricManager.java
index aa64dcbacb1..99dec259ff6 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrCoreMetricManager.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrCoreMetricManager.java
@@ -41,7 +41,8 @@ public class SolrCoreMetricManager implements Closeable {
   public static final AttributeKey<String> COLLECTION_ATTR = 
AttributeKey.stringKey("collection");
   public static final AttributeKey<String> CORE_ATTR = 
AttributeKey.stringKey("core");
   public static final AttributeKey<String> SHARD_ATTR = 
AttributeKey.stringKey("shard");
-  public static final AttributeKey<String> REPLICA_ATTR = 
AttributeKey.stringKey("replica");
+  public static final AttributeKey<String> REPLICA_TYPE_ATTR =
+      AttributeKey.stringKey("replica_type");
 
   private final SolrCore core;
   private SolrMetricsContext solrMetricsContext;
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 51dd2c83930..14e44b4fcc0 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -16,10 +16,6 @@
  */
 package org.apache.solr.search;
 
-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_ATTR;
-import static org.apache.solr.metrics.SolrCoreMetricManager.SHARD_ATTR;
 import static org.apache.solr.search.CpuAllowedLimit.TIMING_CONTEXT;
 
 import com.codahale.metrics.Gauge;
@@ -102,7 +98,6 @@ import 
org.apache.solr.common.util.ExecutorUtil.MDCAwareThreadPoolExecutor;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.DirectoryFactory.DirContext;
 import org.apache.solr.core.NodeConfig;
@@ -621,23 +616,7 @@ public class SolrIndexSearcher extends IndexSearcher 
implements Closeable, SolrI
           core.getCoreAttributes().toBuilder().put(NAME_ATTR, 
cache.name()).build(),
           "solr_searcher_cache");
     }
-    Attributes baseAttributes;
-    if (core.getCoreContainer().isZooKeeperAware()) {
-      baseAttributes =
-          Attributes.builder()
-              .put(COLLECTION_ATTR, 
core.getCoreDescriptor().getCollectionName())
-              .put(CORE_ATTR, core.getCoreDescriptor().getName())
-              .put(SHARD_ATTR, 
core.getCoreDescriptor().getCloudDescriptor().getShardId())
-              .put(
-                  REPLICA_ATTR,
-                  Utils.parseMetricsReplicaName(
-                      core.getCoreDescriptor().getCollectionName(), 
core.getName()))
-              .build();
-    } else {
-      baseAttributes =
-          Attributes.builder().put(CORE_ATTR, 
core.getCoreDescriptor().getName()).build();
-    }
-    initializeMetrics(solrMetricsContext, baseAttributes, STATISTICS_KEY);
+    initializeMetrics(solrMetricsContext, core.getCoreAttributes(), 
STATISTICS_KEY);
     registerTime = new Date();
   }
 
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 607715f9aa4..a42e4bfb7e0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java
@@ -245,9 +245,12 @@ public abstract class TestBaseStatsCacheCloud extends 
SolrCloudTestCase {
    * "solr_searcher_stats_cache{...type="lookups",...}" -> "lookups"
    */
   private String extractTypeAttribute(String line) {
-    int typeStart = line.indexOf("type=\"");
-    int typeEnd = line.indexOf('"', typeStart += 6);
-    return line.substring(typeStart, typeEnd);
+    java.util.regex.Pattern pattern = 
java.util.regex.Pattern.compile("\\btype=\"([^\"]+)\"");
+    java.util.regex.Matcher matcher = pattern.matcher(line);
+    if (matcher.find()) {
+      return matcher.group(1);
+    }
+    throw new IllegalArgumentException("No type attribute found in line: " + 
line);
   }
 
   /**
diff --git 
a/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriterCloud.java
 
b/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriterCloud.java
index 003745fe383..47c8d50791f 100644
--- 
a/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriterCloud.java
+++ 
b/solr/core/src/test/org/apache/solr/response/TestPrometheusResponseWriterCloud.java
@@ -87,7 +87,7 @@ public class TestPrometheusResponseWriterCloud extends 
SolrCloudTestCase {
                           && line.contains("handler=\"/select\"")
                           && line.contains("collection=\"collection1\"")
                           && 
line.contains("core=\"collection1_shard1_replica_n1\"")
-                          && line.contains("replica=\"replica_n1\"")
+                          && line.contains("replica_type=\"NRT\"")
                           && line.contains("shard=\"shard1\"")));
     }
   }
diff --git 
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessor.java
 
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessor.java
index 3b391f83b83..346bf19d81b 100644
--- 
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessor.java
+++ 
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessor.java
@@ -143,7 +143,7 @@ public class MirroringUpdateProcessor extends 
UpdateRequestProcessor {
           estimatedDocSizeInBytes,
           maxMirroringDocSizeBytes);
     }
-    producerMetrics.getDocumentSize().update(estimatedDocSizeInBytes);
+    producerMetrics.getDocumentSize().record(estimatedDocSizeInBytes);
     final boolean tooLargeForKafka = estimatedDocSizeInBytes > 
maxMirroringDocSizeBytes;
     if (tooLargeForKafka && !indexUnmirrorableDocs) {
       throw new SolrException(
diff --git 
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
 
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
index 1efdb7ded95..65fd30668a8 100644
--- 
a/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
+++ 
b/solr/modules/cross-dc/src/java/org/apache/solr/crossdc/update/processor/ProducerMetrics.java
@@ -16,52 +16,73 @@
  */
 package org.apache.solr.crossdc.update.processor;
 
-import com.codahale.metrics.Counter;
-import com.codahale.metrics.Histogram;
+import static org.apache.solr.metrics.SolrMetricProducer.TYPE_ATTR;
+
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.metrics.SolrMetricsContext;
+import org.apache.solr.metrics.otel.OtelUnit;
+import org.apache.solr.metrics.otel.instruments.AttributedLongCounter;
+import org.apache.solr.metrics.otel.instruments.AttributedLongHistogram;
 
 /** Metrics presented for each SolrCore using `crossdc.producer.` path. */
 public class ProducerMetrics {
 
-  private final Counter local;
-  private final Counter localError;
-  private final Counter submitted;
-  private final Counter submitError;
-  private final Histogram documentSize;
-  private final Counter documentTooLarge;
+  private final AttributedLongCounter local;
+  private final AttributedLongCounter localError;
+  private final AttributedLongCounter submitted;
+  private final AttributedLongCounter submitError;
+  private final AttributedLongHistogram documentSize;
+  private final AttributedLongCounter documentTooLarge;
 
   public ProducerMetrics(SolrMetricsContext solrMetricsContext, SolrCore 
solrCore) {
+    var attributes = solrCore.getCoreAttributes();
+
+    var localProcessed =
+        solrMetricsContext.longCounter(
+            "solr_core_crossdc_producer_local_processed",
+            "The number of local documents processed (success or error)");
+    var localSubmitted =
+        solrMetricsContext.longCounter(
+            "solr_core_crossdc_producer_submitted",
+            "The number of documents submitted to the Kafka topic (success or 
error)");
+    var histogramDocSizes =
+        solrMetricsContext.longHistogram(
+            "solr_core_crossdc_producer_document_size",
+            "Histogram of the processed document sizes processed",
+            OtelUnit.BYTES);
+    var tooLargeErrors =
+        solrMetricsContext.longCounter(
+            "solr_core_crossdc_producer_doc_too_large_errors",
+            "The number of documents that were too large to send to the Kafka 
topic");
+
     this.local =
-        solrMetricsContext.counter(String.valueOf(solrCore), "local", 
"crossdc", "producer");
+        new AttributedLongCounter(
+            localProcessed, attributes.toBuilder().put(TYPE_ATTR, 
"success").build());
     this.localError =
-        solrMetricsContext.counter(
-            String.valueOf(solrCore), "local", "crossdc", "producer", 
"errors");
+        new AttributedLongCounter(
+            localProcessed, attributes.toBuilder().put(TYPE_ATTR, 
"error").build());
     this.submitted =
-        solrMetricsContext.counter(String.valueOf(solrCore), "submitted", 
"crossdc", "producer");
+        new AttributedLongCounter(
+            localSubmitted, attributes.toBuilder().put(TYPE_ATTR, 
"success").build());
     this.submitError =
-        solrMetricsContext.counter(
-            String.valueOf(solrCore), "submit", "crossdc", "producer", 
"errors");
-    this.documentSize =
-        solrMetricsContext.histogram(
-            String.valueOf(solrCore), "documentSize", "crossdc", "producer");
-    this.documentTooLarge =
-        solrMetricsContext.counter(
-            String.valueOf(solrCore), "documentTooLarge", "crossdc", 
"producer", "errors");
+        new AttributedLongCounter(
+            localSubmitted, attributes.toBuilder().put(TYPE_ATTR, 
"error").build());
+    this.documentSize = new AttributedLongHistogram(histogramDocSizes, 
attributes);
+    this.documentTooLarge = new AttributedLongCounter(tooLargeErrors, 
attributes);
   }
 
   /** Counter representing the number of local documents processed 
successfully. */
-  public Counter getLocal() {
+  public AttributedLongCounter getLocal() {
     return this.local;
   }
 
   /** Counter representing the number of local documents processed with error. 
*/
-  public Counter getLocalError() {
+  public AttributedLongCounter getLocalError() {
     return this.localError;
   }
 
   /** Counter representing the number of documents submitted to the Kafka 
topic. */
-  public Counter getSubmitted() {
+  public AttributedLongCounter getSubmitted() {
     return this.submitted;
   }
 
@@ -69,19 +90,19 @@ public class ProducerMetrics {
    * Counter representing the number of documents that were not submitted to 
the Kafka topic because
    * of exception during execution.
    */
-  public Counter getSubmitError() {
+  public AttributedLongCounter getSubmitError() {
     return this.submitError;
   }
 
   /** Histogram of the processed document size. */
-  public Histogram getDocumentSize() {
+  public AttributedLongHistogram getDocumentSize() {
     return this.documentSize;
   }
 
   /**
    * Counter representing the number of documents that were too large to send 
to the Kafka topic.
    */
-  public Counter getDocumentTooLarge() {
+  public AttributedLongCounter getDocumentTooLarge() {
     return this.documentTooLarge;
   }
 }
diff --git 
a/solr/modules/cross-dc/src/test/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessorTest.java
 
b/solr/modules/cross-dc/src/test/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessorTest.java
index a24f8728717..1c30f956dbb 100644
--- 
a/solr/modules/cross-dc/src/test/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessorTest.java
+++ 
b/solr/modules/cross-dc/src/test/org/apache/solr/crossdc/update/processor/MirroringUpdateProcessorTest.java
@@ -23,8 +23,7 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import com.codahale.metrics.Counter;
-import com.codahale.metrics.Histogram;
+import io.opentelemetry.api.common.Attributes;
 import java.io.IOException;
 import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
@@ -48,6 +47,8 @@ import org.apache.solr.core.CoreDescriptor;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.crossdc.common.CrossDcConf;
 import org.apache.solr.metrics.SolrMetricsContext;
+import org.apache.solr.metrics.otel.instruments.AttributedLongCounter;
+import org.apache.solr.metrics.otel.instruments.AttributedLongHistogram;
 import org.apache.solr.request.SolrQueryRequestBase;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.update.AddUpdateCommand;
@@ -113,39 +114,42 @@ public class MirroringUpdateProcessorTest extends 
SolrTestCaseJ4 {
     commitUpdateCommand.openSearcher = true;
     commitUpdateCommand.waitSearcher = true;
 
+    core = mock(SolrCore.class);
+    when(core.getCoreAttributes()).thenReturn(Attributes.empty());
+
     producerMetrics =
         spy(
-            new ProducerMetrics(mock(SolrMetricsContext.class), 
mock(SolrCore.class)) {
-              private final Counter counterMock = mock(Counter.class);
+            new ProducerMetrics(mock(SolrMetricsContext.class), core) {
+              private final AttributedLongCounter counterMock = 
mock(AttributedLongCounter.class);
 
               @Override
-              public Counter getLocal() {
+              public AttributedLongCounter getLocal() {
                 return counterMock;
               }
 
               @Override
-              public Counter getLocalError() {
+              public AttributedLongCounter getLocalError() {
                 return counterMock;
               }
 
               @Override
-              public Counter getSubmitted() {
+              public AttributedLongCounter getSubmitted() {
                 return counterMock;
               }
 
               @Override
-              public Counter getDocumentTooLarge() {
+              public AttributedLongCounter getDocumentTooLarge() {
                 return counterMock;
               }
 
               @Override
-              public Counter getSubmitError() {
+              public AttributedLongCounter getSubmitError() {
                 return counterMock;
               }
 
               @Override
-              public Histogram getDocumentSize() {
-                return mock(Histogram.class);
+              public AttributedLongHistogram getDocumentSize() {
+                return mock(AttributedLongHistogram.class);
               }
             });
 
@@ -168,8 +172,6 @@ public class MirroringUpdateProcessorTest extends 
SolrTestCaseJ4 {
             return requestMock;
           }
         };
-
-    core = mock(SolrCore.class);
     CoreDescriptor coreDesc = mock(CoreDescriptor.class);
     cloudDesc = mock(CloudDescriptor.class);
     when(cloudDesc.getShardId()).thenReturn("shard1");
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
index 7b5a9b8a0f5..07d829b2718 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
@@ -49,7 +49,7 @@ public class CloudHttp2SolrClientRetryTest extends 
SolrCloudTestCase {
   public void testRetry() throws Exception {
     String collectionName = "testRetry";
     String prometheusMetric =
-        
"solr_core_requests_total{category=\"UPDATE\",collection=\"testRetry\",core=\"testRetry_shard1_replica_n1\",handler=\"/update\",otel_scope_name=\"org.apache.solr\",replica=\"replica_n1\",shard=\"shard1\"}";
+        
"solr_core_requests_total{category=\"UPDATE\",collection=\"testRetry\",core=\"testRetry_shard1_replica_n1\",handler=\"/update\",otel_scope_name=\"org.apache.solr\",replica_type=\"NRT\",shard=\"shard1\"}";
     try (CloudSolrClient solrClient =
         new CloudHttp2SolrClient.Builder(
                 
Collections.singletonList(cluster.getZkServer().getZkAddress()), 
Optional.empty())
diff --git 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRetryTest.java
 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRetryTest.java
index 1bf8c9135cf..19c182485ab 100644
--- 
a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRetryTest.java
+++ 
b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRetryTest.java
@@ -49,7 +49,7 @@ public class CloudSolrClientRetryTest extends 
SolrCloudTestCase {
     CloudSolrClient solrClient = cluster.getSolrClient();
     CollectionAdminRequest.createCollection(collectionName, 1, 
1).process(solrClient);
     String prometheusMetric =
-        
"solr_core_requests_total{category=\"UPDATE\",collection=\"testRetry\",core=\"testRetry_shard1_replica_n1\",handler=\"/update\",otel_scope_name=\"org.apache.solr\",replica=\"replica_n1\",shard=\"shard1\"}";
+        
"solr_core_requests_total{category=\"UPDATE\",collection=\"testRetry\",core=\"testRetry_shard1_replica_n1\",handler=\"/update\",otel_scope_name=\"org.apache.solr\",replica_type=\"NRT\",shard=\"shard1\"}";
     solrClient.add(collectionName, new SolrInputDocument("id", "1"));
 
     assertEquals(1.0, getPrometheusMetricValue(solrClient, prometheusMetric), 
0.0);
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 1fb3b0082cf..6bd14012567 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
@@ -33,7 +33,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import org.apache.lucene.tests.util.TestUtil;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrInfoBean;
@@ -193,9 +192,8 @@ public final class SolrMetricTestUtils {
         .label("shard", 
core.getCoreDescriptor().getCloudDescriptor().getShardId())
         .label("core", core.getName())
         .label(
-            "replica",
-            Utils.parseMetricsReplicaName(
-                core.getCoreDescriptor().getCollectionName(), core.getName()))
+            "replica_type",
+            
core.getCoreDescriptor().getCloudDescriptor().getReplicaType().toString())
         .label("otel_scope_name", "org.apache.solr");
   }
 

Reply via email to