From c233756b0f966a6c9f27a001049be9b180520503 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 14:30:06 +0100 Subject: [PATCH 01/26] added option to disable trace ID generation --- .../android/core/ActivityLifecycleIntegration.java | 8 ++++---- .../android/core/ManifestMetadataReader.java | 5 +++++ .../sentry/android/core/SentryAndroidOptions.java | 14 ++++++++++++++ .../internal/gestures/SentryGestureListener.java | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java index 3c0d8b3a5c7..4d63cbbe287 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java @@ -159,10 +159,7 @@ private void stopPreviousTransactions() { private void startTracing(final @NotNull Activity activity) { WeakReference weakActivity = new WeakReference<>(activity); if (scopes != null && !isRunningTransactionOrTrace(activity)) { - if (!performanceEnabled) { - activitiesWithOngoingTransactions.put(activity, NoOpTransaction.getInstance()); - TracingUtils.startNewTrace(scopes); - } else { + if (performanceEnabled) { // as we allow a single transaction running on the bound Scope, we finish the previous ones stopPreviousTransactions(); @@ -301,6 +298,9 @@ private void startTracing(final @NotNull Activity activity) { }); activitiesWithOngoingTransactions.put(activity, transaction); + } else if (options.isEnableAutoTraceIdGeneration()) { + activitiesWithOngoingTransactions.put(activity, NoOpTransaction.getInstance()); + TracingUtils.startNewTrace(scopes); } } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index e2389e60492..845f0944705 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -107,6 +107,8 @@ final class ManifestMetadataReader { static final String IGNORED_ERRORS = "io.sentry.ignored-errors"; + static final String ENABLE_AUTO_TRACE_ID_GENERATION = "io.sentry.enable-trace-update"; + /** ManifestMetadataReader ctor */ private ManifestMetadataReader() {} @@ -380,6 +382,9 @@ static void applyMetadata( readBool( metadata, logger, ENABLE_SCOPE_PERSISTENCE, options.isEnableScopePersistence())); + options.setEnableAutoTraceIdGeneration( + readBool(metadata, logger, ENABLE_AUTO_TRACE_ID_GENERATION, options.isAttachScreenshot())); + if (options.getSessionReplay().getSessionSampleRate() == null) { final Double sessionSampleRate = readDouble(metadata, logger, REPLAYS_SESSION_SAMPLE_RATE); diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 9c32920be89..c41205c8a25 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -166,6 +166,11 @@ public final class SentryAndroidOptions extends SentryOptions { */ private boolean enableScopeSync = true; + /** Whether to enable automatic trace ID generation. This is mainly used by the Hybrid SDKs to + * control the trace ID generation from the outside. + */ + private boolean enableAutoTraceIdGeneration = true; + public interface BeforeCaptureCallback { /** @@ -594,4 +599,13 @@ public void setFrameMetricsCollector( final @Nullable SentryFrameMetricsCollector frameMetricsCollector) { this.frameMetricsCollector = frameMetricsCollector; } + + + public boolean isEnableAutoTraceIdGeneration() { + return enableAutoTraceIdGeneration; + } + + public void setEnableAutoTraceIdGeneration(final boolean enableAutoTraceIdGeneration) { + this.enableAutoTraceIdGeneration = enableAutoTraceIdGeneration; + } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java index cd80f5ced7d..b1b9597efc2 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java @@ -201,7 +201,7 @@ private void startTracing(final @NotNull UiElement target, final @NotNull Gestur final boolean isNewInteraction = isClickGesture || !isNewGestureSameAsActive; if (!(options.isTracingEnabled() && options.isEnableUserInteractionTracing())) { - if (isNewInteraction) { + if (options.isEnableAutoTraceIdGeneration() && isNewInteraction) { TracingUtils.startNewTrace(scopes); activeUiElement = target; activeEventType = eventType; From d0f9805695c4de745dc09be5dcd4b8d7f0ca93c6 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 15:00:58 +0100 Subject: [PATCH 02/26] rename. recheck --- .../android/core/ActivityLifecycleIntegration.java | 10 ++++++---- .../io/sentry/android/core/ManifestMetadataReader.java | 2 +- .../io/sentry/android/core/SentryAndroidOptions.java | 1 - .../core/internal/gestures/SentryGestureListener.java | 6 ++++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java index 4d63cbbe287..0bdfee71fd4 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ActivityLifecycleIntegration.java @@ -159,7 +159,12 @@ private void stopPreviousTransactions() { private void startTracing(final @NotNull Activity activity) { WeakReference weakActivity = new WeakReference<>(activity); if (scopes != null && !isRunningTransactionOrTrace(activity)) { - if (performanceEnabled) { + if (!performanceEnabled) { + activitiesWithOngoingTransactions.put(activity, NoOpTransaction.getInstance()); + if (options.isEnableAutoTraceIdGeneration()) { + TracingUtils.startNewTrace(scopes); + } + } else { // as we allow a single transaction running on the bound Scope, we finish the previous ones stopPreviousTransactions(); @@ -298,9 +303,6 @@ private void startTracing(final @NotNull Activity activity) { }); activitiesWithOngoingTransactions.put(activity, transaction); - } else if (options.isEnableAutoTraceIdGeneration()) { - activitiesWithOngoingTransactions.put(activity, NoOpTransaction.getInstance()); - TracingUtils.startNewTrace(scopes); } } } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index 845f0944705..bcac94ad7d3 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -107,7 +107,7 @@ final class ManifestMetadataReader { static final String IGNORED_ERRORS = "io.sentry.ignored-errors"; - static final String ENABLE_AUTO_TRACE_ID_GENERATION = "io.sentry.enable-trace-update"; + static final String ENABLE_AUTO_TRACE_ID_GENERATION = "io.sentry.enable-auto-trace-id-generation"; /** ManifestMetadataReader ctor */ private ManifestMetadataReader() {} diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index c41205c8a25..3f725a0b31a 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -600,7 +600,6 @@ public void setFrameMetricsCollector( this.frameMetricsCollector = frameMetricsCollector; } - public boolean isEnableAutoTraceIdGeneration() { return enableAutoTraceIdGeneration; } diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java index b1b9597efc2..ab90f82df41 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java @@ -201,8 +201,10 @@ private void startTracing(final @NotNull UiElement target, final @NotNull Gestur final boolean isNewInteraction = isClickGesture || !isNewGestureSameAsActive; if (!(options.isTracingEnabled() && options.isEnableUserInteractionTracing())) { - if (options.isEnableAutoTraceIdGeneration() && isNewInteraction) { - TracingUtils.startNewTrace(scopes); + if (isNewInteraction) { + if (options.isEnableAutoTraceIdGeneration()) { + TracingUtils.startNewTrace(scopes); + } activeUiElement = target; activeEventType = eventType; } From c124eb1a9d7d26d65560a64c500478c6fe20027b Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 15:29:42 +0100 Subject: [PATCH 03/26] LifeCycleIntegrationTest --- .../core/ActivityLifecycleIntegrationTest.kt | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt index a14f62c3f03..3d12d49f59d 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt @@ -1385,10 +1385,11 @@ class ActivityLifecycleIntegrationTest { } @Test - fun `starts new trace if performance is disabled`() { + fun `starts new trace if performance is disabled and trace ID generation is enabled`() { val sut = fixture.getSut() val activity = mock() fixture.options.tracesSampleRate = null + fixture.options.isEnableAutoTraceIdGeneration = true; val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java) val scope = Scope(fixture.options) @@ -1405,6 +1406,28 @@ class ActivityLifecycleIntegrationTest { assertNotSame(propagationContextAtStart, scope.propagationContext) } + @Test + fun `does not start a new trace if performance is disabled and trace ID generation is disabled`() { + val sut = fixture.getSut() + val activity = mock() + fixture.options.tracesSampleRate = null + fixture.options.isEnableAutoTraceIdGeneration = false; + + val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java) + val scope = Scope(fixture.options) + val propagationContextAtStart = scope.propagationContext + whenever(fixture.scopes.configureScope(argumentCaptor.capture())).thenAnswer { + argumentCaptor.value.run(scope) + } + + sut.register(fixture.scopes, fixture.options) + sut.onActivityCreated(activity, fixture.bundle) + + // once for the screen + verify(fixture.scopes).configureScope(any()) + assertSame(propagationContextAtStart, scope.propagationContext) + } + @Test fun `sets the activity as the current screen`() { val sut = fixture.getSut() From ac7be23eb7bf84715b780c44ef81f61d8c4d7693 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 15:54:02 +0100 Subject: [PATCH 04/26] GestureListener tests --- .../SentryGestureListenerTracingTest.kt | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt index 07dde15e8f1..4140b957929 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt @@ -24,7 +24,9 @@ import io.sentry.android.core.SentryAndroidOptions import io.sentry.protocol.SentryId import io.sentry.protocol.TransactionNameSource import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers import org.mockito.kotlin.any +import org.mockito.kotlin.argThat import org.mockito.kotlin.check import org.mockito.kotlin.clearInvocations import org.mockito.kotlin.doAnswer @@ -37,6 +39,7 @@ import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertNull +import kotlin.test.assertNotEquals class SentryGestureListenerTracingTest { class Fixture { @@ -59,12 +62,14 @@ class SentryGestureListenerTracingTest { hasViewIdInRes: Boolean = true, tracesSampleRate: Double? = 1.0, isEnableUserInteractionTracing: Boolean = true, - transaction: SentryTracer? = null + transaction: SentryTracer? = null, + isEnableAutoTraceIdGeneration: Boolean = true ): SentryGestureListener { options.tracesSampleRate = tracesSampleRate options.isEnableUserInteractionTracing = isEnableUserInteractionTracing options.isEnableUserInteractionBreadcrumbs = true options.gestureTargetLocators = listOf(AndroidViewGestureTargetLocator(true)) + options.isEnableAutoTraceIdGeneration = isEnableAutoTraceIdGeneration whenever(scopes.options).thenReturn(options) @@ -370,6 +375,34 @@ class SentryGestureListenerTracingTest { assertEquals(OUT_OF_RANGE, fixture.transaction.status) } + @Test + fun `when tracing is disabled and auto trace id generation is disabled, does not start a new trace`() { + val sut = fixture.getSut(tracesSampleRate = null, isEnableAutoTraceIdGeneration = false) + val scope = Scope(fixture.options) + + sut.onSingleTapUp(fixture.event) + + verify(fixture.scopes, never()).configureScope(any()) + } + + @Test + fun `when tracing is disabled and auto trace id generation is enabled, starts a new trace`() { + val sut = fixture.getSut(tracesSampleRate = null, isEnableAutoTraceIdGeneration = true) + val scope = Scope(fixture.options) + val initialPropagationContext = scope.propagationContext + + sut.onSingleTapUp(fixture.event) + + verify(fixture.scopes).configureScope( + check { callback -> + callback.run(scope) + // Verify that a new propagation context was set and it's different from the initial one + assertNotNull(scope.propagationContext) + assertNotEquals(initialPropagationContext, scope.propagationContext) + } + ) + } + internal open class ScrollableListView : AbsListView(mock()) { override fun getAdapter(): ListAdapter = mock() override fun setSelection(position: Int) = Unit From 46039a5bf39bffb4a023e1cdb27a4c7878e10411 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 16:16:57 +0100 Subject: [PATCH 05/26] spotless --- .../java/io/sentry/android/core/ManifestMetadataReader.java | 6 +++++- .../java/io/sentry/android/core/SentryAndroidOptions.java | 3 ++- .../sentry/android/core/ActivityLifecycleIntegrationTest.kt | 4 ++-- .../internal/gestures/SentryGestureListenerTracingTest.kt | 5 +---- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index bcac94ad7d3..571cc9548b0 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -383,7 +383,11 @@ static void applyMetadata( metadata, logger, ENABLE_SCOPE_PERSISTENCE, options.isEnableScopePersistence())); options.setEnableAutoTraceIdGeneration( - readBool(metadata, logger, ENABLE_AUTO_TRACE_ID_GENERATION, options.isAttachScreenshot())); + readBool( + metadata, + logger, + ENABLE_AUTO_TRACE_ID_GENERATION, + options.isEnableAutoTraceIdGeneration())); if (options.getSessionReplay().getSessionSampleRate() == null) { final Double sessionSampleRate = diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java index 3f725a0b31a..f9de207b7e3 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryAndroidOptions.java @@ -166,7 +166,8 @@ public final class SentryAndroidOptions extends SentryOptions { */ private boolean enableScopeSync = true; - /** Whether to enable automatic trace ID generation. This is mainly used by the Hybrid SDKs to + /** + * Whether to enable automatic trace ID generation. This is mainly used by the Hybrid SDKs to * control the trace ID generation from the outside. */ private boolean enableAutoTraceIdGeneration = true; diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt index 3d12d49f59d..317dbc843c2 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt @@ -1389,7 +1389,7 @@ class ActivityLifecycleIntegrationTest { val sut = fixture.getSut() val activity = mock() fixture.options.tracesSampleRate = null - fixture.options.isEnableAutoTraceIdGeneration = true; + fixture.options.isEnableAutoTraceIdGeneration = true val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java) val scope = Scope(fixture.options) @@ -1411,7 +1411,7 @@ class ActivityLifecycleIntegrationTest { val sut = fixture.getSut() val activity = mock() fixture.options.tracesSampleRate = null - fixture.options.isEnableAutoTraceIdGeneration = false; + fixture.options.isEnableAutoTraceIdGeneration = false val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java) val scope = Scope(fixture.options) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt index 4140b957929..c41a5151931 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/internal/gestures/SentryGestureListenerTracingTest.kt @@ -24,9 +24,7 @@ import io.sentry.android.core.SentryAndroidOptions import io.sentry.protocol.SentryId import io.sentry.protocol.TransactionNameSource import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers import org.mockito.kotlin.any -import org.mockito.kotlin.argThat import org.mockito.kotlin.check import org.mockito.kotlin.clearInvocations import org.mockito.kotlin.doAnswer @@ -37,9 +35,9 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertNotEquals import kotlin.test.assertNotNull import kotlin.test.assertNull -import kotlin.test.assertNotEquals class SentryGestureListenerTracingTest { class Fixture { @@ -378,7 +376,6 @@ class SentryGestureListenerTracingTest { @Test fun `when tracing is disabled and auto trace id generation is disabled, does not start a new trace`() { val sut = fixture.getSut(tracesSampleRate = null, isEnableAutoTraceIdGeneration = false) - val scope = Scope(fixture.options) sut.onSingleTapUp(fixture.event) From 14ab70e36344c22bbb82bdaa4415d6073a0433f6 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 16:24:51 +0100 Subject: [PATCH 06/26] apidump --- sentry-android-core/api/sentry-android-core.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index ff982b51f69..59caf171564 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -292,6 +292,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun isEnableAppComponentBreadcrumbs ()Z public fun isEnableAppLifecycleBreadcrumbs ()Z public fun isEnableAutoActivityLifecycleTracing ()Z + public fun isEnableAutoTraceIdGeneration ()Z public fun isEnableFramesTracking ()Z public fun isEnableNdk ()Z public fun isEnableNetworkEventBreadcrumbs ()Z @@ -315,6 +316,7 @@ public final class io/sentry/android/core/SentryAndroidOptions : io/sentry/Sentr public fun setEnableAppComponentBreadcrumbs (Z)V public fun setEnableAppLifecycleBreadcrumbs (Z)V public fun setEnableAutoActivityLifecycleTracing (Z)V + public fun setEnableAutoTraceIdGeneration (Z)V public fun setEnableFramesTracking (Z)V public fun setEnableNdk (Z)V public fun setEnableNetworkEventBreadcrumbs (Z)V From 4a94bdd179b8567602f45240ef44ca86f7e9ec2f Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 20 Feb 2025 16:36:00 +0100 Subject: [PATCH 07/26] Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9babf5adab..eb909e04542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - The `ignoredErrors` option is now configurable via the manifest property `io.sentry.traces.ignored-errors` ([#4178](https://github.com/getsentry/sentry-java/pull/4178)) - A list of active Spring profiles is attached to payloads sent to Sentry (errors, traces, etc.) and displayed in the UI when using our Spring or Spring Boot integrations ([#4147](https://github.com/getsentry/sentry-java/pull/4147)) - This consists of an empty list when only the default profile is active +- Added `enableTraceIdGeneration` to the AndroidOptions. This allows Hybrid SDKs to "freeze" and control the trace and connect errors on different layers of the application ([4188](https://github.com/getsentry/sentry-java/pull/4188)) ### Fixes From 461aa8a07616967c73c7788c96d43a10824d9f05 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Tue, 4 Feb 2025 19:17:18 +0100 Subject: [PATCH 08/26] sync trace as well --- .../sentry/android/ndk/NdkScopeObserver.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java index 118b1f68511..0bdf38ae559 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java @@ -2,11 +2,14 @@ import io.sentry.Breadcrumb; import io.sentry.DateUtils; +import io.sentry.IScope; import io.sentry.ScopeObserverAdapter; import io.sentry.SentryLevel; import io.sentry.SentryOptions; +import io.sentry.SpanContext; import io.sentry.ndk.INativeScope; import io.sentry.ndk.NativeScope; +import io.sentry.protocol.SentryId; import io.sentry.protocol.User; import io.sentry.util.Objects; import java.util.Locale; @@ -125,4 +128,24 @@ public void removeExtra(final @NotNull String key) { .log(SentryLevel.ERROR, e, "Scope sync removeExtra(%s) has an error.", key); } } + + @Override + public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) { + options.getLogger().log(SentryLevel.INFO, "Attempting to set the trace ID"); + + if(spanContext == null) { + return; + } + + @Nullable SentryId traceId = spanContext.getTraceId(); + String traceIdString = traceId.toString(); + + options.getLogger().log(SentryLevel.INFO, "Fetched trace ID '%s'.", traceIdString); + + try { + options.getExecutorService().submit(() -> nativeScope.setTraceId(traceIdString)); + } catch (Throwable e) { + options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId(%s) has an error.", traceIdString); + } + } } From b95088c98761a4d723d28d012f9363008574f77a Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 5 Feb 2025 12:51:19 +0100 Subject: [PATCH 09/26] passing span ID as well --- .../java/io/sentry/android/ndk/NdkScopeObserver.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java index 0bdf38ae559..a5eac55ec39 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java @@ -7,6 +7,7 @@ import io.sentry.SentryLevel; import io.sentry.SentryOptions; import io.sentry.SpanContext; +import io.sentry.SpanId; import io.sentry.ndk.INativeScope; import io.sentry.ndk.NativeScope; import io.sentry.protocol.SentryId; @@ -131,21 +132,14 @@ public void removeExtra(final @NotNull String key) { @Override public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) { - options.getLogger().log(SentryLevel.INFO, "Attempting to set the trace ID"); - if(spanContext == null) { return; } - @Nullable SentryId traceId = spanContext.getTraceId(); - String traceIdString = traceId.toString(); - - options.getLogger().log(SentryLevel.INFO, "Fetched trace ID '%s'.", traceIdString); - try { - options.getExecutorService().submit(() -> nativeScope.setTraceId(traceIdString)); + options.getExecutorService().submit(() -> nativeScope.setTraceId(spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); } catch (Throwable e) { - options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId(%s) has an error.", traceIdString); + options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId failed."); } } } From 19c0eaadc23382574e6355b9fd5cd0ec31f83201 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 5 Feb 2025 18:52:45 +0100 Subject: [PATCH 10/26] added API taking traceId and spanID --- sentry/src/main/java/io/sentry/HubAdapter.java | 6 ++++++ .../main/java/io/sentry/HubScopesWrapper.java | 6 ++++++ sentry/src/main/java/io/sentry/IScopes.java | 8 ++++++++ .../src/main/java/io/sentry/JsonSerializer.java | 4 ++-- sentry/src/main/java/io/sentry/NoOpHub.java | 4 ++++ sentry/src/main/java/io/sentry/NoOpScopes.java | 4 ++++ .../main/java/io/sentry/PropagationContext.java | 12 ++++++++++++ sentry/src/main/java/io/sentry/Scopes.java | 17 +---------------- .../src/main/java/io/sentry/ScopesAdapter.java | 6 ++++++ sentry/src/main/java/io/sentry/Sentry.java | 12 ++++++++++++ 10 files changed, 61 insertions(+), 18 deletions(-) diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index fc2f9c15dcd..5ef0ddf0aa6 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -322,6 +322,12 @@ public void reportFullyDisplayed() { return Sentry.continueTrace(sentryTrace, baggageHeaders); } + @Override + public void continueTrace( + final @NotNull String traceId, final @NotNull String spanId) { + Sentry.continueTrace(traceId, spanId); + } + @Override public @Nullable SentryTraceHeader getTraceparent() { return Sentry.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/HubScopesWrapper.java b/sentry/src/main/java/io/sentry/HubScopesWrapper.java index 591852a9adf..93bd26d452d 100644 --- a/sentry/src/main/java/io/sentry/HubScopesWrapper.java +++ b/sentry/src/main/java/io/sentry/HubScopesWrapper.java @@ -316,6 +316,12 @@ public void reportFullyDisplayed() { return scopes.continueTrace(sentryTrace, baggageHeaders); } + @Override + public void continueTrace( + @NotNull String traceId, @NotNull String spanId) { + scopes.continueTrace(traceId, spanId); + } + @Override public @Nullable SentryTraceHeader getTraceparent() { return scopes.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/IScopes.java b/sentry/src/main/java/io/sentry/IScopes.java index e07de9c327c..1d6850082bd 100644 --- a/sentry/src/main/java/io/sentry/IScopes.java +++ b/sentry/src/main/java/io/sentry/IScopes.java @@ -657,6 +657,14 @@ void setSpanContext( TransactionContext continueTrace( final @Nullable String sentryTrace, final @Nullable List baggageHeaders); + /** + * Continue a trace based on the trace ID and span ID provided + * + * @param traceId the trace ID + * @param spanId the span ID this is continuing the trace from + */ + void continueTrace(final @NotNull String traceId, final @NotNull String spanId); + /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in * <meta> HTML tags. Also see {@link IScopes#getBaggage()}. diff --git a/sentry/src/main/java/io/sentry/JsonSerializer.java b/sentry/src/main/java/io/sentry/JsonSerializer.java index 09773dc617c..89d81d8ff37 100644 --- a/sentry/src/main/java/io/sentry/JsonSerializer.java +++ b/sentry/src/main/java/io/sentry/JsonSerializer.java @@ -200,8 +200,8 @@ public void serialize(@NotNull T entity, @NotNull Writer writer) throws IOEx Objects.requireNonNull(writer, "The Writer object is required."); if (options.getLogger().isEnabled(SentryLevel.DEBUG)) { - String serialized = serializeToString(entity, options.isEnablePrettySerializationOutput()); - options.getLogger().log(SentryLevel.DEBUG, "Serializing object: %s", serialized); +// String serialized = serializeToString(entity, options.isEnablePrettySerializationOutput()); +// options.getLogger().log(SentryLevel.DEBUG, "Serializing object: %s", serialized); } JsonObjectWriter jsonObjectWriter = new JsonObjectWriter(writer, options.getMaxDepth()); jsonObjectWriter.value(options.getLogger(), entity); diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index d3e0b010c39..7d1f0f7ad19 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -276,6 +276,10 @@ public void reportFullyDisplayed() {} return null; } + @Override + public void continueTrace( + final @NotNull String traceID, final @NotNull String spanId) {} + @Override public @Nullable SentryTraceHeader getTraceparent() { return null; diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index 8255569387d..52d19a0c95d 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -271,6 +271,10 @@ public void reportFullyDisplayed() {} return null; } + @Override + public void continueTrace( + final @NotNull String traceId, final @NotNull String spanId) { } + @Override public @Nullable SentryTraceHeader getTraceparent() { return null; diff --git a/sentry/src/main/java/io/sentry/PropagationContext.java b/sentry/src/main/java/io/sentry/PropagationContext.java index 791cb1d3d36..f9e727d0d85 100644 --- a/sentry/src/main/java/io/sentry/PropagationContext.java +++ b/sentry/src/main/java/io/sentry/PropagationContext.java @@ -51,6 +51,18 @@ public static PropagationContext fromHeaders( sentryTraceHeader.isSampled()); } + public static @NotNull PropagationContext fromId( + final @NotNull String traceId, + final @NotNull String spanId) { + return new PropagationContext( + new SentryId(traceId), + new SpanId(), + new SpanId(spanId), + null, + null + ); + } + private @NotNull SentryId traceId; private @NotNull SpanId spanId; private @Nullable SpanId parentSpanId; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 14025a1d774..eda602d53d2 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -896,18 +896,6 @@ public void flush(long timeoutMillis) { return transaction; } - private @NotNull Double getSampleRand(final @NotNull TransactionContext transactionContext) { - final @Nullable Baggage baggage = transactionContext.getBaggage(); - if (baggage != null) { - final @Nullable Double sampleRandFromBaggageMaybe = baggage.getSampleRandDouble(); - if (sampleRandFromBaggageMaybe != null) { - return sampleRandFromBaggageMaybe; - } - } - - return getCombinedScopeView().getPropagationContext().getSampleRand(); - } - @Override @ApiStatus.Internal public void setSpanContext( @@ -977,10 +965,7 @@ public void reportFullyDisplayed() { PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); configureScope( (scope) -> { - scope.withPropagationContext( - oldPropagationContext -> { - scope.setPropagationContext(propagationContext); - }); + scope.setPropagationContext(propagationContext); }); if (getOptions().isTracingEnabled()) { return TransactionContext.fromPropagationContext(propagationContext); diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 6df6deee3d4..102bb816ac5 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -321,6 +321,12 @@ public void reportFullyDisplayed() { return Sentry.continueTrace(sentryTrace, baggageHeaders); } + @Override + public void continueTrace( + final @NotNull String traceId, final @NotNull String spanId) { + Sentry.continueTrace(traceId, spanId); + } + @Override public @Nullable SentryTraceHeader getTraceparent() { return Sentry.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index bd5f296b7c2..6adfb852986 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -1162,6 +1162,18 @@ public interface OptionsConfiguration { return getCurrentScopes().continueTrace(sentryTrace, baggageHeaders); } + /** + * Continue a trace based on the trace ID and span ID provided + * + * @param traceId the trace ID + * @param spanId the span ID + */ + // return TransactionContext (if performance enabled) or null (if performance disabled) + public static void continueTrace( + final @NotNull String traceId, final @NotNull String spanId) { + getCurrentScopes().continueTrace(traceId, spanId); + } + /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in * <meta> HTML tags. Also see {@link Sentry#getBaggage()}. From d7316ea53faf99b62cd9dffd14bbd59afd29125a Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 6 Feb 2025 17:08:06 +0100 Subject: [PATCH 11/26] renamed --- .../sentry/android/ndk/NdkScopeObserver.java | 2 +- .../src/main/java/io/sentry/HubAdapter.java | 4 +-- .../main/java/io/sentry/HubScopesWrapper.java | 4 +-- sentry/src/main/java/io/sentry/IScopes.java | 4 +-- sentry/src/main/java/io/sentry/NoOpHub.java | 2 +- .../src/main/java/io/sentry/NoOpScopes.java | 2 +- sentry/src/main/java/io/sentry/Scopes.java | 35 ++++++++++++------- .../main/java/io/sentry/ScopesAdapter.java | 4 +-- sentry/src/main/java/io/sentry/Sentry.java | 4 +-- 9 files changed, 36 insertions(+), 25 deletions(-) diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java index a5eac55ec39..11586e7fed0 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java @@ -137,7 +137,7 @@ public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) { } try { - options.getExecutorService().submit(() -> nativeScope.setTraceId(spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); + options.getExecutorService().submit(() -> nativeScope.setTrace(spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); } catch (Throwable e) { options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId failed."); } diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index 5ef0ddf0aa6..3ded4f3dd34 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -323,9 +323,9 @@ public void reportFullyDisplayed() { } @Override - public void continueTrace( + public void setTrace( final @NotNull String traceId, final @NotNull String spanId) { - Sentry.continueTrace(traceId, spanId); + Sentry.setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/HubScopesWrapper.java b/sentry/src/main/java/io/sentry/HubScopesWrapper.java index 93bd26d452d..536bf081c41 100644 --- a/sentry/src/main/java/io/sentry/HubScopesWrapper.java +++ b/sentry/src/main/java/io/sentry/HubScopesWrapper.java @@ -317,9 +317,9 @@ public void reportFullyDisplayed() { } @Override - public void continueTrace( + public void setTrace( @NotNull String traceId, @NotNull String spanId) { - scopes.continueTrace(traceId, spanId); + scopes.setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/IScopes.java b/sentry/src/main/java/io/sentry/IScopes.java index 1d6850082bd..56b6204b31d 100644 --- a/sentry/src/main/java/io/sentry/IScopes.java +++ b/sentry/src/main/java/io/sentry/IScopes.java @@ -658,12 +658,12 @@ TransactionContext continueTrace( final @Nullable String sentryTrace, final @Nullable List baggageHeaders); /** - * Continue a trace based on the trace ID and span ID provided + * Set a trace. This is primarily used by other SDKs in a Hybrid SDK context * * @param traceId the trace ID * @param spanId the span ID this is continuing the trace from */ - void continueTrace(final @NotNull String traceId, final @NotNull String spanId); + void setTrace(final @NotNull String traceId, final @NotNull String spanId); /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index 7d1f0f7ad19..ffef0991472 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -277,7 +277,7 @@ public void reportFullyDisplayed() {} } @Override - public void continueTrace( + public void setTrace( final @NotNull String traceID, final @NotNull String spanId) {} @Override diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index 52d19a0c95d..d05eec0d23d 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -272,7 +272,7 @@ public void reportFullyDisplayed() {} } @Override - public void continueTrace( + public void setTrace( final @NotNull String traceId, final @NotNull String spanId) { } @Override diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index eda602d53d2..b42571888ac 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -950,23 +950,16 @@ public void setActiveSpan(final @Nullable ISpan span) { getOptions().getCacheDirPath(), !getOptions().isEnableAutoSessionTracking()); } - @Override - public void reportFullyDisplayed() { - if (getOptions().isEnableTimeToFullDisplayTracing()) { - getOptions().getFullyDisplayedReporter().reportFullyDrawn(); - } - } - @Override public @Nullable TransactionContext continueTrace( - final @Nullable String sentryTrace, final @Nullable List baggageHeaders) { + final @Nullable String sentryTrace, final @Nullable List baggageHeaders) { @NotNull PropagationContext propagationContext = - PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); + PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); configureScope( - (scope) -> { - scope.setPropagationContext(propagationContext); - }); + (scope) -> { + scope.setPropagationContext(propagationContext); + }); if (getOptions().isTracingEnabled()) { return TransactionContext.fromPropagationContext(propagationContext); } else { @@ -974,6 +967,24 @@ public void reportFullyDisplayed() { } } + @Override + public void continueTrace( + final @NotNull String traceId, final @NotNull String spanID) { + @NotNull + PropagationContext propagationContext = PropagationContext.fromId(traceId, spanID); + configureScope( + (scope) -> { + scope.setPropagationContext(propagationContext); + }); + } + + @Override + public void reportFullyDisplayed() { + if (getOptions().isEnableTimeToFullDisplayTracing()) { + getOptions().getFullyDisplayedReporter().reportFullyDrawn(); + } + } + @Override public @Nullable SentryTraceHeader getTraceparent() { if (!isEnabled()) { diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 102bb816ac5..6b64aead1e5 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -322,9 +322,9 @@ public void reportFullyDisplayed() { } @Override - public void continueTrace( + public void setTrace( final @NotNull String traceId, final @NotNull String spanId) { - Sentry.continueTrace(traceId, spanId); + Sentry.setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index 6adfb852986..e2395acd68b 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -1169,9 +1169,9 @@ public interface OptionsConfiguration { * @param spanId the span ID */ // return TransactionContext (if performance enabled) or null (if performance disabled) - public static void continueTrace( + public static void setTrace( final @NotNull String traceId, final @NotNull String spanId) { - getCurrentScopes().continueTrace(traceId, spanId); + getCurrentScopes().setTrace(traceId, spanId); } /** From 3d99e6323db3c1b9579783cf7a71c8f1c5f7c46c Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 6 Feb 2025 17:15:16 +0100 Subject: [PATCH 12/26] . --- sentry/src/main/java/io/sentry/Scopes.java | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index b42571888ac..4d666a846b5 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -950,16 +950,23 @@ public void setActiveSpan(final @Nullable ISpan span) { getOptions().getCacheDirPath(), !getOptions().isEnableAutoSessionTracking()); } + @Override + public void reportFullyDisplayed() { + if (getOptions().isEnableTimeToFullDisplayTracing()) { + getOptions().getFullyDisplayedReporter().reportFullyDrawn(); + } + } + @Override public @Nullable TransactionContext continueTrace( - final @Nullable String sentryTrace, final @Nullable List baggageHeaders) { + final @Nullable String sentryTrace, final @Nullable List baggageHeaders) { @NotNull PropagationContext propagationContext = - PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); + PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); configureScope( - (scope) -> { - scope.setPropagationContext(propagationContext); - }); + (scope) -> { + scope.setPropagationContext(propagationContext); + }); if (getOptions().isTracingEnabled()) { return TransactionContext.fromPropagationContext(propagationContext); } else { @@ -978,13 +985,6 @@ public void continueTrace( }); } - @Override - public void reportFullyDisplayed() { - if (getOptions().isEnableTimeToFullDisplayTracing()) { - getOptions().getFullyDisplayedReporter().reportFullyDrawn(); - } - } - @Override public @Nullable SentryTraceHeader getTraceparent() { if (!isEnabled()) { @@ -1077,4 +1077,4 @@ private static void validateOptions(final @NotNull SentryOptions options) { "Scopes requires a DSN to be instantiated. Considering using the NoOpScopes if no DSN is available."); } } -} +} \ No newline at end of file From b427553b45d5c3f684321123d12786acd70b389d Mon Sep 17 00:00:00 2001 From: Stefan Jandl Date: Fri, 7 Feb 2025 11:23:32 +0100 Subject: [PATCH 13/26] Update sentry/src/main/java/io/sentry/JsonSerializer.java --- sentry/src/main/java/io/sentry/JsonSerializer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/JsonSerializer.java b/sentry/src/main/java/io/sentry/JsonSerializer.java index 89d81d8ff37..09773dc617c 100644 --- a/sentry/src/main/java/io/sentry/JsonSerializer.java +++ b/sentry/src/main/java/io/sentry/JsonSerializer.java @@ -200,8 +200,8 @@ public void serialize(@NotNull T entity, @NotNull Writer writer) throws IOEx Objects.requireNonNull(writer, "The Writer object is required."); if (options.getLogger().isEnabled(SentryLevel.DEBUG)) { -// String serialized = serializeToString(entity, options.isEnablePrettySerializationOutput()); -// options.getLogger().log(SentryLevel.DEBUG, "Serializing object: %s", serialized); + String serialized = serializeToString(entity, options.isEnablePrettySerializationOutput()); + options.getLogger().log(SentryLevel.DEBUG, "Serializing object: %s", serialized); } JsonObjectWriter jsonObjectWriter = new JsonObjectWriter(writer, options.getMaxDepth()); jsonObjectWriter.value(options.getLogger(), entity); From 41520921bfaf64c5f33c0fc62141eb8fe36bfbf0 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Fri, 21 Feb 2025 12:54:42 +0000 Subject: [PATCH 14/26] Format code --- .../io/sentry/android/ndk/NdkScopeObserver.java | 11 +++++++---- sentry/src/main/java/io/sentry/HubAdapter.java | 3 +-- .../src/main/java/io/sentry/HubScopesWrapper.java | 3 +-- sentry/src/main/java/io/sentry/NoOpHub.java | 3 +-- sentry/src/main/java/io/sentry/NoOpScopes.java | 3 +-- .../main/java/io/sentry/PropagationContext.java | 10 ++-------- sentry/src/main/java/io/sentry/Scopes.java | 14 ++++++-------- sentry/src/main/java/io/sentry/ScopesAdapter.java | 5 ++--- sentry/src/main/java/io/sentry/Sentry.java | 3 +-- 9 files changed, 22 insertions(+), 33 deletions(-) diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java index 11586e7fed0..1af9d66cc24 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java @@ -7,10 +7,8 @@ import io.sentry.SentryLevel; import io.sentry.SentryOptions; import io.sentry.SpanContext; -import io.sentry.SpanId; import io.sentry.ndk.INativeScope; import io.sentry.ndk.NativeScope; -import io.sentry.protocol.SentryId; import io.sentry.protocol.User; import io.sentry.util.Objects; import java.util.Locale; @@ -132,12 +130,17 @@ public void removeExtra(final @NotNull String key) { @Override public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) { - if(spanContext == null) { + if (spanContext == null) { return; } try { - options.getExecutorService().submit(() -> nativeScope.setTrace(spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); + options + .getExecutorService() + .submit( + () -> + nativeScope.setTrace( + spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); } catch (Throwable e) { options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId failed."); } diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index 3ded4f3dd34..fb49bcb4c67 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -323,8 +323,7 @@ public void reportFullyDisplayed() { } @Override - public void setTrace( - final @NotNull String traceId, final @NotNull String spanId) { + public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { Sentry.setTrace(traceId, spanId); } diff --git a/sentry/src/main/java/io/sentry/HubScopesWrapper.java b/sentry/src/main/java/io/sentry/HubScopesWrapper.java index 536bf081c41..12c65c66045 100644 --- a/sentry/src/main/java/io/sentry/HubScopesWrapper.java +++ b/sentry/src/main/java/io/sentry/HubScopesWrapper.java @@ -317,8 +317,7 @@ public void reportFullyDisplayed() { } @Override - public void setTrace( - @NotNull String traceId, @NotNull String spanId) { + public void setTrace(@NotNull String traceId, @NotNull String spanId) { scopes.setTrace(traceId, spanId); } diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index ffef0991472..61a6c9b7d36 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -277,8 +277,7 @@ public void reportFullyDisplayed() {} } @Override - public void setTrace( - final @NotNull String traceID, final @NotNull String spanId) {} + public void setTrace(final @NotNull String traceID, final @NotNull String spanId) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index d05eec0d23d..d11d93fdc56 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -272,8 +272,7 @@ public void reportFullyDisplayed() {} } @Override - public void setTrace( - final @NotNull String traceId, final @NotNull String spanId) { } + public void setTrace(final @NotNull String traceId, final @NotNull String spanId) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/PropagationContext.java b/sentry/src/main/java/io/sentry/PropagationContext.java index f9e727d0d85..afb82e7cb76 100644 --- a/sentry/src/main/java/io/sentry/PropagationContext.java +++ b/sentry/src/main/java/io/sentry/PropagationContext.java @@ -52,15 +52,9 @@ public static PropagationContext fromHeaders( } public static @NotNull PropagationContext fromId( - final @NotNull String traceId, - final @NotNull String spanId) { + final @NotNull String traceId, final @NotNull String spanId) { return new PropagationContext( - new SentryId(traceId), - new SpanId(), - new SpanId(spanId), - null, - null - ); + new SentryId(traceId), new SpanId(), new SpanId(spanId), null, null); } private @NotNull SentryId traceId; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 4d666a846b5..19997dc8e74 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -975,14 +975,12 @@ public void reportFullyDisplayed() { } @Override - public void continueTrace( - final @NotNull String traceId, final @NotNull String spanID) { - @NotNull - PropagationContext propagationContext = PropagationContext.fromId(traceId, spanID); + public void continueTrace(final @NotNull String traceId, final @NotNull String spanID) { + @NotNull PropagationContext propagationContext = PropagationContext.fromId(traceId, spanID); configureScope( - (scope) -> { - scope.setPropagationContext(propagationContext); - }); + (scope) -> { + scope.setPropagationContext(propagationContext); + }); } @Override @@ -1077,4 +1075,4 @@ private static void validateOptions(final @NotNull SentryOptions options) { "Scopes requires a DSN to be instantiated. Considering using the NoOpScopes if no DSN is available."); } } -} \ No newline at end of file +} diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 6b64aead1e5..5a9e9a9eb84 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -322,9 +322,8 @@ public void reportFullyDisplayed() { } @Override - public void setTrace( - final @NotNull String traceId, final @NotNull String spanId) { - Sentry.setTrace(traceId, spanId); + public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { + Sentry.setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index e2395acd68b..911c18a792f 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -1169,8 +1169,7 @@ public interface OptionsConfiguration { * @param spanId the span ID */ // return TransactionContext (if performance enabled) or null (if performance disabled) - public static void setTrace( - final @NotNull String traceId, final @NotNull String spanId) { + public static void setTrace(final @NotNull String traceId, final @NotNull String spanId) { getCurrentScopes().setTrace(traceId, spanId); } From 2af13decde20d693cffebcf8f845b867a56351b4 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 21 Feb 2025 14:09:41 +0100 Subject: [PATCH 15/26] merge mixup --- sentry/src/main/java/io/sentry/Scopes.java | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 4d666a846b5..2eee33fbfb0 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -896,6 +896,18 @@ public void flush(long timeoutMillis) { return transaction; } + private @NotNull Double getSampleRand(final @NotNull TransactionContext transactionContext) { + final @Nullable Baggage baggage = transactionContext.getBaggage(); + if (baggage != null) { + final @Nullable Double sampleRandFromBaggageMaybe = baggage.getSampleRandDouble(); + if (sampleRandFromBaggageMaybe != null) { + return sampleRandFromBaggageMaybe; + } + } + + return getCombinedScopeView().getPropagationContext().getSampleRand(); + } + @Override @ApiStatus.Internal public void setSpanContext( @@ -965,7 +977,10 @@ public void reportFullyDisplayed() { PropagationContext.fromHeaders(getOptions().getLogger(), sentryTrace, baggageHeaders); configureScope( (scope) -> { - scope.setPropagationContext(propagationContext); + scope.withPropagationContext( + oldPropagationContext -> { + scope.setPropagationContext(propagationContext); + }); }); if (getOptions().isTracingEnabled()) { return TransactionContext.fromPropagationContext(propagationContext); @@ -975,7 +990,7 @@ public void reportFullyDisplayed() { } @Override - public void continueTrace( + public void setTrace( final @NotNull String traceId, final @NotNull String spanID) { @NotNull PropagationContext propagationContext = PropagationContext.fromId(traceId, spanID); @@ -1077,4 +1092,4 @@ private static void validateOptions(final @NotNull SentryOptions options) { "Scopes requires a DSN to be instantiated. Considering using the NoOpScopes if no DSN is available."); } } -} \ No newline at end of file +} From cbe837c681a79c355e8c5dd6f3e7f40698d3b344 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Tue, 25 Feb 2025 17:53:48 +0100 Subject: [PATCH 16/26] moved 'settrace' to internal --- .../io/sentry/android/core/InternalSentrySdk.java | 11 +++++++++++ sentry/src/main/java/io/sentry/HubAdapter.java | 2 +- sentry/src/main/java/io/sentry/ScopesAdapter.java | 2 +- sentry/src/main/java/io/sentry/Sentry.java | 11 ----------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java index 841edf8109a..f1f7d4555ab 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java @@ -1,5 +1,6 @@ package io.sentry.android.core; +import static io.sentry.Sentry.getCurrentScopes; import static io.sentry.SentryLevel.DEBUG; import static io.sentry.SentryLevel.INFO; import static io.sentry.SentryLevel.WARNING; @@ -329,4 +330,14 @@ private static Session updateSession( }); return sessionRef.get(); } + + /** + * Continue a trace based on the trace ID and span ID provided + * + * @param traceId the trace ID + * @param spanId the span ID + */ + public static void setTrace(final @NotNull String traceId, final @NotNull String spanId, final @Nullable String sampleRand) { + getCurrentScopes().setTrace(traceId, spanId); + } } diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index fb49bcb4c67..e47bfcbc7d7 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -324,7 +324,7 @@ public void reportFullyDisplayed() { @Override public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { - Sentry.setTrace(traceId, spanId); + Sentry.getCurrentScopes().setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 5a9e9a9eb84..5a7010ebce5 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -323,7 +323,7 @@ public void reportFullyDisplayed() { @Override public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { - Sentry.setTrace(traceId, spanId); + Sentry.getCurrentScopes().setTrace(traceId, spanId); } @Override diff --git a/sentry/src/main/java/io/sentry/Sentry.java b/sentry/src/main/java/io/sentry/Sentry.java index 911c18a792f..bd5f296b7c2 100644 --- a/sentry/src/main/java/io/sentry/Sentry.java +++ b/sentry/src/main/java/io/sentry/Sentry.java @@ -1162,17 +1162,6 @@ public interface OptionsConfiguration { return getCurrentScopes().continueTrace(sentryTrace, baggageHeaders); } - /** - * Continue a trace based on the trace ID and span ID provided - * - * @param traceId the trace ID - * @param spanId the span ID - */ - // return TransactionContext (if performance enabled) or null (if performance disabled) - public static void setTrace(final @NotNull String traceId, final @NotNull String spanId) { - getCurrentScopes().setTrace(traceId, spanId); - } - /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in * <meta> HTML tags. Also see {@link Sentry#getBaggage()}. From 9a10493d26478e801fe9edd461826f9c8d15e030 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 13:20:03 +0100 Subject: [PATCH 17/26] updated settrace to accept sample rate and sample rand --- .../io/sentry/android/core/InternalSentrySdk.java | 12 +++++++++--- .../java/io/sentry/android/ndk/NdkScopeObserver.java | 2 +- sentry/src/main/java/io/sentry/HubAdapter.java | 8 ++++++-- sentry/src/main/java/io/sentry/HubScopesWrapper.java | 8 ++++++-- sentry/src/main/java/io/sentry/IScopes.java | 12 +++++++++--- sentry/src/main/java/io/sentry/NoOpHub.java | 6 +++++- sentry/src/main/java/io/sentry/NoOpScopes.java | 6 +++++- .../src/main/java/io/sentry/PropagationContext.java | 11 +++++++++-- sentry/src/main/java/io/sentry/Scopes.java | 4 ++-- sentry/src/main/java/io/sentry/ScopesAdapter.java | 8 ++++++-- 10 files changed, 58 insertions(+), 19 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java index f1f7d4555ab..1d0ec5839c1 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java @@ -335,9 +335,15 @@ private static Session updateSession( * Continue a trace based on the trace ID and span ID provided * * @param traceId the trace ID - * @param spanId the span ID + * @param spanId the trace origin's span ID + * @param sampleRate the sample rate used by the origin of the trace + * @param sampleRand the random value used to sample with by the origin of the trace */ - public static void setTrace(final @NotNull String traceId, final @NotNull String spanId, final @Nullable String sampleRand) { - getCurrentScopes().setTrace(traceId, spanId); + public static void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); } } diff --git a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java index 1af9d66cc24..023ce965f51 100644 --- a/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java +++ b/sentry-android-ndk/src/main/java/io/sentry/android/ndk/NdkScopeObserver.java @@ -142,7 +142,7 @@ public void setTrace(@Nullable SpanContext spanContext, @NotNull IScope scope) { nativeScope.setTrace( spanContext.getTraceId().toString(), spanContext.getSpanId().toString())); } catch (Throwable e) { - options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTraceId failed."); + options.getLogger().log(SentryLevel.ERROR, e, "Scope sync setTrace failed."); } } } diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index e47bfcbc7d7..ff9e5853bce 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -323,8 +323,12 @@ public void reportFullyDisplayed() { } @Override - public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { - Sentry.getCurrentScopes().setTrace(traceId, spanId); + public void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); } @Override diff --git a/sentry/src/main/java/io/sentry/HubScopesWrapper.java b/sentry/src/main/java/io/sentry/HubScopesWrapper.java index 12c65c66045..fb69436b98b 100644 --- a/sentry/src/main/java/io/sentry/HubScopesWrapper.java +++ b/sentry/src/main/java/io/sentry/HubScopesWrapper.java @@ -317,8 +317,12 @@ public void reportFullyDisplayed() { } @Override - public void setTrace(@NotNull String traceId, @NotNull String spanId) { - scopes.setTrace(traceId, spanId); + public void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); } @Override diff --git a/sentry/src/main/java/io/sentry/IScopes.java b/sentry/src/main/java/io/sentry/IScopes.java index 56b6204b31d..0b152db637c 100644 --- a/sentry/src/main/java/io/sentry/IScopes.java +++ b/sentry/src/main/java/io/sentry/IScopes.java @@ -661,9 +661,15 @@ TransactionContext continueTrace( * Set a trace. This is primarily used by other SDKs in a Hybrid SDK context * * @param traceId the trace ID - * @param spanId the span ID this is continuing the trace from - */ - void setTrace(final @NotNull String traceId, final @NotNull String spanId); + * @param spanId the trace origin's span ID + * @param sampleRate the sample rate used by the origin of the trace + * @param sampleRand the random value used to sample with by the origin of the trace + */ + void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand); /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index 61a6c9b7d36..d37967de318 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -277,7 +277,11 @@ public void reportFullyDisplayed() {} } @Override - public void setTrace(final @NotNull String traceID, final @NotNull String spanId) {} + public void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index d11d93fdc56..fabf090ab54 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -272,7 +272,11 @@ public void reportFullyDisplayed() {} } @Override - public void setTrace(final @NotNull String traceId, final @NotNull String spanId) {} + public void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/PropagationContext.java b/sentry/src/main/java/io/sentry/PropagationContext.java index afb82e7cb76..418ade657eb 100644 --- a/sentry/src/main/java/io/sentry/PropagationContext.java +++ b/sentry/src/main/java/io/sentry/PropagationContext.java @@ -52,9 +52,16 @@ public static PropagationContext fromHeaders( } public static @NotNull PropagationContext fromId( - final @NotNull String traceId, final @NotNull String spanId) { + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double decisionSampleRate, + final @Nullable Double decisionSampleRand) { return new PropagationContext( - new SentryId(traceId), new SpanId(), new SpanId(spanId), null, null); + new SentryId(traceId), + new SpanId(), + new SpanId(spanId), + TracingUtils.ensureBaggage(null, null, decisionSampleRate, decisionSampleRand), + null); } private @NotNull SentryId traceId; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 3628412d180..eeb4ff7d29d 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -991,8 +991,8 @@ public void reportFullyDisplayed() { @Override public void setTrace( - final @NotNull String traceId, final @NotNull String spanID) { - @NotNull PropagationContext propagationContext = PropagationContext.fromId(traceId, spanID); + final @NotNull String traceId, final @NotNull String spanId, final @Nullable Double sampleRate, final @Nullable Double sampleRand) { + @NotNull PropagationContext propagationContext = PropagationContext.fromId(traceId, spanId, sampleRate, sampleRand); configureScope( (scope) -> { scope.setPropagationContext(propagationContext); diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 5a7010ebce5..8825d7cafac 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -322,8 +322,12 @@ public void reportFullyDisplayed() { } @Override - public void setTrace(final @NotNull String traceId, final @NotNull String spanId) { - Sentry.getCurrentScopes().setTrace(traceId, spanId); + public void setTrace( + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); } @Override From a589c3d3f6128762b14ab5b530ebdf89970514b0 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 13:32:30 +0100 Subject: [PATCH 18/26] renamed --- sentry/src/main/java/io/sentry/PropagationContext.java | 2 +- sentry/src/main/java/io/sentry/Scopes.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/PropagationContext.java b/sentry/src/main/java/io/sentry/PropagationContext.java index 418ade657eb..e47ba5d868b 100644 --- a/sentry/src/main/java/io/sentry/PropagationContext.java +++ b/sentry/src/main/java/io/sentry/PropagationContext.java @@ -51,7 +51,7 @@ public static PropagationContext fromHeaders( sentryTraceHeader.isSampled()); } - public static @NotNull PropagationContext fromId( + public static @NotNull PropagationContext fromExistingTrace( final @NotNull String traceId, final @NotNull String spanId, final @Nullable Double decisionSampleRate, diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index eeb4ff7d29d..fc3091e9e84 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -992,7 +992,7 @@ public void reportFullyDisplayed() { @Override public void setTrace( final @NotNull String traceId, final @NotNull String spanId, final @Nullable Double sampleRate, final @Nullable Double sampleRand) { - @NotNull PropagationContext propagationContext = PropagationContext.fromId(traceId, spanId, sampleRate, sampleRand); + @NotNull PropagationContext propagationContext = PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); configureScope( (scope) -> { scope.setPropagationContext(propagationContext); From 093e907cd2b6892785698acf299cbaabed0c1f69 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 13:55:55 +0100 Subject: [PATCH 19/26] docs --- .../src/main/java/io/sentry/android/core/InternalSentrySdk.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java index 1d0ec5839c1..7812ccc45eb 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java @@ -332,7 +332,7 @@ private static Session updateSession( } /** - * Continue a trace based on the trace ID and span ID provided + * Allows a Hybrid SDK to set the trace on the native layer * * @param traceId the trace ID * @param spanId the trace origin's span ID From 06827482239bc62ea64526f66480b7bbf848b371 Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Wed, 26 Feb 2025 12:57:45 +0000 Subject: [PATCH 20/26] Format code --- sentry/src/main/java/io/sentry/IScopes.java | 8 ++++---- sentry/src/main/java/io/sentry/NoOpHub.java | 8 ++++---- sentry/src/main/java/io/sentry/NoOpScopes.java | 8 ++++---- .../main/java/io/sentry/PropagationContext.java | 10 +++++----- sentry/src/main/java/io/sentry/Scopes.java | 15 ++++++++++----- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/sentry/src/main/java/io/sentry/IScopes.java b/sentry/src/main/java/io/sentry/IScopes.java index 0b152db637c..b6d037a187b 100644 --- a/sentry/src/main/java/io/sentry/IScopes.java +++ b/sentry/src/main/java/io/sentry/IScopes.java @@ -666,10 +666,10 @@ TransactionContext continueTrace( * @param sampleRand the random value used to sample with by the origin of the trace */ void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand); + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand); /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index d37967de318..f4f8b3a339c 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -278,10 +278,10 @@ public void reportFullyDisplayed() {} @Override public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) {} + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index fabf090ab54..df19d30cd94 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -273,10 +273,10 @@ public void reportFullyDisplayed() {} @Override public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) {} + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) {} @Override public @Nullable SentryTraceHeader getTraceparent() { diff --git a/sentry/src/main/java/io/sentry/PropagationContext.java b/sentry/src/main/java/io/sentry/PropagationContext.java index e47ba5d868b..547b09f3861 100644 --- a/sentry/src/main/java/io/sentry/PropagationContext.java +++ b/sentry/src/main/java/io/sentry/PropagationContext.java @@ -57,11 +57,11 @@ public static PropagationContext fromHeaders( final @Nullable Double decisionSampleRate, final @Nullable Double decisionSampleRand) { return new PropagationContext( - new SentryId(traceId), - new SpanId(), - new SpanId(spanId), - TracingUtils.ensureBaggage(null, null, decisionSampleRate, decisionSampleRand), - null); + new SentryId(traceId), + new SpanId(), + new SpanId(spanId), + TracingUtils.ensureBaggage(null, null, decisionSampleRate, decisionSampleRand), + null); } private @NotNull SentryId traceId; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index fc3091e9e84..082155ed731 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -978,9 +978,9 @@ public void reportFullyDisplayed() { configureScope( (scope) -> { scope.withPropagationContext( - oldPropagationContext -> { - scope.setPropagationContext(propagationContext); - }); + oldPropagationContext -> { + scope.setPropagationContext(propagationContext); + }); }); if (getOptions().isTracingEnabled()) { return TransactionContext.fromPropagationContext(propagationContext); @@ -991,8 +991,13 @@ public void reportFullyDisplayed() { @Override public void setTrace( - final @NotNull String traceId, final @NotNull String spanId, final @Nullable Double sampleRate, final @Nullable Double sampleRand) { - @NotNull PropagationContext propagationContext = PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + @NotNull + PropagationContext propagationContext = + PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); configureScope( (scope) -> { scope.setPropagationContext(propagationContext); From dc0a6d5cac5339b45af4e6ec612ffce4ddbbfa03 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 15:15:22 +0100 Subject: [PATCH 21/26] . --- sentry/src/main/java/io/sentry/Scopes.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index fc3091e9e84..9f0c4ffed2b 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -991,8 +991,12 @@ public void reportFullyDisplayed() { @Override public void setTrace( - final @NotNull String traceId, final @NotNull String spanId, final @Nullable Double sampleRate, final @Nullable Double sampleRand) { - @NotNull PropagationContext propagationContext = PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); + final @NotNull String traceId, + final @NotNull String spanId, + final @Nullable Double sampleRate, + final @Nullable Double sampleRand) { + @NotNull PropagationContext propagationContext = + PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); configureScope( (scope) -> { scope.setPropagationContext(propagationContext); From 68fea13cd2f64c681ab3b04fccf1407e217941b8 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 18:30:44 +0100 Subject: [PATCH 22/26] test --- .../android/core/InternalSentrySdkTest.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt index 01b9845a9fe..9fb4edadd51 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt @@ -505,4 +505,25 @@ class InternalSentrySdkTest { assertEquals(20.toLong(), actualProcessSpan["start_timestamp_ms"]) assertEquals(100.toLong(), actualProcessSpan["end_timestamp_ms"]) } + + @Test + fun `setTrace sets correct propagation context`() { + val fixture = Fixture() + fixture.init(context) + + val traceId = "771a43a4192642f0b136d5159a501700" + val spanId = "771a43a4192642f0" + val sampleRate = 0.5 + val sampleRand = 0.3 + + InternalSentrySdk.setTrace(traceId, spanId, sampleRate, sampleRand) + + Sentry.configureScope { scope -> + val propagationContext = scope.propagationContext + assertEquals(SentryId(traceId), propagationContext.traceId) + assertEquals(SpanId(spanId), propagationContext.parentSpanId) + assertEquals(sampleRate, propagationContext.baggage.sampleRateDouble) + assertEquals(sampleRand, propagationContext.baggage.sampleRandDouble) + } + } } From 224384141575b5ef13beb471f314649532bd7737 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 26 Feb 2025 19:11:42 +0100 Subject: [PATCH 23/26] =?UTF-8?q?make=20the=20repo=20h=C3=A4ppy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sentry-android-core/api/sentry-android-core.api | 1 + sentry-android-ndk/api/sentry-android-ndk.api | 1 + sentry/api/sentry.api | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/sentry-android-core/api/sentry-android-core.api b/sentry-android-core/api/sentry-android-core.api index 59caf171564..85197f80380 100644 --- a/sentry-android-core/api/sentry-android-core.api +++ b/sentry-android-core/api/sentry-android-core.api @@ -221,6 +221,7 @@ public final class io/sentry/android/core/InternalSentrySdk { public static fun getAppStartMeasurement ()Ljava/util/Map; public static fun getCurrentScope ()Lio/sentry/IScope; public static fun serializeScope (Landroid/content/Context;Lio/sentry/android/core/SentryAndroidOptions;Lio/sentry/IScope;)Ljava/util/Map; + public static fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V } public final class io/sentry/android/core/LoadClass : io/sentry/util/LoadClass { diff --git a/sentry-android-ndk/api/sentry-android-ndk.api b/sentry-android-ndk/api/sentry-android-ndk.api index eb5f48a9bd9..44c153a71fe 100644 --- a/sentry-android-ndk/api/sentry-android-ndk.api +++ b/sentry-android-ndk/api/sentry-android-ndk.api @@ -20,6 +20,7 @@ public final class io/sentry/android/ndk/NdkScopeObserver : io/sentry/ScopeObser public fun removeTag (Ljava/lang/String;)V public fun setExtra (Ljava/lang/String;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Lio/sentry/SpanContext;Lio/sentry/IScope;)V public fun setUser (Lio/sentry/protocol/User;)V } diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 82e18268c99..69abf0ea3ea 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -625,6 +625,7 @@ public final class io/sentry/HubAdapter : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -689,6 +690,7 @@ public final class io/sentry/HubScopesWrapper : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -916,6 +918,7 @@ public abstract interface class io/sentry/IScopes { public abstract fun setLevel (Lio/sentry/SentryLevel;)V public abstract fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public abstract fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public abstract fun setTransaction (Ljava/lang/String;)V public abstract fun setUser (Lio/sentry/protocol/User;)V public abstract fun startSession ()V @@ -1438,6 +1441,7 @@ public final class io/sentry/NoOpHub : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -1597,6 +1601,7 @@ public final class io/sentry/NoOpScopes : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -1952,6 +1957,7 @@ public final class io/sentry/PropagationContext { public fun ()V public fun (Lio/sentry/PropagationContext;)V public fun (Lio/sentry/protocol/SentryId;Lio/sentry/SpanId;Lio/sentry/SpanId;Lio/sentry/Baggage;Ljava/lang/Boolean;)V + public static fun fromExistingTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)Lio/sentry/PropagationContext; public static fun fromHeaders (Lio/sentry/ILogger;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/PropagationContext; public static fun fromHeaders (Lio/sentry/ILogger;Ljava/lang/String;Ljava/util/List;)Lio/sentry/PropagationContext; public static fun fromHeaders (Lio/sentry/SentryTraceHeader;Lio/sentry/Baggage;Lio/sentry/SpanId;)Lio/sentry/PropagationContext; @@ -2197,6 +2203,7 @@ public final class io/sentry/Scopes : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -2261,6 +2268,7 @@ public final class io/sentry/ScopesAdapter : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V + public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V From d9d43ee7f987f62f5e00106a50a8595fdab2b817 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Thu, 27 Feb 2025 11:05:32 +0100 Subject: [PATCH 24/26] reviewref --- .../io/sentry/android/core/InternalSentrySdk.java | 6 +++++- .../sentry/android/core/InternalSentrySdkTest.kt | 1 + sentry/api/sentry.api | 8 +------- sentry/src/main/java/io/sentry/HubAdapter.java | 9 --------- .../src/main/java/io/sentry/HubScopesWrapper.java | 9 --------- sentry/src/main/java/io/sentry/IScopes.java | 14 -------------- sentry/src/main/java/io/sentry/NoOpHub.java | 7 ------- sentry/src/main/java/io/sentry/NoOpScopes.java | 7 ------- sentry/src/main/java/io/sentry/Scopes.java | 15 --------------- sentry/src/main/java/io/sentry/ScopesAdapter.java | 9 --------- .../main/java/io/sentry/util/TracingUtils.java | 11 +++++++++++ 11 files changed, 18 insertions(+), 78 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java index 7812ccc45eb..cae558f0d43 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java @@ -14,6 +14,7 @@ import io.sentry.IScopes; import io.sentry.ISerializer; import io.sentry.ObjectWriter; +import io.sentry.PropagationContext; import io.sentry.ScopeType; import io.sentry.ScopesAdapter; import io.sentry.SentryEnvelope; @@ -31,6 +32,7 @@ import io.sentry.protocol.SentryId; import io.sentry.protocol.User; import io.sentry.util.MapObjectWriter; +import io.sentry.util.TracingUtils; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; @@ -344,6 +346,8 @@ public static void setTrace( final @NotNull String spanId, final @Nullable Double sampleRate, final @Nullable Double sampleRand) { - getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); + TracingUtils.setTrace( + getCurrentScopes(), + PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand)); } } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt index 9fb4edadd51..7ddabb84ea7 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/InternalSentrySdkTest.kt @@ -19,6 +19,7 @@ import io.sentry.SentryExceptionFactory import io.sentry.SentryItemType import io.sentry.SentryOptions import io.sentry.Session +import io.sentry.SpanId import io.sentry.android.core.performance.ActivityLifecycleTimeSpan import io.sentry.android.core.performance.AppStartMetrics import io.sentry.exception.ExceptionMechanismException diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 69abf0ea3ea..1c4883e078e 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -625,7 +625,6 @@ public final class io/sentry/HubAdapter : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -690,7 +689,6 @@ public final class io/sentry/HubScopesWrapper : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -918,7 +916,6 @@ public abstract interface class io/sentry/IScopes { public abstract fun setLevel (Lio/sentry/SentryLevel;)V public abstract fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public abstract fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public abstract fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public abstract fun setTransaction (Ljava/lang/String;)V public abstract fun setUser (Lio/sentry/protocol/User;)V public abstract fun startSession ()V @@ -1441,7 +1438,6 @@ public final class io/sentry/NoOpHub : io/sentry/IHub { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -1601,7 +1597,6 @@ public final class io/sentry/NoOpScopes : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -2203,7 +2198,6 @@ public final class io/sentry/Scopes : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -2268,7 +2262,6 @@ public final class io/sentry/ScopesAdapter : io/sentry/IScopes { public fun setLevel (Lio/sentry/SentryLevel;)V public fun setSpanContext (Ljava/lang/Throwable;Lio/sentry/ISpan;Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V - public fun setTrace (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V public fun setTransaction (Ljava/lang/String;)V public fun setUser (Lio/sentry/protocol/User;)V public fun startSession ()V @@ -6368,6 +6361,7 @@ public final class io/sentry/util/TracingUtils { public static fun ensureBaggage (Lio/sentry/Baggage;Ljava/lang/Boolean;Ljava/lang/Double;Ljava/lang/Double;)Lio/sentry/Baggage; public static fun isIgnored (Ljava/util/List;Ljava/lang/String;)Z public static fun maybeUpdateBaggage (Lio/sentry/IScope;Lio/sentry/SentryOptions;)Lio/sentry/PropagationContext; + public static fun setTrace (Lio/sentry/IScopes;Lio/sentry/PropagationContext;)V public static fun startNewTrace (Lio/sentry/IScopes;)V public static fun trace (Lio/sentry/IScopes;Ljava/util/List;Lio/sentry/ISpan;)Lio/sentry/util/TracingUtils$TracingHeaders; public static fun traceIfAllowed (Lio/sentry/IScopes;Ljava/lang/String;Ljava/util/List;Lio/sentry/ISpan;)Lio/sentry/util/TracingUtils$TracingHeaders; diff --git a/sentry/src/main/java/io/sentry/HubAdapter.java b/sentry/src/main/java/io/sentry/HubAdapter.java index ff9e5853bce..fc2f9c15dcd 100644 --- a/sentry/src/main/java/io/sentry/HubAdapter.java +++ b/sentry/src/main/java/io/sentry/HubAdapter.java @@ -322,15 +322,6 @@ public void reportFullyDisplayed() { return Sentry.continueTrace(sentryTrace, baggageHeaders); } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) { - Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); - } - @Override public @Nullable SentryTraceHeader getTraceparent() { return Sentry.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/HubScopesWrapper.java b/sentry/src/main/java/io/sentry/HubScopesWrapper.java index fb69436b98b..591852a9adf 100644 --- a/sentry/src/main/java/io/sentry/HubScopesWrapper.java +++ b/sentry/src/main/java/io/sentry/HubScopesWrapper.java @@ -316,15 +316,6 @@ public void reportFullyDisplayed() { return scopes.continueTrace(sentryTrace, baggageHeaders); } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) { - Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); - } - @Override public @Nullable SentryTraceHeader getTraceparent() { return scopes.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/IScopes.java b/sentry/src/main/java/io/sentry/IScopes.java index b6d037a187b..e07de9c327c 100644 --- a/sentry/src/main/java/io/sentry/IScopes.java +++ b/sentry/src/main/java/io/sentry/IScopes.java @@ -657,20 +657,6 @@ void setSpanContext( TransactionContext continueTrace( final @Nullable String sentryTrace, final @Nullable List baggageHeaders); - /** - * Set a trace. This is primarily used by other SDKs in a Hybrid SDK context - * - * @param traceId the trace ID - * @param spanId the trace origin's span ID - * @param sampleRate the sample rate used by the origin of the trace - * @param sampleRand the random value used to sample with by the origin of the trace - */ - void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand); - /** * Returns the "sentry-trace" header that allows tracing across services. Can also be used in * <meta> HTML tags. Also see {@link IScopes#getBaggage()}. diff --git a/sentry/src/main/java/io/sentry/NoOpHub.java b/sentry/src/main/java/io/sentry/NoOpHub.java index f4f8b3a339c..d3e0b010c39 100644 --- a/sentry/src/main/java/io/sentry/NoOpHub.java +++ b/sentry/src/main/java/io/sentry/NoOpHub.java @@ -276,13 +276,6 @@ public void reportFullyDisplayed() {} return null; } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) {} - @Override public @Nullable SentryTraceHeader getTraceparent() { return null; diff --git a/sentry/src/main/java/io/sentry/NoOpScopes.java b/sentry/src/main/java/io/sentry/NoOpScopes.java index df19d30cd94..8255569387d 100644 --- a/sentry/src/main/java/io/sentry/NoOpScopes.java +++ b/sentry/src/main/java/io/sentry/NoOpScopes.java @@ -271,13 +271,6 @@ public void reportFullyDisplayed() {} return null; } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) {} - @Override public @Nullable SentryTraceHeader getTraceparent() { return null; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 082155ed731..14025a1d774 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -989,21 +989,6 @@ public void reportFullyDisplayed() { } } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) { - @NotNull - PropagationContext propagationContext = - PropagationContext.fromExistingTrace(traceId, spanId, sampleRate, sampleRand); - configureScope( - (scope) -> { - scope.setPropagationContext(propagationContext); - }); - } - @Override public @Nullable SentryTraceHeader getTraceparent() { if (!isEnabled()) { diff --git a/sentry/src/main/java/io/sentry/ScopesAdapter.java b/sentry/src/main/java/io/sentry/ScopesAdapter.java index 8825d7cafac..6df6deee3d4 100644 --- a/sentry/src/main/java/io/sentry/ScopesAdapter.java +++ b/sentry/src/main/java/io/sentry/ScopesAdapter.java @@ -321,15 +321,6 @@ public void reportFullyDisplayed() { return Sentry.continueTrace(sentryTrace, baggageHeaders); } - @Override - public void setTrace( - final @NotNull String traceId, - final @NotNull String spanId, - final @Nullable Double sampleRate, - final @Nullable Double sampleRand) { - Sentry.getCurrentScopes().setTrace(traceId, spanId, sampleRate, sampleRand); - } - @Override public @Nullable SentryTraceHeader getTraceparent() { return Sentry.getTraceparent(); diff --git a/sentry/src/main/java/io/sentry/util/TracingUtils.java b/sentry/src/main/java/io/sentry/util/TracingUtils.java index 8673b358a99..bae78476aa2 100644 --- a/sentry/src/main/java/io/sentry/util/TracingUtils.java +++ b/sentry/src/main/java/io/sentry/util/TracingUtils.java @@ -28,6 +28,17 @@ public static void startNewTrace(final @NotNull IScopes scopes) { }); } + public static void setTrace( + final @NotNull IScopes scopes, final @NotNull PropagationContext propagationContext) { + scopes.configureScope( + scope -> { + scope.withPropagationContext( + oldPropagationContext -> { + scope.setPropagationContext(propagationContext); + }); + }); + } + public static @Nullable TracingHeaders traceIfAllowed( final @NotNull IScopes scopes, final @NotNull String requestUrl, From f8f097aca547c58d02def2a357131d7ce7262ace Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 28 Feb 2025 11:59:00 +0100 Subject: [PATCH 25/26] bumped native ndk --- buildSrc/src/main/java/Config.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 0a3c62a1555..03b6849a6ba 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -159,7 +159,7 @@ object Config { val apolloKotlin = "com.apollographql.apollo3:apollo-runtime:3.8.2" val apolloKotlin4 = "com.apollographql.apollo:apollo-runtime:4.1.1" - val sentryNativeNdk = "io.sentry:sentry-native-ndk:0.7.20" + val sentryNativeNdk = "io.sentry:sentry-native-ndk:0.8.1" object OpenTelemetry { val otelVersion = "1.44.1" From e6a7438e50ecb5f68fa4f426f98ebd2ffbe77b74 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Fri, 28 Feb 2025 12:55:05 +0100 Subject: [PATCH 26/26] Updated CHANGELOG.md --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b7c2efd7a0..b7376d03922 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +### Features + +- The SDK now automatically propagates the trace-context to the native layer. This allows to connect errors on different layers of the application. ([#4137](https://github.com/getsentry/sentry-java/pull/4137)) + +### Dependencies + +- Bump Native SDK from v0.7.20 to v0.8.1 ([#4137](https://github.com/getsentry/sentry-java/pull/4137)) + - [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#0810) + - [diff](https://github.com/getsentry/sentry-native/compare/v0.7.20...0.8.1) + ## 8.3.0 ### Features