Skip to content

Commit 5d921a5

Browse files
lbloderadinauer
andauthored
Add data from transaction root span to contexts.trace.data (#3735)
* add transaction data to trace.context.data, don't send in extras * reset to 8.x.x version of submodule * fix tests, fix changelog * fix changelog * cr changes --------- Co-authored-by: Alexander Dinauer <[email protected]>
1 parent 281a621 commit 5d921a5

16 files changed

+82
-10
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
- For `graphql-java` v22 and newer please use the `sentry-graphql-22` module
4444
- We now provide a `SentryInstrumenter` bean directly for Spring (Boot) if there is none yet instead of using `GraphQlSourceBuilderCustomizer` to add the instrumentation ([#3744](https://github.com/getsentry/sentry-java/pull/3744))
4545
- It is now also possible to provide a bean of type `SentryGraphqlInstrumentation.BeforeSpanCallback` which is then used by `SentryInstrumenter`
46+
- Emit transaction.data inside contexts.trace.data ([#3735](https://github.com/getsentry/sentry-java/pull/3735))
47+
- Also does not emit `transaction.data` in `exras` anymore
4648

4749
### Fixes
4850

sentry/api/sentry.api

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3390,6 +3390,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
33903390
public static final field DEFAULT_ORIGIN Ljava/lang/String;
33913391
public static final field TYPE Ljava/lang/String;
33923392
protected field baggage Lio/sentry/Baggage;
3393+
protected field data Ljava/util/Map;
33933394
protected field description Ljava/lang/String;
33943395
protected field op Ljava/lang/String;
33953396
protected field origin Ljava/lang/String;
@@ -3403,6 +3404,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
34033404
public fun copyForChild (Ljava/lang/String;Lio/sentry/SpanId;Lio/sentry/SpanId;)Lio/sentry/SpanContext;
34043405
public fun equals (Ljava/lang/Object;)Z
34053406
public fun getBaggage ()Lio/sentry/Baggage;
3407+
public fun getData ()Ljava/util/Map;
34063408
public fun getDescription ()Ljava/lang/String;
34073409
public fun getInstrumenter ()Lio/sentry/Instrumenter;
34083410
public fun getOperation ()Ljava/lang/String;
@@ -3418,6 +3420,7 @@ public class io/sentry/SpanContext : io/sentry/JsonSerializable, io/sentry/JsonU
34183420
public fun getUnknown ()Ljava/util/Map;
34193421
public fun hashCode ()I
34203422
public fun serialize (Lio/sentry/ObjectWriter;Lio/sentry/ILogger;)V
3423+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
34213424
public fun setDescription (Ljava/lang/String;)V
34223425
public fun setInstrumenter (Lio/sentry/Instrumenter;)V
34233426
public fun setOperation (Ljava/lang/String;)V
@@ -3437,6 +3440,7 @@ public final class io/sentry/SpanContext$Deserializer : io/sentry/JsonDeserializ
34373440
}
34383441

34393442
public final class io/sentry/SpanContext$JsonKeys {
3443+
public static final field DATA Ljava/lang/String;
34403444
public static final field DESCRIPTION Ljava/lang/String;
34413445
public static final field OP Ljava/lang/String;
34423446
public static final field ORIGIN Ljava/lang/String;

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

Lines changed: 24 additions & 1 deletion
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;
@@ -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: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
7777
contexts.putAll(sentryTracer.getContexts());
7878

7979
final SpanContext tracerContext = sentryTracer.getSpanContext();
80+
Map<String, Object> data = sentryTracer.getData();
8081
// tags must be placed on the root of the transaction instead of contexts.trace.tags
81-
contexts.setTrace(
82+
final SpanContext tracerContextToSend =
8283
new SpanContext(
8384
tracerContext.getTraceId(),
8485
tracerContext.getSpanId(),
@@ -87,18 +88,20 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
8788
tracerContext.getDescription(),
8889
tracerContext.getSamplingDecision(),
8990
tracerContext.getStatus(),
90-
tracerContext.getOrigin()));
91+
tracerContext.getOrigin());
92+
9193
for (final Map.Entry<String, String> tag : tracerContext.getTags().entrySet()) {
9294
this.setTag(tag.getKey(), tag.getValue());
9395
}
9496

95-
final Map<String, Object> data = sentryTracer.getData();
9697
if (data != null) {
9798
for (final Map.Entry<String, Object> tag : data.entrySet()) {
98-
this.setExtra(tag.getKey(), tag.getValue());
99+
tracerContextToSend.setData(tag.getKey(), tag.getValue());
99100
}
100101
}
101102

103+
contexts.setTrace(tracerContextToSend);
104+
102105
this.transactionInfo = new TransactionInfo(sentryTracer.getTransactionNameSource().apiName());
103106
}
104107

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
@@ -120,6 +120,10 @@
120120
"2a5fa3f5-7b87-487f-aaa5-84567aa73642": "4781d51a-c5af-47f2-a4ed-f030c9b3e194",
121121
"29106d7d-7fa4-444f-9d34-b9d7510c69ab": "218c23ea-694a-497e-bf6d-e5f26f1ad7bd",
122122
"ba9ce913-269f-4c03-882d-8ca5e6991b14": "35a74e90-8db8-4610-a411-872cbc1030ac"
123+
},
124+
"data":
125+
{
126+
"spanContextDataKey": "spanContextDataValue"
123127
}
124128
}
125129
}

sentry/src/test/resources/json/sentry_base_event.json

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

sentry/src/test/resources/json/sentry_base_event_with_null_extra.json

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

0 commit comments

Comments
 (0)