Skip to content

Commit 0ffa4b1

Browse files
committed
Merge branch '8.x.x' into feat/potel-unit-testing
2 parents eb9b830 + ac12613 commit 0ffa4b1

31 files changed

Lines changed: 451 additions & 131 deletions

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
### Breaking Changes
66

7+
- Use String instead of UUID for SessionId ([#3834](https://github.com/getsentry/sentry-java/pull/3834))
8+
- The `Session` constructor now takes a `String` instead of a `UUID` for the `sessionId` parameter.
9+
- `Session.getSessionId()` now returns a `String` instead of a `UUID`.
710
- The Android minSdk level for all Android modules is now 21 ([#3852](https://github.com/getsentry/sentry-java/pull/3852))
811
- The minSdk level for sentry-android-ndk changed from 19 to 21 ([#3851](https://github.com/getsentry/sentry-java/pull/3851))
912

@@ -13,6 +16,9 @@
1316
- `globalHubMode` used to only be a param on `Sentry.init`. To make it easier to be used in e.g. Desktop environments, we now additionally added it as an option on SentryOptions that can also be set via `sentry.properties`.
1417
- If both the param on `Sentry.init` and the option are set, the option will win. By default the option is set to `null` meaning whatever is passed to `Sentry.init` takes effect.
1518
- Lazy uuid generation for SentryId and SpanId ([#3770](https://github.com/getsentry/sentry-java/pull/3770))
19+
- Faster generation of Sentry and Span IDs ([#3818](https://github.com/getsentry/sentry-java/pull/3818))
20+
- Uses faster implementation to convert UUID to SentryID String
21+
- Uses faster Random implementation to generate UUIDs
1622
- Use a separate `Random` instance per thread to improve SDK performance ([#3835](https://github.com/getsentry/sentry-java/pull/3835))
1723
- Android 15: Add support for 16KB page sizes ([#3851](https://github.com/getsentry/sentry-java/pull/3851))
1824
- See https://developer.android.com/guide/practices/page-sizes for more details

sentry-android-core/src/main/java/io/sentry/android/core/AndroidProfiler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.sentry.MemoryCollectionData;
1313
import io.sentry.PerformanceCollectionData;
1414
import io.sentry.SentryLevel;
15+
import io.sentry.SentryUUID;
1516
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
1617
import io.sentry.profilemeasurements.ProfileMeasurement;
1718
import io.sentry.profilemeasurements.ProfileMeasurementValue;
@@ -23,7 +24,6 @@
2324
import java.util.HashMap;
2425
import java.util.List;
2526
import java.util.Map;
26-
import java.util.UUID;
2727
import java.util.concurrent.Future;
2828
import java.util.concurrent.RejectedExecutionException;
2929
import java.util.concurrent.TimeUnit;
@@ -129,7 +129,7 @@ public AndroidProfiler(
129129
}
130130

131131
// We create a file with a uuid name, so no need to check if it already exists
132-
traceFile = new File(traceFilesDir, UUID.randomUUID() + ".trace");
132+
traceFile = new File(traceFilesDir, SentryUUID.generateSentryId() + ".trace");
133133

134134
measurementsMap.clear();
135135
screenFrameRateMeasurements.clear();

sentry-android-core/src/main/java/io/sentry/android/core/Installation.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import android.content.Context;
44
import io.sentry.ISentryLifecycleToken;
5+
import io.sentry.SentryUUID;
56
import io.sentry.util.AutoClosableReentrantLock;
67
import java.io.File;
78
import java.io.FileOutputStream;
89
import java.io.IOException;
910
import java.io.OutputStream;
1011
import java.io.RandomAccessFile;
1112
import java.nio.charset.Charset;
12-
import java.util.UUID;
1313
import org.jetbrains.annotations.NotNull;
1414
import org.jetbrains.annotations.Nullable;
1515
import org.jetbrains.annotations.TestOnly;
@@ -65,7 +65,7 @@ public static String id(final @NotNull Context context) throws RuntimeException
6565
static @NotNull String writeInstallationFile(final @NotNull File installation)
6666
throws IOException {
6767
try (final OutputStream out = new FileOutputStream(installation)) {
68-
final String id = UUID.randomUUID().toString();
68+
final String id = SentryUUID.generateSentryId();
6969
out.write(id.getBytes(UTF_8));
7070
out.flush();
7171
return id;

sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
import io.sentry.ILogger;
1717
import io.sentry.SentryLevel;
1818
import io.sentry.SentryOptions;
19+
import io.sentry.SentryUUID;
1920
import io.sentry.android.core.BuildInfoProvider;
2021
import io.sentry.android.core.ContextUtils;
2122
import io.sentry.util.Objects;
2223
import java.lang.ref.WeakReference;
2324
import java.lang.reflect.Field;
2425
import java.util.Map;
2526
import java.util.Set;
26-
import java.util.UUID;
2727
import java.util.concurrent.ConcurrentHashMap;
2828
import java.util.concurrent.CopyOnWriteArraySet;
2929
import java.util.concurrent.TimeUnit;
@@ -262,7 +262,7 @@ public void onActivityDestroyed(@NotNull Activity activity) {}
262262
if (!isAvailable) {
263263
return null;
264264
}
265-
final String uid = UUID.randomUUID().toString();
265+
final String uid = SentryUUID.generateSentryId();
266266
listenerMap.put(uid, listener);
267267
trackCurrentWindow();
268268
return uid;

sentry-android-core/src/test/java/io/sentry/android/core/LifecycleWatcherTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ class LifecycleWatcherTest {
195195
DateUtils.getCurrentDateTime(),
196196
0,
197197
"abc",
198-
UUID.fromString("3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17"),
198+
"3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17",
199199
true,
200200
0,
201201
10.0,
@@ -222,7 +222,7 @@ class LifecycleWatcherTest {
222222
DateUtils.getDateTime(-1),
223223
0,
224224
"abc",
225-
UUID.fromString("3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17"),
225+
"3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17",
226226
true,
227227
0,
228228
10.0,
@@ -263,7 +263,7 @@ class LifecycleWatcherTest {
263263
DateUtils.getCurrentDateTime(),
264264
0,
265265
"abc",
266-
UUID.fromString("3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17"),
266+
"3c1ffc32-f68f-4af2-a1ee-dd72f4d62d17",
267267
true,
268268
0,
269269
10.0,

sentry-android-integration-tests/sentry-uitest-android-critical/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ android {
1717

1818
defaultConfig {
1919
applicationId = "io.sentry.uitest.android.critical"
20-
minSdk = Config.Android.minSdkVersionCompose
20+
minSdk = Config.Android.minSdkVersion
2121
targetSdk = Config.Android.targetSdkVersion
2222
versionCode = 1
2323
versionName = "1.0"

sentry/api/sentry.api

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3265,14 +3265,19 @@ public final class io/sentry/SentryTracer : io/sentry/ITransaction {
32653265
public fun updateEndDate (Lio/sentry/SentryDate;)Z
32663266
}
32673267

3268+
public final class io/sentry/SentryUUID {
3269+
public static fun generateSentryId ()Ljava/lang/String;
3270+
public static fun generateSpanId ()Ljava/lang/String;
3271+
}
3272+
32683273
public final class io/sentry/SentryWrapper {
32693274
public fun <init> ()V
32703275
public static fun wrapCallable (Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;
32713276
public static fun wrapSupplier (Ljava/util/function/Supplier;)Ljava/util/function/Supplier;
32723277
}
32733278

32743279
public final class io/sentry/Session : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
3275-
public fun <init> (Lio/sentry/Session$State;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/util/UUID;Ljava/lang/Boolean;Ljava/lang/Long;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
3280+
public fun <init> (Lio/sentry/Session$State;Ljava/util/Date;Ljava/util/Date;ILjava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Long;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
32763281
public fun <init> (Ljava/lang/String;Lio/sentry/protocol/User;Ljava/lang/String;Ljava/lang/String;)V
32773282
public fun clone ()Lio/sentry/Session;
32783283
public synthetic fun clone ()Ljava/lang/Object;
@@ -3287,7 +3292,7 @@ public final class io/sentry/Session : io/sentry/JsonSerializable, io/sentry/Jso
32873292
public fun getIpAddress ()Ljava/lang/String;
32883293
public fun getRelease ()Ljava/lang/String;
32893294
public fun getSequence ()Ljava/lang/Long;
3290-
public fun getSessionId ()Ljava/util/UUID;
3295+
public fun getSessionId ()Ljava/lang/String;
32913296
public fun getStarted ()Ljava/util/Date;
32923297
public fun getStatus ()Lio/sentry/Session$State;
32933298
public fun getTimestamp ()Ljava/util/Date;
@@ -6198,6 +6203,20 @@ public final class io/sentry/util/TracingUtils$TracingHeaders {
61986203
public fun getSentryTraceHeader ()Lio/sentry/SentryTraceHeader;
61996204
}
62006205

6206+
public final class io/sentry/util/UUIDGenerator {
6207+
public fun <init> ()V
6208+
public static fun randomHalfLengthUUID ()J
6209+
public static fun randomUUID ()Ljava/util/UUID;
6210+
}
6211+
6212+
public final class io/sentry/util/UUIDStringUtils {
6213+
public fun <init> ()V
6214+
public static fun toSentryIdString (JJ)Ljava/lang/String;
6215+
public static fun toSentryIdString (Ljava/util/UUID;)Ljava/lang/String;
6216+
public static fun toSentrySpanIdString (J)Ljava/lang/String;
6217+
public static fun toSentrySpanIdString (Ljava/util/UUID;)Ljava/lang/String;
6218+
}
6219+
62016220
public final class io/sentry/util/UrlUtils {
62026221
public static final field SENSITIVE_DATA_SUBSTITUTE Ljava/lang/String;
62036222
public fun <init> ()V

sentry/src/main/java/io/sentry/ProfilingTraceData.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.List;
1111
import java.util.Locale;
1212
import java.util.Map;
13-
import java.util.UUID;
1413
import java.util.concurrent.Callable;
1514
import java.util.concurrent.ConcurrentHashMap;
1615
import org.jetbrains.annotations.ApiStatus;
@@ -154,7 +153,7 @@ public ProfilingTraceData(
154153
// Stacktrace context
155154
this.transactionId = transactionId;
156155
this.traceId = traceId;
157-
this.profileId = UUID.randomUUID().toString();
156+
this.profileId = SentryUUID.generateSentryId();
158157
this.environment = environment != null ? environment : DEFAULT_ENVIRONMENT;
159158
this.truncationReason = truncationReason;
160159
if (!isTruncationReasonValid()) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package io.sentry;
2+
3+
import io.sentry.util.UUIDGenerator;
4+
import io.sentry.util.UUIDStringUtils;
5+
6+
/**
7+
* SentryUUID is a utility class for generating Sentry-specific ID Strings. It provides methods for
8+
* generating Sentry IDs and Sentry Span IDs.
9+
*/
10+
public final class SentryUUID {
11+
12+
private SentryUUID() {
13+
// A private constructor prevents callers from accidentally instantiating FastUUID objects
14+
}
15+
16+
public static String generateSentryId() {
17+
return UUIDStringUtils.toSentryIdString(UUIDGenerator.randomUUID());
18+
}
19+
20+
public static String generateSpanId() {
21+
return UUIDStringUtils.toSentrySpanIdString(UUIDGenerator.randomHalfLengthUUID());
22+
}
23+
}

sentry/src/main/java/io/sentry/Session.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.util.Date;
99
import java.util.Locale;
1010
import java.util.Map;
11-
import java.util.UUID;
1211
import java.util.concurrent.ConcurrentHashMap;
1312
import java.util.concurrent.atomic.AtomicInteger;
1413
import org.jetbrains.annotations.ApiStatus;
@@ -38,7 +37,7 @@ public enum State {
3837
private final @Nullable String distinctId;
3938

4039
/** the SessionId, sid */
41-
private final @Nullable UUID sessionId;
40+
private final @Nullable String sessionId;
4241

4342
/** The session init flag */
4443
private @Nullable Boolean init;
@@ -79,7 +78,7 @@ public Session(
7978
final @Nullable Date timestamp,
8079
final int errorCount,
8180
final @Nullable String distinctId,
82-
final @Nullable UUID sessionId,
81+
final @Nullable String sessionId,
8382
final @Nullable Boolean init,
8483
final @Nullable Long sequence,
8584
final @Nullable Double duration,
@@ -115,7 +114,7 @@ public Session(
115114
DateUtils.getCurrentDateTime(),
116115
0,
117116
distinctId,
118-
UUID.randomUUID(),
117+
SentryUUID.generateSentryId(),
119118
true,
120119
null,
121120
null,
@@ -142,7 +141,7 @@ public boolean isTerminated() {
142141
return distinctId;
143142
}
144143

145-
public @Nullable UUID getSessionId() {
144+
public @Nullable String getSessionId() {
146145
return sessionId;
147146
}
148147

@@ -366,7 +365,7 @@ public void serialize(final @NotNull ObjectWriter writer, final @NotNull ILogger
366365
throws IOException {
367366
writer.beginObject();
368367
if (sessionId != null) {
369-
writer.name(JsonKeys.SID).value(sessionId.toString());
368+
writer.name(JsonKeys.SID).value(sessionId);
370369
}
371370
if (distinctId != null) {
372371
writer.name(JsonKeys.DID).value(distinctId);
@@ -435,7 +434,7 @@ public static final class Deserializer implements JsonDeserializer<Session> {
435434
Date timestamp = null;
436435
Integer errorCount = null; // @NotNull
437436
String distinctId = null;
438-
UUID sessionId = null;
437+
String sessionId = null;
439438
Boolean init = null;
440439
State status = null; // @NotNull
441440
Long sequence = null;
@@ -451,12 +450,11 @@ public static final class Deserializer implements JsonDeserializer<Session> {
451450
final String nextName = reader.nextName();
452451
switch (nextName) {
453452
case JsonKeys.SID:
454-
String sidString = null;
455-
try {
456-
sidString = reader.nextStringOrNull();
457-
sessionId = UUID.fromString(sidString);
458-
} catch (IllegalArgumentException e) {
459-
logger.log(SentryLevel.ERROR, "%s sid is not valid.", sidString);
453+
String sid = reader.nextStringOrNull();
454+
if (sid != null && (sid.length() == 36 || sid.length() == 32)) {
455+
sessionId = sid;
456+
} else {
457+
logger.log(SentryLevel.ERROR, "%s sid is not valid.", sid);
460458
}
461459
break;
462460
case JsonKeys.DID:

0 commit comments

Comments
 (0)