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

asf-gitbox-commits pushed a commit to branch branch_10_1
in repository https://gitbox.apache.org/repos/asf/solr.git

commit 96eadd9d24731455df025e5197bbb9f84f806732
Author: David Smiley <[email protected]>
AuthorDate: Wed Oct 7 14:38:41 2026 -0400

    SOLR-18124: Trace index replication with a span (#4963)
    
    Co-authored-by: Claude Opus 5.5 <[email protected]>
    (cherry picked from commit 6d6504668e3cac77f74d6ad2b2b20754de1c3bec)
    (cherry picked from commit b20293b157365b096e96e91ec85e313fb67b5b59)
---
 .../java/org/apache/solr/handler/IndexFetcher.java |  8 ++++++++
 .../apache/solr/handler/ReplicationHandler.java    | 24 +++++++++++++++++++++-
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java 
b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
index b6fa1146959..2652f2add4c 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -37,6 +37,7 @@ import static 
org.apache.solr.handler.admin.api.ReplicationAPIBase.FILE_STREAM;
 import static org.apache.solr.handler.admin.api.ReplicationAPIBase.GENERATION;
 import static org.apache.solr.handler.admin.api.ReplicationAPIBase.OFFSET;
 
+import io.opentelemetry.api.trace.Span;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -499,6 +500,9 @@ public class IndexFetcher {
 
       log.info("Leader's generation: {}", latestGeneration);
       log.info("Leader's version: {}", latestVersion);
+      Span.current()
+          .setAttribute("replication.leader", leaderCoreUrl)
+          .setAttribute("replication.leaderGeneration", latestGeneration);
 
       // TODO: make sure that getLatestCommit only returns commit points for 
the main index (i.e. no
       // side-car indexes)
@@ -576,6 +580,7 @@ public class IndexFetcher {
       if (log.isInfoEnabled()) {
         log.info("Number of files in latest index in leader: {}", 
filesToDownload.size());
       }
+      Span.current().setAttribute("replication.leaderFiles", 
filesToDownload.size());
 
       // Create the sync service
       fsyncService =
@@ -687,6 +692,9 @@ public class IndexFetcher {
               timeTakenSeconds,
               bytesDownloadedPerSecond,
               tmpIndexDir);
+          Span.current()
+              .setAttribute("replication.fullCopy", isFullCopyNeeded)
+              .setAttribute("replication.bytesDownloaded", bytesDownloaded);
 
           Collection<Map<String, Object>> modifiedConfFiles =
               getModifiedConfFiles(confFilesToDownload);
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 ddd9793932b..6278a33fbfb 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -33,6 +33,8 @@ import static 
org.apache.solr.handler.admin.api.ReplicationAPIBase.TLOG_FILE;
 import io.opentelemetry.api.common.Attributes;
 import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
 import io.opentelemetry.api.metrics.ObservableLongMeasurement;
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.StatusCode;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -115,6 +117,7 @@ import org.apache.solr.util.NumberUtils;
 import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.apache.solr.util.stats.MetricUtils;
+import org.apache.solr.util.tracing.TraceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
@@ -497,9 +500,28 @@ public class ReplicationHandler extends RequestHandlerBase
 
   private volatile IndexFetcher currentIndexFetcher;
 
+  public IndexFetchResult doFetch(SolrParams solrParams, boolean 
forceReplication) {
+    final Span span = 
TraceUtils.getGlobalTracer().spanBuilder("replication").startSpan();
+    TraceUtils.setDbInstance(span, core.getName());
+    try (var scope = span.makeCurrent()) {
+      assert scope != null; // prevent javac warning about scope being unused
+      IndexFetchResult result = doFetchInternal(solrParams, forceReplication);
+      span.setAttribute("replication.result", result.getMessage());
+      if (!result.getSuccessful()) {
+        span.setStatus(StatusCode.ERROR);
+      }
+      if (result.getException() != null) {
+        span.recordException(result.getException());
+      }
+      return result;
+    } finally {
+      span.end();
+    }
+  }
+
   @SuppressWarnings(
       "ReferenceEquality") // detecting the shared pollingIndexFetcher vs. a 
one-off, by identity
-  public IndexFetchResult doFetch(SolrParams solrParams, boolean 
forceReplication) {
+  private IndexFetchResult doFetchInternal(SolrParams solrParams, boolean 
forceReplication) {
     String leaderUrl = solrParams.get(LEADER_URL, null);
     if (!indexFetchLock.tryLock()) return IndexFetchResult.LOCK_OBTAIN_FAILED;
     if (core.getCoreContainer().isShutDown()) {

Reply via email to