Skip to content

Commit 28ed730

Browse files
Feat: Add "data" to spans (#1717)
Fixes #1233
1 parent d71704e commit 28ed730

File tree

11 files changed

+117
-1
lines changed

11 files changed

+117
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Unreleased
44

5+
* Feat: Add "data" to spans (#1717)
56
* Fix: Should not capture unfinished transaction (#1719)
67

78
## 5.2.0-beta.2

sentry/api/sentry.api

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,13 +304,15 @@ public abstract interface class io/sentry/ISerializer {
304304
public abstract interface class io/sentry/ISpan {
305305
public abstract fun finish ()V
306306
public abstract fun finish (Lio/sentry/SpanStatus;)V
307+
public abstract fun getData (Ljava/lang/String;)Ljava/lang/Object;
307308
public abstract fun getDescription ()Ljava/lang/String;
308309
public abstract fun getOperation ()Ljava/lang/String;
309310
public abstract fun getSpanContext ()Lio/sentry/SpanContext;
310311
public abstract fun getStatus ()Lio/sentry/SpanStatus;
311312
public abstract fun getTag (Ljava/lang/String;)Ljava/lang/String;
312313
public abstract fun getThrowable ()Ljava/lang/Throwable;
313314
public abstract fun isFinished ()Z
315+
public abstract fun setData (Ljava/lang/String;Ljava/lang/Object;)V
314316
public abstract fun setDescription (Ljava/lang/String;)V
315317
public abstract fun setOperation (Ljava/lang/String;)V
316318
public abstract fun setStatus (Lio/sentry/SpanStatus;)V
@@ -414,6 +416,7 @@ public final class io/sentry/NoOpLogger : io/sentry/ILogger {
414416
public final class io/sentry/NoOpSpan : io/sentry/ISpan {
415417
public fun finish ()V
416418
public fun finish (Lio/sentry/SpanStatus;)V
419+
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
417420
public fun getDescription ()Ljava/lang/String;
418421
public static fun getInstance ()Lio/sentry/NoOpSpan;
419422
public fun getOperation ()Ljava/lang/String;
@@ -422,6 +425,7 @@ public final class io/sentry/NoOpSpan : io/sentry/ISpan {
422425
public fun getTag (Ljava/lang/String;)Ljava/lang/String;
423426
public fun getThrowable ()Ljava/lang/Throwable;
424427
public fun isFinished ()Z
428+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
425429
public fun setDescription (Ljava/lang/String;)V
426430
public fun setOperation (Ljava/lang/String;)V
427431
public fun setStatus (Lio/sentry/SpanStatus;)V
@@ -439,6 +443,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
439443
public fun finish ()V
440444
public fun finish (Lio/sentry/SpanStatus;)V
441445
public fun getContexts ()Lio/sentry/protocol/Contexts;
446+
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
442447
public fun getDescription ()Ljava/lang/String;
443448
public fun getEventId ()Lio/sentry/protocol/SentryId;
444449
public static fun getInstance ()Lio/sentry/NoOpTransaction;
@@ -453,6 +458,7 @@ public final class io/sentry/NoOpTransaction : io/sentry/ITransaction {
453458
public fun getThrowable ()Ljava/lang/Throwable;
454459
public fun isFinished ()Z
455460
public fun isSampled ()Ljava/lang/Boolean;
461+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
456462
public fun setDescription (Ljava/lang/String;)V
457463
public fun setName (Ljava/lang/String;)V
458464
public fun setOperation (Ljava/lang/String;)V
@@ -971,6 +977,8 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
971977
public fun finish (Lio/sentry/SpanStatus;)V
972978
public fun getChildren ()Ljava/util/List;
973979
public fun getContexts ()Lio/sentry/protocol/Contexts;
980+
public fun getData ()Ljava/util/Map;
981+
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
974982
public fun getDescription ()Ljava/lang/String;
975983
public fun getEventId ()Lio/sentry/protocol/SentryId;
976984
public fun getLatestActiveSpan ()Lio/sentry/Span;
@@ -986,6 +994,7 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
986994
public fun getTimestamp ()Ljava/util/Date;
987995
public fun isFinished ()Z
988996
public fun isSampled ()Ljava/lang/Boolean;
997+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
989998
public fun setDescription (Ljava/lang/String;)V
990999
public fun setName (Ljava/lang/String;)V
9911000
public fun setOperation (Ljava/lang/String;)V
@@ -1053,6 +1062,8 @@ public final class io/sentry/Span : io/sentry/ISpan {
10531062
public fun <init> (Lio/sentry/TransactionContext;Lio/sentry/SentryTracer;Lio/sentry/IHub;Ljava/util/Date;)V
10541063
public fun finish ()V
10551064
public fun finish (Lio/sentry/SpanStatus;)V
1065+
public fun getData ()Ljava/util/Map;
1066+
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
10561067
public fun getDescription ()Ljava/lang/String;
10571068
public fun getOperation ()Ljava/lang/String;
10581069
public fun getParentSpanId ()Lio/sentry/SpanId;
@@ -1067,6 +1078,7 @@ public final class io/sentry/Span : io/sentry/ISpan {
10671078
public fun getTraceId ()Lio/sentry/protocol/SentryId;
10681079
public fun isFinished ()Z
10691080
public fun isSampled ()Ljava/lang/Boolean;
1081+
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
10701082
public fun setDescription (Ljava/lang/String;)V
10711083
public fun setOperation (Ljava/lang/String;)V
10721084
public fun setStatus (Lio/sentry/SpanStatus;)V

sentry/src/main/java/io/sentry/ISpan.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,20 @@ ISpan startChild(
154154
* @return if span has finished.
155155
*/
156156
boolean isFinished();
157+
158+
/**
159+
* Sets extra data on span or transaction.
160+
*
161+
* @param key the data key
162+
* @param value the data value
163+
*/
164+
void setData(@NotNull String key, @NotNull Object value);
165+
166+
/**
167+
* Returns extra data from span or transaction.
168+
*
169+
* @return the data
170+
*/
171+
@Nullable
172+
Object getData(@NotNull String key);
157173
}

sentry/src/main/java/io/sentry/NoOpSpan.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,12 @@ public void setTag(@NotNull String key, @NotNull String value) {}
102102
public boolean isFinished() {
103103
return false;
104104
}
105+
106+
@Override
107+
public void setData(@NotNull String key, @NotNull Object value) {}
108+
109+
@Override
110+
public @Nullable Object getData(@NotNull String key) {
111+
return null;
112+
}
105113
}

sentry/src/main/java/io/sentry/NoOpTransaction.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,4 +159,12 @@ public void setTag(@NotNull String key, @NotNull String value) {}
159159
public @Nullable Boolean isSampled() {
160160
return null;
161161
}
162+
163+
@Override
164+
public void setData(@NotNull String key, @NotNull Object value) {}
165+
166+
@Override
167+
public @Nullable Object getData(@NotNull String key) {
168+
return null;
169+
}
162170
}

sentry/src/main/java/io/sentry/SentryTracer.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.ArrayList;
1010
import java.util.Date;
1111
import java.util.List;
12+
import java.util.Map;
1213
import java.util.concurrent.CopyOnWriteArrayList;
1314
import java.util.concurrent.atomic.AtomicReference;
1415
import org.jetbrains.annotations.ApiStatus;
@@ -345,6 +346,20 @@ public boolean isFinished() {
345346
return this.root.isFinished();
346347
}
347348

349+
@Override
350+
public void setData(@NotNull String key, @NotNull Object value) {
351+
this.root.setData(key, value);
352+
}
353+
354+
@Override
355+
public @Nullable Object getData(@NotNull String key) {
356+
return this.root.getData(key);
357+
}
358+
359+
public @Nullable Map<String, Object> getData() {
360+
return this.root.getData();
361+
}
362+
348363
@Override
349364
public @Nullable Boolean isSampled() {
350365
return this.root.isSampled();

sentry/src/main/java/io/sentry/Span.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.sentry.util.Objects;
55
import java.util.Date;
66
import java.util.Map;
7+
import java.util.concurrent.ConcurrentHashMap;
78
import java.util.concurrent.atomic.AtomicBoolean;
89
import org.jetbrains.annotations.ApiStatus;
910
import org.jetbrains.annotations.NotNull;
@@ -35,6 +36,8 @@ public final class Span implements ISpan {
3536

3637
private final @Nullable SpanFinishedCallback spanFinishedCallback;
3738

39+
private final @NotNull Map<String, Object> data = new ConcurrentHashMap<>();
40+
3841
Span(
3942
final @NotNull SentryId traceId,
4043
final @Nullable SpanId parentSpanId,
@@ -197,6 +200,10 @@ public boolean isFinished() {
197200
return finished.get();
198201
}
199202

203+
public @NotNull Map<String, Object> getData() {
204+
return data;
205+
}
206+
200207
public @Nullable Boolean isSampled() {
201208
return context.getSampled();
202209
}
@@ -227,4 +234,14 @@ public SentryId getTraceId() {
227234
public Map<String, String> getTags() {
228235
return context.getTags();
229236
}
237+
238+
@Override
239+
public void setData(@NotNull String key, @NotNull Object value) {
240+
data.put(key, value);
241+
}
242+
243+
@Override
244+
public @Nullable Object getData(@NotNull String key) {
245+
return data.get(key);
246+
}
230247
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public final class SentrySpan {
2626
private final @Nullable Map<String, Object> data;
2727

2828
public SentrySpan(final @NotNull Span span) {
29-
this(span, null);
29+
this(span, span.getData());
3030
}
3131

3232
@ApiStatus.Internal

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ public SentryTransaction(final @NotNull SentryTracer sentryTracer) {
6767
for (final Map.Entry<String, String> tag : tracerContext.getTags().entrySet()) {
6868
this.setTag(tag.getKey(), tag.getValue());
6969
}
70+
71+
final Map<String, Object> data = sentryTracer.getData();
72+
if (data != null) {
73+
for (final Map.Entry<String, Object> tag : data.entrySet()) {
74+
this.setExtra(tag.getKey(), tag.getValue());
75+
}
76+
}
7077
}
7178

7279
public @NotNull List<SentrySpan> getSpans() {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ class GsonSerializerTest {
512512
trace.setTag("myTag", "myValue")
513513
trace.sampled = true
514514
val tracer = SentryTracer(trace, fixture.hub)
515+
tracer.setData("dataKey", "dataValue")
515516
val span = tracer.startChild("child")
516517
span.finish(SpanStatus.OK)
517518
tracer.finish()
@@ -527,6 +528,8 @@ class GsonSerializerTest {
527528
assertNotNull(element["spans"].asJsonArray)
528529
assertEquals("myValue", element["tags"].asJsonObject["myTag"].asString)
529530

531+
assertEquals("dataValue", element["extra"].asJsonObject["dataKey"].asString)
532+
530533
val jsonSpan = element["spans"].asJsonArray[0].asJsonObject
531534
assertNotNull(jsonSpan["trace_id"])
532535
assertNotNull(jsonSpan["span_id"])
@@ -563,6 +566,9 @@ class GsonSerializerTest {
563566
"some-key": "some-value"
564567
}
565568
},
569+
"extra": {
570+
"extraKey": "extraValue"
571+
},
566572
"spans": [
567573
{
568574
"start_timestamp": "2021-03-05T08:51:12.838Z",
@@ -597,6 +603,8 @@ class GsonSerializerTest {
597603
assertNotNull(transaction.contexts["custom"])
598604
assertEquals("some-value", (transaction.contexts["custom"] as Map<*, *>)["some-key"])
599605

606+
assertEquals("extraValue", transaction.getExtra("extraKey"))
607+
600608
assertNotNull(transaction.spans)
601609
assertEquals(1, transaction.spans.size)
602610
val span = transaction.spans[0]

0 commit comments

Comments
 (0)