From 3ab9b79e5ea070ba35a5b2cc2f1ab15e181dfec7 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:39:53 +0000 Subject: [PATCH 1/8] feat(replay): Record segment names Co-Authored-By: Gino Buenaflor --- .../android/replay/ReplayIntegration.kt | 7 +++ .../replay/capture/BaseCaptureStrategy.kt | 36 ++++++++----- .../android/replay/capture/CaptureStrategy.kt | 6 +++ .../capture/SessionCaptureStrategyTest.kt | 54 +++++++++++++++++++ .../java/io/sentry/NoOpReplayController.java | 3 ++ .../main/java/io/sentry/ReplayController.java | 3 ++ .../src/main/java/io/sentry/SentryClient.java | 4 ++ .../java/io/sentry/SentryReplayEvent.java | 25 ++++++++- .../test/java/io/sentry/SentryClientTest.kt | 19 +++++++ .../SentryReplayEventSerializationTest.kt | 1 + .../resources/json/sentry_replay_event.json | 4 ++ 11 files changed, 147 insertions(+), 15 deletions(-) diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt index bae0e411795..d9cd15d891a 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/ReplayIntegration.kt @@ -297,6 +297,13 @@ public class ReplayIntegration( captureStrategy?.registerTraceId(traceId) } + override fun registerSegmentName(segmentName: String) { + if (!isEnabled.get() || !isRecording()) { + return + } + captureStrategy?.registerSegmentName(segmentName) + } + private fun pauseInternal() { lifecycleLock.acquire().use { if (!isEnabled.get() || !lifecycle.isAllowed(PAUSED)) { diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BaseCaptureStrategy.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BaseCaptureStrategy.kt index fbc0ccfd4bc..f505d21a151 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BaseCaptureStrategy.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/BaseCaptureStrategy.kt @@ -54,7 +54,7 @@ internal abstract class BaseCaptureStrategy( internal companion object { private const val TAG = "CaptureStrategy" // https://github.com/getsentry/sentry-javascript/blob/30eb68fff5077211c30c61ba74625e66ab514870/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts#L41 - private const val MAX_TRACE_IDS = 100 + private const val MAX_CONTEXT_VALUES = 100 } private val gestureConverter = ReplayGestureConverter(dateProvider) @@ -97,8 +97,9 @@ internal abstract class BaseCaptureStrategy( persistableAtomic(initialValue = false, propertyName = SEGMENT_KEY_FLUSHED) protected val currentEvents: Deque = ConcurrentLinkedDeque() - private val traceIdsLock = Any() - private val currentTraceIds: MutableList = mutableListOf() + private val replayContextLock = Any() + private val currentTraceIds: MutableSet = linkedSetOf() + private val currentSegmentNames: MutableSet = linkedSetOf() override fun start(segmentId: Int, replayId: SentryId, replayType: ReplayType?) { cache = replayCacheProvider?.invoke(replayId) ?: ReplayCache(options, replayId) @@ -139,11 +140,12 @@ internal abstract class BaseCaptureStrategy( breadcrumbs: List? = null, events: Deque = this.currentEvents, ): ReplaySegment { - val traceIds = - synchronized(traceIdsLock) { - val ids = currentTraceIds.toList() + val (traceIds, segmentNames) = + synchronized(replayContextLock) { + val context = currentTraceIds.toList() to currentSegmentNames.toList() currentTraceIds.clear() - ids + currentSegmentNames.clear() + context } return createSegment( scopes, @@ -162,6 +164,7 @@ internal abstract class BaseCaptureStrategy( breadcrumbs, events, traceIds, + segmentNames, ) } @@ -180,12 +183,19 @@ internal abstract class BaseCaptureStrategy( override fun registerTraceId(traceId: SentryId) { if (traceId != SentryId.EMPTY_ID) { - synchronized(traceIdsLock) { - if (currentTraceIds.size < MAX_TRACE_IDS) { - val id = traceId.toString() - if (!currentTraceIds.contains(id)) { - currentTraceIds.add(id) - } + synchronized(replayContextLock) { + if (currentTraceIds.size < MAX_CONTEXT_VALUES) { + currentTraceIds.add(traceId.toString()) + } + } + } + } + + override fun registerSegmentName(segmentName: String) { + if (segmentName.isNotEmpty()) { + synchronized(replayContextLock) { + if (currentSegmentNames.size < MAX_CONTEXT_VALUES) { + currentSegmentNames.add(segmentName) } } } diff --git a/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/CaptureStrategy.kt b/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/CaptureStrategy.kt index 096a93741b2..780cdd92481 100644 --- a/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/CaptureStrategy.kt +++ b/sentry-android-replay/src/main/java/io/sentry/android/replay/capture/CaptureStrategy.kt @@ -56,6 +56,8 @@ internal interface CaptureStrategy { fun registerTraceId(traceId: SentryId) + fun registerSegmentName(segmentName: String) + companion object { private fun Breadcrumb?.isNetworkAvailable(): Boolean = this != null && @@ -88,6 +90,7 @@ internal interface CaptureStrategy { breadcrumbs: List?, events: Deque, traceIds: List = emptyList(), + segmentNames: List = emptyList(), ): ReplaySegment { val generatedVideo = cache?.createVideoOf( @@ -127,6 +130,7 @@ internal interface CaptureStrategy { replayBreadcrumbs, events, traceIds, + segmentNames, ) } @@ -147,6 +151,7 @@ internal interface CaptureStrategy { breadcrumbs: List, events: Deque, traceIds: List, + segmentNames: List, ): ReplaySegment { val endTimestamp = DateUtils.getDateTime(segmentTimestamp.time + videoDuration) val replay = @@ -159,6 +164,7 @@ internal interface CaptureStrategy { this.replayType = replayType this.videoFile = video this.traceIds = traceIds + this.segmentNames = segmentNames } val recordingPayload = mutableListOf() diff --git a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt index dd9e6c6ce1d..30d4bbd468d 100644 --- a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt +++ b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt @@ -562,4 +562,58 @@ class SessionCaptureStrategyTest { any(), ) } + @Test + fun `registerSegmentName includes unique segment names in next segment and clears them`() { + val now = + System.currentTimeMillis() + (fixture.options.sessionReplay.sessionSegmentDuration * 5) + val strategy = fixture.getSut(dateProvider = { now }) + strategy.start() + strategy.onConfigurationChanged(fixture.recorderConfig) + + strategy.registerSegmentName("GET /users/:id") + strategy.registerSegmentName("GET /users/:id") + strategy.registerSegmentName("POST /items") + + strategy.onScreenshotRecorded(mock()) {} + + verify(fixture.scopes) + .captureReplay( + argThat { event -> + event is SentryReplayEvent && + event.segmentNames == listOf("GET /users/:id", "POST /items") + }, + any(), + ) + + strategy.onScreenshotRecorded(mock()) {} + + verify(fixture.scopes) + .captureReplay( + argThat { event -> + event is SentryReplayEvent && event.segmentId == 1 && event.segmentNames.isNullOrEmpty() + }, + any(), + ) + } + + @Test + fun `registerSegmentName ignores empty names and limits names to 100`() { + val now = + System.currentTimeMillis() + (fixture.options.sessionReplay.sessionSegmentDuration * 5) + val strategy = fixture.getSut(dateProvider = { now }) + strategy.start() + strategy.onConfigurationChanged(fixture.recorderConfig) + + strategy.registerSegmentName("") + repeat(101) { strategy.registerSegmentName("segment-$it") } + + strategy.onScreenshotRecorded(mock()) {} + + verify(fixture.scopes) + .captureReplay( + argThat { event -> event is SentryReplayEvent && event.segmentNames?.size == 100 }, + any(), + ) + } + } diff --git a/sentry/src/main/java/io/sentry/NoOpReplayController.java b/sentry/src/main/java/io/sentry/NoOpReplayController.java index 2f6de9740d2..2b8a09cb1d9 100644 --- a/sentry/src/main/java/io/sentry/NoOpReplayController.java +++ b/sentry/src/main/java/io/sentry/NoOpReplayController.java @@ -60,4 +60,7 @@ public void disableDebugMaskingOverlay() {} @Override public void registerTraceId(@NotNull SentryId traceId) {} + + @Override + public void registerSegmentName(@NotNull String segmentName) {} } diff --git a/sentry/src/main/java/io/sentry/ReplayController.java b/sentry/src/main/java/io/sentry/ReplayController.java index f4baba40c9d..2fb7b1c83a5 100644 --- a/sentry/src/main/java/io/sentry/ReplayController.java +++ b/sentry/src/main/java/io/sentry/ReplayController.java @@ -36,4 +36,7 @@ public interface ReplayController extends IReplayApi { * @param traceId the trace ID to associate with the current replay */ void registerTraceId(@NotNull SentryId traceId); + + /** Registers a segment name to be associated with the current replay segment. */ + void registerSegmentName(@NotNull String segmentName); } diff --git a/sentry/src/main/java/io/sentry/SentryClient.java b/sentry/src/main/java/io/sentry/SentryClient.java index 4889d1629ce..a0ff98a9af7 100644 --- a/sentry/src/main/java/io/sentry/SentryClient.java +++ b/sentry/src/main/java/io/sentry/SentryClient.java @@ -1079,6 +1079,10 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint if (trace != null) { options.getReplayController().registerTraceId(trace.getTraceId()); } + final @Nullable String segmentName = transaction.getTransaction(); + if (segmentName != null && !segmentName.isEmpty()) { + options.getReplayController().registerSegmentName(segmentName); + } } return sentryId; diff --git a/sentry/src/main/java/io/sentry/SentryReplayEvent.java b/sentry/src/main/java/io/sentry/SentryReplayEvent.java index 95623d2ff62..061a8c05948 100644 --- a/sentry/src/main/java/io/sentry/SentryReplayEvent.java +++ b/sentry/src/main/java/io/sentry/SentryReplayEvent.java @@ -49,6 +49,7 @@ public static final class Deserializer implements JsonDeserializer { private @Nullable List urls; private @Nullable List errorIds; private @Nullable List traceIds; + private @Nullable List segmentNames; private @Nullable Map unknown; public SentryReplayEvent() { @@ -58,6 +59,7 @@ public SentryReplayEvent() { this.replayType = ReplayType.SESSION; this.errorIds = new ArrayList<>(); this.traceIds = new ArrayList<>(); + this.segmentNames = new ArrayList<>(); this.urls = new ArrayList<>(); timestamp = DateUtils.getCurrentDateTime(); } @@ -142,6 +144,15 @@ public void setTraceIds(final @Nullable List traceIds) { this.traceIds = traceIds; } + @Nullable + public List getSegmentNames() { + return segmentNames; + } + + public void setSegmentNames(final @Nullable List segmentNames) { + this.segmentNames = segmentNames; + } + @NotNull public ReplayType getReplayType() { return replayType; @@ -162,12 +173,13 @@ public boolean equals(Object o) { && Objects.equals(replayId, that.replayId) && Objects.equals(urls, that.urls) && Objects.equals(errorIds, that.errorIds) - && Objects.equals(traceIds, that.traceIds); + && Objects.equals(traceIds, that.traceIds) + && Objects.equals(segmentNames, that.segmentNames); } @Override public int hashCode() { - return Objects.hash(type, replayType, replayId, segmentId, urls, errorIds, traceIds); + return Objects.hash(type, replayType, replayId, segmentId, urls, errorIds, traceIds, segmentNames); } // region json @@ -181,6 +193,7 @@ public static final class JsonKeys { public static final String URLS = "urls"; public static final String ERROR_IDS = "error_ids"; public static final String TRACE_IDS = "trace_ids"; + public static final String SEGMENT_NAMES = "segment_names"; } @Override @@ -207,6 +220,9 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger if (traceIds != null) { writer.name(JsonKeys.TRACE_IDS).value(logger, traceIds); } + if (segmentNames != null) { + writer.name(JsonKeys.SEGMENT_NAMES).value(logger, segmentNames); + } new SentryBaseEvent.Serializer().serialize(this, writer, logger); @@ -250,6 +266,7 @@ public static final class Deserializer implements JsonDeserializer urls = null; @Nullable List errorIds = null; @Nullable List traceIds = null; + @Nullable List segmentNames = null; reader.beginObject(); while (reader.peek() == JsonToken.NAME) { @@ -282,6 +299,9 @@ public static final class Deserializer implements JsonDeserializer) reader.nextObjectOrNull(); break; + case JsonKeys.SEGMENT_NAMES: + segmentNames = (List) reader.nextObjectOrNull(); + break; default: if (!baseEventDeserializer.deserializeValue(replay, nextName, reader, logger)) { if (unknown == null) { @@ -311,6 +331,7 @@ public static final class Deserializer implements JsonDeserializer Date: Wed, 15 Jul 2026 10:41:45 +0000 Subject: [PATCH 2/8] docs: Add replay segment names changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17642fb819f..8e3fcf66c39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Features +- Session Replay: Record transaction segment names ([#5763](https://github.com/getsentry/sentry-java/pull/5763)) + - Add `io.sentry:sentry-opentelemetry-bom` to align Sentry OpenTelemetry modules with tested OpenTelemetry dependencies ([#5629](https://github.com/getsentry/sentry-java/pull/5629)) - Spring Boot Gradle plugin: add the Sentry BOM to `dependencyManagement`; explicit imports are applied after Spring Boot's implicit BOM ```kotlin From 3b7615af70610c9cb7b77a1b6f0b9817e90f8fec Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 15 Jul 2026 10:43:42 +0000 Subject: [PATCH 3/8] Format code --- .../android/replay/capture/SessionCaptureStrategyTest.kt | 2 +- sentry/src/main/java/io/sentry/SentryReplayEvent.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt index 30d4bbd468d..886992a557d 100644 --- a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt +++ b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt @@ -562,6 +562,7 @@ class SessionCaptureStrategyTest { any(), ) } + @Test fun `registerSegmentName includes unique segment names in next segment and clears them`() { val now = @@ -615,5 +616,4 @@ class SessionCaptureStrategyTest { any(), ) } - } diff --git a/sentry/src/main/java/io/sentry/SentryReplayEvent.java b/sentry/src/main/java/io/sentry/SentryReplayEvent.java index 061a8c05948..0ed9dbf72f3 100644 --- a/sentry/src/main/java/io/sentry/SentryReplayEvent.java +++ b/sentry/src/main/java/io/sentry/SentryReplayEvent.java @@ -179,7 +179,8 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(type, replayType, replayId, segmentId, urls, errorIds, traceIds, segmentNames); + return Objects.hash( + type, replayType, replayId, segmentId, urls, errorIds, traceIds, segmentNames); } // region json From a4c30cbfe488ec380ccddeee99902be1e004a254 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:45:16 +0000 Subject: [PATCH 4/8] test(replay): Use realistic Android transaction name Co-Authored-By: Gino Buenaflor --- .../io/sentry/protocol/SentryReplayEventSerializationTest.kt | 2 +- sentry/src/test/resources/json/sentry_replay_event.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/src/test/java/io/sentry/protocol/SentryReplayEventSerializationTest.kt b/sentry/src/test/java/io/sentry/protocol/SentryReplayEventSerializationTest.kt index b18fae31e0c..fabf2e03e93 100644 --- a/sentry/src/test/java/io/sentry/protocol/SentryReplayEventSerializationTest.kt +++ b/sentry/src/test/java/io/sentry/protocol/SentryReplayEventSerializationTest.kt @@ -26,7 +26,7 @@ class SentryReplayEventSerializationTest { urls = listOf("ScreenOne") errorIds = listOf("ab3a347a4cc14fd4b4cf1dc56b670c5b") traceIds = listOf("340cfef948204549ac07c3b353c81c50") - segmentNames = listOf("GET /users/:id") + segmentNames = listOf("CheckoutActivity") SentryBaseEventSerializationTest.Fixture().update(this) // irrelevant for replay serverName = null diff --git a/sentry/src/test/resources/json/sentry_replay_event.json b/sentry/src/test/resources/json/sentry_replay_event.json index 063f05fa591..29bcca85aea 100644 --- a/sentry/src/test/resources/json/sentry_replay_event.json +++ b/sentry/src/test/resources/json/sentry_replay_event.json @@ -19,7 +19,7 @@ ], "segment_names": [ - "GET /users/:id" + "CheckoutActivity" ], "event_id": "afcb46b1140ade5187c4bbb5daa804df", "contexts": From fc591026147adbacb6488d78498e0c99ea836c30 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 10:51:36 +0000 Subject: [PATCH 5/8] build: Update replay API dumps --- sentry-android-replay/api/sentry-android-replay.api | 1 + sentry/api/sentry.api | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/sentry-android-replay/api/sentry-android-replay.api b/sentry-android-replay/api/sentry-android-replay.api index 12fe214176d..3efee26e37d 100644 --- a/sentry-android-replay/api/sentry-android-replay.api +++ b/sentry-android-replay/api/sentry-android-replay.api @@ -76,6 +76,7 @@ public final class io/sentry/android/replay/ReplayIntegration : io/sentry/IConne public fun onWindowSizeChanged (II)V public fun pause ()V public fun register (Lio/sentry/IScopes;Lio/sentry/SentryOptions;)V + public fun registerSegmentName (Ljava/lang/String;)V public fun registerTraceId (Lio/sentry/protocol/SentryId;)V public fun resume ()V public fun setBreadcrumbConverter (Lio/sentry/ReplayBreadcrumbConverter;)V diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index e0bf144178f..0e5aad4826b 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -1715,6 +1715,7 @@ public final class io/sentry/NoOpReplayController : io/sentry/ReplayController { public fun isDebugMaskingOverlayEnabled ()Z public fun isRecording ()Z public fun pause ()V + public fun registerSegmentName (Ljava/lang/String;)V public fun registerTraceId (Lio/sentry/protocol/SentryId;)V public fun resume ()V public fun setBreadcrumbConverter (Lio/sentry/ReplayBreadcrumbConverter;)V @@ -2357,6 +2358,7 @@ public abstract interface class io/sentry/ReplayController : io/sentry/IReplayAp public abstract fun isDebugMaskingOverlayEnabled ()Z public abstract fun isRecording ()Z public abstract fun pause ()V + public abstract fun registerSegmentName (Ljava/lang/String;)V public abstract fun registerTraceId (Lio/sentry/protocol/SentryId;)V public abstract fun resume ()V public abstract fun setBreadcrumbConverter (Lio/sentry/ReplayBreadcrumbConverter;)V @@ -4023,6 +4025,7 @@ public final class io/sentry/SentryReplayEvent : io/sentry/SentryBaseEvent, io/s public fun getReplayStartTimestamp ()Ljava/util/Date; public fun getReplayType ()Lio/sentry/SentryReplayEvent$ReplayType; public fun getSegmentId ()I + public fun getSegmentNames ()Ljava/util/List; public fun getTimestamp ()Ljava/util/Date; public fun getTraceIds ()Ljava/util/List; public fun getType ()Ljava/lang/String; @@ -4036,6 +4039,7 @@ public final class io/sentry/SentryReplayEvent : io/sentry/SentryBaseEvent, io/s public fun setReplayStartTimestamp (Ljava/util/Date;)V public fun setReplayType (Lio/sentry/SentryReplayEvent$ReplayType;)V public fun setSegmentId (I)V + public fun setSegmentNames (Ljava/util/List;)V public fun setTimestamp (Ljava/util/Date;)V public fun setTraceIds (Ljava/util/List;)V public fun setType (Ljava/lang/String;)V @@ -4056,6 +4060,7 @@ public final class io/sentry/SentryReplayEvent$JsonKeys { public static final field REPLAY_START_TIMESTAMP Ljava/lang/String; public static final field REPLAY_TYPE Ljava/lang/String; public static final field SEGMENT_ID Ljava/lang/String; + public static final field SEGMENT_NAMES Ljava/lang/String; public static final field TIMESTAMP Ljava/lang/String; public static final field TRACE_IDS Ljava/lang/String; public static final field TYPE Ljava/lang/String; From db52863dcfe16b1d541514cfe49d35282020885f Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Wed, 15 Jul 2026 11:22:16 +0000 Subject: [PATCH 6/8] test(replay): Use realistic Android segment names Co-Authored-By: Gino Buenaflor --- .../replay/capture/SessionCaptureStrategyTest.kt | 10 +++++----- sentry/src/test/java/io/sentry/SentryClientTest.kt | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt index 886992a557d..fc2354eb1c0 100644 --- a/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt +++ b/sentry-android-replay/src/test/java/io/sentry/android/replay/capture/SessionCaptureStrategyTest.kt @@ -571,9 +571,9 @@ class SessionCaptureStrategyTest { strategy.start() strategy.onConfigurationChanged(fixture.recorderConfig) - strategy.registerSegmentName("GET /users/:id") - strategy.registerSegmentName("GET /users/:id") - strategy.registerSegmentName("POST /items") + strategy.registerSegmentName("CheckoutActivity") + strategy.registerSegmentName("CheckoutActivity") + strategy.registerSegmentName("ProductDetailsActivity") strategy.onScreenshotRecorded(mock()) {} @@ -581,7 +581,7 @@ class SessionCaptureStrategyTest { .captureReplay( argThat { event -> event is SentryReplayEvent && - event.segmentNames == listOf("GET /users/:id", "POST /items") + event.segmentNames == listOf("CheckoutActivity", "ProductDetailsActivity") }, any(), ) @@ -606,7 +606,7 @@ class SessionCaptureStrategyTest { strategy.onConfigurationChanged(fixture.recorderConfig) strategy.registerSegmentName("") - repeat(101) { strategy.registerSegmentName("segment-$it") } + repeat(101) { strategy.registerSegmentName("ProductActivity$it") } strategy.onScreenshotRecorded(mock()) {} diff --git a/sentry/src/test/java/io/sentry/SentryClientTest.kt b/sentry/src/test/java/io/sentry/SentryClientTest.kt index 174aa100878..9feb58464d4 100644 --- a/sentry/src/test/java/io/sentry/SentryClientTest.kt +++ b/sentry/src/test/java/io/sentry/SentryClientTest.kt @@ -2152,10 +2152,10 @@ class SentryClientTest { } ) val sut = fixture.getSut() - val sentryTracer = SentryTracer(TransactionContext("GET /users/:id", "op"), fixture.scopes) + val sentryTracer = SentryTracer(TransactionContext("CheckoutActivity", "ui.load"), fixture.scopes) val transaction = SentryTransaction(sentryTracer) sut.captureTransaction(transaction, sentryTracer.traceContext()) - assertEquals("GET /users/:id", registeredSegmentName) + assertEquals("CheckoutActivity", registeredSegmentName) } @Test From d89d1a9bffe5ff73beeb9a5c0ba0578b9c0cf9e2 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 15 Jul 2026 11:25:13 +0000 Subject: [PATCH 7/8] Format code --- sentry/src/test/java/io/sentry/SentryClientTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/src/test/java/io/sentry/SentryClientTest.kt b/sentry/src/test/java/io/sentry/SentryClientTest.kt index 9feb58464d4..5cfa4b6b619 100644 --- a/sentry/src/test/java/io/sentry/SentryClientTest.kt +++ b/sentry/src/test/java/io/sentry/SentryClientTest.kt @@ -2152,7 +2152,8 @@ class SentryClientTest { } ) val sut = fixture.getSut() - val sentryTracer = SentryTracer(TransactionContext("CheckoutActivity", "ui.load"), fixture.scopes) + val sentryTracer = + SentryTracer(TransactionContext("CheckoutActivity", "ui.load"), fixture.scopes) val transaction = SentryTransaction(sentryTracer) sut.captureTransaction(transaction, sentryTracer.traceContext()) assertEquals("CheckoutActivity", registeredSegmentName) From 10acd25946e3fe9aa859cfc2613bcdbf775b46d3 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 15 Jul 2026 13:36:58 +0200 Subject: [PATCH 8/8] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e3fcf66c39..cdc3e33452b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### Features -- Session Replay: Record transaction segment names ([#5763](https://github.com/getsentry/sentry-java/pull/5763)) +- Session Replay: Record segment names (transaction names) ([#5763](https://github.com/getsentry/sentry-java/pull/5763)) - Add `io.sentry:sentry-opentelemetry-bom` to align Sentry OpenTelemetry modules with tested OpenTelemetry dependencies ([#5629](https://github.com/getsentry/sentry-java/pull/5629)) - Spring Boot Gradle plugin: add the Sentry BOM to `dependencyManagement`; explicit imports are applied after Spring Boot's implicit BOM