Skip to content

Commit 33c2401

Browse files
authored
Merge 1329393 into cfc5405
2 parents cfc5405 + 1329393 commit 33c2401

18 files changed

Lines changed: 93 additions & 11 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
- You may now set `forceInit=true` (`force-init` for `.properties` files) to ensure a call to Sentry.init / SentryAndroid.init takes effect
2222
- Add force init option to Android Manifest ([#3675](https://github.com/getsentry/sentry-java/pull/3675))
2323
- Use `<meta-data android:name="io.sentry.force-init" android:value="true" />` to ensure Sentry Android auto init is not easily overwritten
24+
- Emit transaction.data inside contexts.trace.data ([#3735](https://github.com/getsentry/sentry-java/pull/3735))
2425

2526
### Fixes
2627

sentry-spring-boot-jakarta/api/sentry-spring-boot-jakarta.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ public class io/sentry/spring/boot/jakarta/SentryLogbackAppenderAutoConfiguratio
1818
public fun sentryLogbackInitializer (Lio/sentry/spring/boot/jakarta/SentryProperties;)Lio/sentry/spring/boot/jakarta/SentryLogbackInitializer;
1919
}
2020

21+
public class io/sentry/spring/boot/jakarta/SentryLogbackInitializer : org/springframework/context/event/GenericApplicationListener {
22+
public fun <init> (Lio/sentry/spring/boot/jakarta/SentryProperties;)V
23+
public fun onApplicationEvent (Lorg/springframework/context/ApplicationEvent;)V
24+
public fun supportsEventType (Lorg/springframework/core/ResolvableType;)Z
25+
}
26+
2127
public class io/sentry/spring/boot/jakarta/SentryProperties : io/sentry/SentryOptions {
2228
public fun <init> ()V
2329
public fun getExceptionResolverOrder ()I

sentry-spring-boot/api/sentry-spring-boot.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ public class io/sentry/spring/boot/SentryLogbackAppenderAutoConfiguration {
1818
public fun sentryLogbackInitializer (Lio/sentry/spring/boot/SentryProperties;)Lio/sentry/spring/boot/SentryLogbackInitializer;
1919
}
2020

21+
public class io/sentry/spring/boot/SentryLogbackInitializer : org/springframework/context/event/GenericApplicationListener {
22+
public fun <init> (Lio/sentry/spring/boot/SentryProperties;)V
23+
public fun onApplicationEvent (Lorg/springframework/context/ApplicationEvent;)V
24+
public fun supportsEventType (Lorg/springframework/core/ResolvableType;)Z
25+
}
26+
2127
public class io/sentry/spring/boot/SentryProperties : io/sentry/SentryOptions {
2228
public fun <init> ()V
2329
public fun getExceptionResolverOrder ()I

sentry/api/sentry.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3438,6 +3438,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
34383438
public static final field DEFAULT_ORIGIN Ljava/lang/String;
34393439
public static final field TYPE Ljava/lang/String;
34403440
protected field baggage Lio/sentry/Baggage;
3441+
protected field data Ljava/util/Map;
34413442
protected field description Ljava/lang/String;
34423443
protected field op Ljava/lang/String;
34433444
protected field origin Ljava/lang/String;
@@ -3451,6 +3452,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
34513452
public fun copyForChild (Ljava/lang/String;Lio/sentry/SpanId;Lio/sentry/SpanId;)Lio/sentry/SpanContext;
34523453
public fun equals (Ljava/lang/Object;)Z
34533454
public fun getBaggage ()Lio/sentry/Baggage;
3455+
public fun getData ()Ljava/util/Map;
34543456
public fun getDescription ()Ljava/lang/String;
34553457
public fun getInstrumenter ()Lio/sentry/Instrumenter;
34563458
public fun getOperation ()Ljava/lang/String;
@@ -3466,6 +3468,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
34663468
public fun getUnknown ()Ljava/util/Map;
34673469
public fun hashCode ()I
34683470
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
3471+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
34693472
public fun setDescription (Ljava/lang/String;)V
34703473
public fun setInstrumenter (Lio/sentry/Instrumenter;)V
34713474
public fun setOperation (Ljava/lang/String;)V
@@ -3485,6 +3488,7 @@ public final class io/sentry/SpanContext$Deserializer : io/sentry/JsonDeserializ
34853488
}
34863489

34873490
public final class io/sentry/SpanContext$JsonKeys {
3491+
public static final field DATA Ljava/lang/String;
34883492
public static final field DESCRIPTION Ljava/lang/String;
34893493
public static final field OP Ljava/lang/String;
34903494
public static final field ORIGIN Ljava/lang/String;

sentry/src/main/java/io/sentry/SpanContext.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ public class SpanContext implements JsonUnknown, JsonSerializable {
4444
/** A map or list of tags for this event. Each tag must be less than 200 characters. */
4545
protected @NotNull Map<String, @NotNull String> tags = new ConcurrentHashMap<>();
4646

47-
/** Describes the status of the Transaction. */
4847
protected @Nullable String origin = DEFAULT_ORIGIN;
4948

49+
protected @NotNull Map<String, Object> data = new ConcurrentHashMap<>();
50+
5051
private @Nullable Map<String, Object> unknown;
5152

5253
private @NotNull Instrumenter instrumenter = Instrumenter.SENTRY;
@@ -73,7 +74,7 @@ public SpanContext(
7374
final @NotNull String operation,
7475
final @Nullable SpanId parentSpanId,
7576
final @Nullable TracesSamplingDecision samplingDecision) {
76-
this(traceId, spanId, parentSpanId, operation, null, samplingDecision, null, DEFAULT_ORIGIN);
77+
this(traceId, spanId, parentSpanId, operation, null, samplingDecision, null, "manual");
7778
}
7879

7980
@ApiStatus.Internal
@@ -230,6 +231,14 @@ public void setInstrumenter(final @NotNull Instrumenter instrumenter) {
230231
return baggage;
231232
}
232233

234+
public @NotNull Map<String, Object> getData() {
235+
return data;
236+
}
237+
238+
public void setData(final @NotNull String key, final @NotNull Object value) {
239+
data.put(key, value);
240+
}
241+
233242
@ApiStatus.Internal
234243
public SpanContext copyForChild(
235244
final @NotNull String operation,
@@ -275,6 +284,7 @@ public static final class JsonKeys {
275284
public static final String STATUS = "status";
276285
public static final String TAGS = "tags";
277286
public static final String ORIGIN = "origin";
287+
public static final String DATA = "data";
278288
}
279289

280290
@Override
@@ -302,6 +312,9 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
302312
if (!tags.isEmpty()) {
303313
writer.name(JsonKeys.TAGS).value(logger, tags);
304314
}
315+
if (!data.isEmpty()) {
316+
writer.name(JsonKeys.DATA).value(logger, data);
317+
}
305318
if (unknown != null) {
306319
for (String key : unknown.keySet()) {
307320
Object value = unknown.get(key);
@@ -336,6 +349,7 @@ public static final class Deserializer implements JsonDeserializer<SpanContext>
336349
SpanStatus status = null;
337350
String origin = null;
338351
Map<String, String> tags = null;
352+
Map<String, Object> data = null;
339353

340354
Map<String, Object> unknown = null;
341355
while (reader.peek() == JsonToken.NAME) {
@@ -367,6 +381,9 @@ public static final class Deserializer implements JsonDeserializer<SpanContext>
367381
CollectionUtils.newConcurrentHashMap(
368382
(Map<String, String>) reader.nextObjectOrNull());
369383
break;
384+
case JsonKeys.DATA:
385+
data = (Map<String, Object>) reader.nextObjectOrNull();
386+
break;
370387
default:
371388
if (unknown == null) {
372389
unknown = new ConcurrentHashMap<>();
@@ -404,9 +421,15 @@ public static final class Deserializer implements JsonDeserializer<SpanContext>
404421
spanContext.setDescription(description);
405422
spanContext.setStatus(status);
406423
spanContext.setOrigin(origin);
424+
407425
if (tags != null) {
408426
spanContext.tags = tags;
409427
}
428+
429+
if (data != null) {
430+
spanContext.data = data;
431+
}
432+
410433
spanContext.setUnknown(unknown);
411434
reader.endObject();
412435
return spanContext;

sentry/src/main/java/io/sentry/protocol/SentryTransaction.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
8080
contexts.putAll(sentryTracer.getContexts());
8181

8282
final SpanContext tracerContext = sentryTracer.getSpanContext();
83+
Map<String, Object> data = sentryTracer.getData();
8384
// tags must be placed on the root of the transaction instead of contexts.trace.tags
84-
contexts.setTrace(
85+
final SpanContext tracerContextToSend =
8586
new SpanContext(
8687
tracerContext.getTraceId(),
8788
tracerContext.getSpanId(),
@@ -90,15 +91,16 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
9091
tracerContext.getDescription(),
9192
tracerContext.getSamplingDecision(),
9293
tracerContext.getStatus(),
93-
tracerContext.getOrigin()));
94+
tracerContext.getOrigin());
95+
96+
contexts.setTrace(tracerContextToSend);
9497
for (final Map.Entry<String, String> tag : tracerContext.getTags().entrySet()) {
9598
this.setTag(tag.getKey(), tag.getValue());
9699
}
97100

98-
final Map<String, Object> data = sentryTracer.getData();
99101
if (data != null) {
100102
for (final Map.Entry<String, Object> tag : data.entrySet()) {
101-
this.setExtra(tag.getKey(), tag.getValue());
103+
tracerContextToSend.setData(tag.getKey(), tag.getValue());
102104
}
103105
}
104106

sentry/src/test/java/io/sentry/JsonSerializerTest.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -855,8 +855,6 @@ class JsonSerializerTest {
855855
assertNotNull(element["spans"] as List<*>)
856856
assertEquals("myValue", (element["tags"] as Map<*, *>)["myTag"] as String)
857857

858-
assertEquals("dataValue", (element["extra"] as Map<*, *>)["dataKey"] as String)
859-
860858
val jsonSpan = (element["spans"] as List<*>)[0] as Map<*, *>
861859
assertNotNull(jsonSpan["trace_id"])
862860
assertNotNull(jsonSpan["span_id"])
@@ -867,6 +865,7 @@ class JsonSerializerTest {
867865
assertNotNull(jsonSpan["start_timestamp"])
868866

869867
val jsonTrace = (element["contexts"] as Map<*, *>)["trace"] as Map<*, *>
868+
assertEquals("dataValue", (jsonTrace["data"] as Map<*, *>)["dataKey"] as String)
870869
assertNotNull(jsonTrace["trace_id"] as String)
871870
assertNotNull(jsonTrace["span_id"] as String)
872871
assertEquals("http", jsonTrace["op"] as String)
@@ -887,7 +886,10 @@ class JsonSerializerTest {
887886
"trace_id": "b156a475de54423d9c1571df97ec7eb6",
888887
"span_id": "0a53026963414893",
889888
"op": "http",
890-
"status": "ok"
889+
"status": "ok",
890+
"data": {
891+
"transactionDataKey": "transactionDataValue"
892+
}
891893
},
892894
"custom": {
893895
"some-key": "some-value"
@@ -928,6 +930,7 @@ class JsonSerializerTest {
928930
assertEquals("0a53026963414893", transaction.contexts.trace!!.spanId.toString())
929931
assertEquals("http", transaction.contexts.trace!!.operation)
930932
assertNotNull(transaction.contexts["custom"])
933+
assertEquals("transactionDataValue", transaction.contexts.trace!!.data!!["transactionDataKey"])
931934
assertEquals("some-value", (transaction.contexts["custom"] as Map<*, *>)["some-key"])
932935

933936
assertEquals("extraValue", transaction.getExtra("extraKey"))

sentry/src/test/java/io/sentry/SentryTracerTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,13 +752,13 @@ class SentryTracerTest {
752752
}
753753

754754
@Test
755-
fun `sets ITransaction data as extra in SentryTransaction`() {
755+
fun `sets ITransaction data as tracecontext data in SentryTransaction`() {
756756
val transaction = fixture.getSut(samplingDecision = TracesSamplingDecision(true))
757757
transaction.setData("key", "val")
758758
transaction.finish()
759759
verify(fixture.scopes).captureTransaction(
760760
check {
761-
assertEquals("val", it.getExtra("key"))
761+
assertEquals("val", it.contexts.trace?.data?.get("key"))
762762
},
763763
anyOrNull<TraceContext>(),
764764
anyOrNull(),

sentry/src/test/java/io/sentry/protocol/SpanContextSerializationTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SpanContextSerializationTest {
3535
setTag("2a5fa3f5-7b87-487f-aaa5-84567aa73642", "4781d51a-c5af-47f2-a4ed-f030c9b3e194")
3636
setTag("29106d7d-7fa4-444f-9d34-b9d7510c69ab", "218c23ea-694a-497e-bf6d-e5f26f1ad7bd")
3737
setTag("ba9ce913-269f-4c03-882d-8ca5e6991b14", "35a74e90-8db8-4610-a411-872cbc1030ac")
38+
setData("spanContextDataKey", "spanContextDataValue")
3839
}
3940
}
4041
private val fixture = Fixture()

sentry/src/test/resources/json/contexts.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@
121121
"2a5fa3f5-7b87-487f-aaa5-84567aa73642": "4781d51a-c5af-47f2-a4ed-f030c9b3e194",
122122
"29106d7d-7fa4-444f-9d34-b9d7510c69ab": "218c23ea-694a-497e-bf6d-e5f26f1ad7bd",
123123
"ba9ce913-269f-4c03-882d-8ca5e6991b14": "35a74e90-8db8-4610-a411-872cbc1030ac"
124+
},
125+
"data":
126+
{
127+
"spanContextDataKey": "spanContextDataValue"
124128
}
125129
}
126130
}

0 commit comments

Comments
 (0)