Skip to content

Commit 3b8bad1

Browse files
authored
Merge a5bfe94 into b11dc55
2 parents b11dc55 + a5bfe94 commit 3b8bad1

12 files changed

+61
-1
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Features
66

77
- Add support for `feedback` envelope header item type ([#3687](https://github.com/getsentry/sentry-java/pull/3687))
8+
- Add breadcrumb.origin field ([#3727](https://github.com/getsentry/sentry-java/pull/3727))
89

910
### Fixes
1011

sentry/api/sentry.api

+3
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public final class io/sentry/Breadcrumb : io/sentry/JsonSerializable, io/sentry/
109109
public fun getData (Ljava/lang/String;)Ljava/lang/Object;
110110
public fun getLevel ()Lio/sentry/SentryLevel;
111111
public fun getMessage ()Ljava/lang/String;
112+
public fun getOrigin ()Ljava/lang/String;
112113
public fun getTimestamp ()Ljava/util/Date;
113114
public fun getType ()Ljava/lang/String;
114115
public fun getUnknown ()Ljava/util/Map;
@@ -127,6 +128,7 @@ public final class io/sentry/Breadcrumb : io/sentry/JsonSerializable, io/sentry/
127128
public fun setData (Ljava/lang/String;Ljava/lang/Object;)V
128129
public fun setLevel (Lio/sentry/SentryLevel;)V
129130
public fun setMessage (Ljava/lang/String;)V
131+
public fun setOrigin (Ljava/lang/String;)V
130132
public fun setType (Ljava/lang/String;)V
131133
public fun setUnknown (Ljava/util/Map;)V
132134
public static fun transaction (Ljava/lang/String;)Lio/sentry/Breadcrumb;
@@ -148,6 +150,7 @@ public final class io/sentry/Breadcrumb$JsonKeys {
148150
public static final field DATA Ljava/lang/String;
149151
public static final field LEVEL Ljava/lang/String;
150152
public static final field MESSAGE Ljava/lang/String;
153+
public static final field ORIGIN Ljava/lang/String;
151154
public static final field TIMESTAMP Ljava/lang/String;
152155
public static final field TYPE Ljava/lang/String;
153156
public fun <init> ()V

sentry/src/main/java/io/sentry/Breadcrumb.java

+41-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ public final class Breadcrumb implements JsonUnknown, JsonSerializable {
3434
/** Dotted strings that indicate what the crumb is or where it comes from. */
3535
private @Nullable String category;
3636

37+
/**
38+
* Origin of the breadcrumb that is used to identify source of the breadcrumb. For example hybrid
39+
* SDKs can identify native breadcrumbs from JS or Flutter.
40+
*/
41+
private @Nullable String origin;
42+
3743
/** The level of the event. */
3844
private @Nullable SentryLevel level;
3945

@@ -54,6 +60,7 @@ public Breadcrumb(final @NotNull Date timestamp) {
5460
this.message = breadcrumb.message;
5561
this.type = breadcrumb.type;
5662
this.category = breadcrumb.category;
63+
this.origin = breadcrumb.origin;
5764
final Map<String, Object> dataClone = CollectionUtils.newConcurrentHashMap(breadcrumb.data);
5865
if (dataClone != null) {
5966
this.data = dataClone;
@@ -78,6 +85,7 @@ public static Breadcrumb fromMap(
7885
String type = null;
7986
@NotNull Map<String, Object> data = new ConcurrentHashMap<>();
8087
String category = null;
88+
String origin = null;
8189
SentryLevel level = null;
8290
Map<String, Object> unknown = null;
8391

@@ -116,6 +124,9 @@ public static Breadcrumb fromMap(
116124
case JsonKeys.CATEGORY:
117125
category = (value instanceof String) ? (String) value : null;
118126
break;
127+
case JsonKeys.ORIGIN:
128+
origin = (value instanceof String) ? (String) value : null;
129+
break;
119130
case JsonKeys.LEVEL:
120131
String levelString = (value instanceof String) ? (String) value : null;
121132
if (levelString != null) {
@@ -140,6 +151,7 @@ public static Breadcrumb fromMap(
140151
breadcrumb.type = type;
141152
breadcrumb.data = data;
142153
breadcrumb.category = category;
154+
breadcrumb.origin = origin;
143155
breadcrumb.level = level;
144156

145157
breadcrumb.setUnknown(unknown);
@@ -610,6 +622,24 @@ public void setCategory(@Nullable String category) {
610622
this.category = category;
611623
}
612624

625+
/**
626+
* Returns the origin
627+
*
628+
* @return the origin
629+
*/
630+
public @Nullable String getOrigin() {
631+
return origin;
632+
}
633+
634+
/**
635+
* Sets the origin
636+
*
637+
* @param origin the origin
638+
*/
639+
public void setOrigin(@Nullable String origin) {
640+
this.origin = origin;
641+
}
642+
613643
/**
614644
* Returns the SentryLevel
615645
*
@@ -638,12 +668,13 @@ public boolean equals(Object o) {
638668
&& Objects.equals(message, that.message)
639669
&& Objects.equals(type, that.type)
640670
&& Objects.equals(category, that.category)
671+
&& Objects.equals(origin, that.origin)
641672
&& level == that.level;
642673
}
643674

644675
@Override
645676
public int hashCode() {
646-
return Objects.hash(timestamp, message, type, category, level);
677+
return Objects.hash(timestamp, message, type, category, origin, level);
647678
}
648679

649680
// region json
@@ -665,6 +696,7 @@ public static final class JsonKeys {
665696
public static final String TYPE = "type";
666697
public static final String DATA = "data";
667698
public static final String CATEGORY = "category";
699+
public static final String ORIGIN = "origin";
668700
public static final String LEVEL = "level";
669701
}
670702

@@ -683,6 +715,9 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
683715
if (category != null) {
684716
writer.name(JsonKeys.CATEGORY).value(category);
685717
}
718+
if (origin != null) {
719+
writer.name(JsonKeys.ORIGIN).value(origin);
720+
}
686721
if (level != null) {
687722
writer.name(JsonKeys.LEVEL).value(logger, level);
688723
}
@@ -707,6 +742,7 @@ public static final class Deserializer implements JsonDeserializer<Breadcrumb> {
707742
String type = null;
708743
@NotNull Map<String, Object> data = new ConcurrentHashMap<>();
709744
String category = null;
745+
String origin = null;
710746
SentryLevel level = null;
711747

712748
Map<String, Object> unknown = null;
@@ -736,6 +772,9 @@ public static final class Deserializer implements JsonDeserializer<Breadcrumb> {
736772
case JsonKeys.CATEGORY:
737773
category = reader.nextStringOrNull();
738774
break;
775+
case JsonKeys.ORIGIN:
776+
origin = reader.nextStringOrNull();
777+
break;
739778
case JsonKeys.LEVEL:
740779
try {
741780
level = new SentryLevel.Deserializer().deserialize(reader, logger);
@@ -757,6 +796,7 @@ public static final class Deserializer implements JsonDeserializer<Breadcrumb> {
757796
breadcrumb.type = type;
758797
breadcrumb.data = data;
759798
breadcrumb.category = category;
799+
breadcrumb.origin = origin;
760800
breadcrumb.level = level;
761801

762802
breadcrumb.setUnknown(unknown);

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

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class BreadcrumbTest {
2121
val level = SentryLevel.DEBUG
2222
breadcrumb.level = level
2323
breadcrumb.category = "category"
24+
breadcrumb.origin = "origin"
2425

2526
val clone = Breadcrumb(breadcrumb)
2627

@@ -44,6 +45,7 @@ class BreadcrumbTest {
4445
val level = SentryLevel.DEBUG
4546
breadcrumb.level = level
4647
breadcrumb.category = "category"
48+
breadcrumb.origin = "origin"
4749

4850
val clone = Breadcrumb(breadcrumb)
4951

@@ -53,6 +55,7 @@ class BreadcrumbTest {
5355
assertEquals("type", clone.type)
5456
assertEquals(SentryLevel.DEBUG, clone.level)
5557
assertEquals("category", clone.category)
58+
assertEquals("origin", clone.origin)
5659
}
5760

5861
@Test
@@ -67,6 +70,7 @@ class BreadcrumbTest {
6770
val level = SentryLevel.DEBUG
6871
breadcrumb.level = level
6972
breadcrumb.category = "category"
73+
breadcrumb.origin = "origin"
7074

7175
val clone = Breadcrumb(breadcrumb)
7276

@@ -77,6 +81,7 @@ class BreadcrumbTest {
7781
breadcrumb.type = "newType"
7882
breadcrumb.level = SentryLevel.FATAL
7983
breadcrumb.category = "newCategory"
84+
breadcrumb.origin = "newOrigin"
8085

8186
assertEquals("message", clone.message)
8287
assertEquals("data", clone.data["data"])
@@ -86,6 +91,7 @@ class BreadcrumbTest {
8691
assertEquals("type", clone.type)
8792
assertEquals(SentryLevel.DEBUG, clone.level)
8893
assertEquals("category", clone.category)
94+
assertEquals("origin", clone.origin)
8995
}
9096

9197
@Test

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

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class BreadcrumbSerializationTest {
2828
type = "ace57e2e-305e-4048-abf0-6c8538ea7bf4"
2929
setData("6607d106-d426-462b-af74-f29fce978e48", "149bb94a-1387-4484-90be-2df15d1322ab")
3030
category = "b6eea851-5ae5-40ed-8fdd-5e1a655a879c"
31+
origin = "4d8085ef-22fc-49d5-801e-55d509fd1a1c"
3132
level = SentryLevel.DEBUG
3233
}
3334
}
@@ -59,6 +60,7 @@ class BreadcrumbSerializationTest {
5960
"6607d106-d426-462b-af74-f29fce978e48" to "149bb94a-1387-4484-90be-2df15d1322ab"
6061
),
6162
"category" to "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
63+
"origin" to "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
6264
"level" to "debug"
6365
)
6466
val actual = Breadcrumb.fromMap(map, SentryOptions())
@@ -69,6 +71,7 @@ class BreadcrumbSerializationTest {
6971
assertEquals(expected.type, actual?.type)
7072
assertEquals(expected.data, actual?.data)
7173
assertEquals(expected.category, actual?.category)
74+
assertEquals(expected.origin, actual?.origin)
7275
assertEquals(expected.level, actual?.level)
7376
}
7477

sentry/src/test/resources/json/breadcrumb.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
88
},
99
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
10+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
1011
"level": "debug"
1112
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
208208
},
209209
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
210+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
210211
"level": "debug"
211212
}
212213
],

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

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@
207207
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
208208
},
209209
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
210+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
210211
"level": "debug"
211212
}
212213
],

sentry/src/test/resources/json/sentry_event.json

+1
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@
342342
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
343343
},
344344
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
345+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
345346
"level": "debug"
346347
}
347348
],

sentry/src/test/resources/json/sentry_transaction.json

+1
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@
290290
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
291291
},
292292
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
293+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
293294
"level": "debug"
294295
}
295296
],

sentry/src/test/resources/json/sentry_transaction_legacy_date_format.json

+1
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@
290290
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
291291
},
292292
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
293+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
293294
"level": "debug"
294295
}
295296
],

sentry/src/test/resources/json/sentry_transaction_no_measurement_unit.json

+1
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
"6607d106-d426-462b-af74-f29fce978e48": "149bb94a-1387-4484-90be-2df15d1322ab"
258258
},
259259
"category": "b6eea851-5ae5-40ed-8fdd-5e1a655a879c",
260+
"origin": "4d8085ef-22fc-49d5-801e-55d509fd1a1c",
260261
"level": "debug"
261262
}
262263
],

0 commit comments

Comments
 (0)