diff --git a/sentry/src/main/java/io/sentry/Baggage.java b/sentry/src/main/java/io/sentry/Baggage.java index 4d7e76b170..6ede0a88df 100644 --- a/sentry/src/main/java/io/sentry/Baggage.java +++ b/sentry/src/main/java/io/sentry/Baggage.java @@ -221,21 +221,23 @@ public Baggage(final @NotNull Baggage baggage) { @ApiStatus.Internal static @NotNull Baggage copyWithOverrides( - final @NotNull Baggage baggage, + final @Nullable Baggage baggage, final @NotNull SentryId traceId, final @Nullable Double sampleRand) { + final @NotNull Baggage source = + baggage == null ? new Baggage(NoOpLogger.getInstance()) : baggage; final @NotNull ConcurrentHashMap keyValues = - new ConcurrentHashMap<>(baggage.keyValues); + new ConcurrentHashMap<>(source.keyValues); keyValues.put(DSCKeys.TRACE_ID, traceId.toString()); return new Baggage( keyValues, - baggage.sampleRate, + source.sampleRate, sampleRand, - baggage.thirdPartyHeader, - true, - false, - baggage.logger); + source.thirdPartyHeader, + source.mutable, + source.shouldFreeze, + source.logger); } @ApiStatus.Internal diff --git a/sentry/src/main/java/io/sentry/TransactionContext.java b/sentry/src/main/java/io/sentry/TransactionContext.java index 470e8f1975..c424750e69 100644 --- a/sentry/src/main/java/io/sentry/TransactionContext.java +++ b/sentry/src/main/java/io/sentry/TransactionContext.java @@ -44,7 +44,7 @@ public static TransactionContext fromPropagationContext( final @NotNull TransactionContext transactionContext) { final @NotNull Baggage baggage = Baggage.copyWithOverrides( - propagationContext.getBaggage(), + transactionContext.getBaggage(), propagationContext.getTraceId(), propagationContext.getSampleRand()); diff --git a/sentry/src/test/java/io/sentry/BaggageTest.kt b/sentry/src/test/java/io/sentry/BaggageTest.kt index 950577698b..eb7e052a04 100644 --- a/sentry/src/test/java/io/sentry/BaggageTest.kt +++ b/sentry/src/test/java/io/sentry/BaggageTest.kt @@ -440,7 +440,7 @@ class BaggageTest { } @Test - fun `copy with overrides creates mutable baggage`() { + fun `copy with overrides preserves frozen state`() { val baggage = Baggage.fromHeader( "sentry-sample_rand=0.1,sentry-trace_id=75302ac48a024bde9a3b3734a82e36c8", @@ -450,14 +450,24 @@ class BaggageTest { val copy = Baggage.copyWithOverrides(baggage, SentryId("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 0.2) - assertTrue(copy.isMutable) - assertFalse(copy.isShouldFreeze) + assertFalse(copy.isMutable) + assertTrue(copy.isShouldFreeze) assertEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", copy.traceId) assertEquals(0.2, copy.sampleRand!!, 0.0001) assertEquals("75302ac48a024bde9a3b3734a82e36c8", baggage.traceId) assertEquals(0.1, baggage.sampleRand!!, 0.0001) } + @Test + fun `copy with overrides creates baggage when source is null`() { + val copy = Baggage.copyWithOverrides(null, SentryId("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 0.2) + + assertTrue(copy.isMutable) + assertFalse(copy.isShouldFreeze) + assertEquals("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", copy.traceId) + assertEquals(0.2, copy.sampleRand!!, 0.0001) + } + @Test fun `if header contains sentry values baggage is marked as shouldFreeze`() { val baggage = diff --git a/sentry/src/test/java/io/sentry/TransactionContextTest.kt b/sentry/src/test/java/io/sentry/TransactionContextTest.kt index bba16a581c..bef2f491e6 100644 --- a/sentry/src/test/java/io/sentry/TransactionContextTest.kt +++ b/sentry/src/test/java/io/sentry/TransactionContextTest.kt @@ -99,6 +99,7 @@ class TransactionContextTest { fun `fromPropagationContextAsRoot copies non trace state`() { val propagationBaggage = Baggage(NoOpLogger.getInstance()) propagationBaggage.sampleRand = 0.42 + propagationBaggage.publicKey = "propagation-public-key" val propagationContext = PropagationContext( SentryId("75302ac48a024bde9a3b3734a82e36c8"), @@ -109,6 +110,7 @@ class TransactionContextTest { ) val samplingDecision = TracesSamplingDecision(true, 0.3, true, 0.4) val transactionContext = TransactionContext("name", "op", samplingDecision) + transactionContext.baggage!!.publicKey = "transaction-public-key" transactionContext.transactionNameSource = TransactionNameSource.ROUTE transactionContext.description = "description" transactionContext.status = SpanStatus.OK @@ -145,6 +147,7 @@ class TransactionContextTest { assertEquals(0.4, context.samplingDecision!!.profileSampleRate) assertEquals(0.42, context.baggage!!.sampleRand) assertEquals(propagationContext.traceId.toString(), context.baggage!!.traceId) + assertEquals("transaction-public-key", context.baggage!!.publicKey) assertNull(context.featureFlagBuffer.featureFlags) }