From 909014722d39474618619712114496bc79d8218d Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 16 Apr 2025 16:08:54 +0200 Subject: [PATCH 1/5] Move replay out of experimental --- .../SentryOptionsExtensions.android.kt | 10 +++++----- .../kotlin/multiplatform/SentryOptions.kt | 14 ++++++------- .../kotlin/multiplatform/SentryOptionsTest.kt | 20 +++++++++---------- .../extensions/SentryOptionsExtensions.ios.kt | 10 +++++----- .../multiplatform/PlatformOptions.ios.kt | 10 +++++----- .../kotlin/sample.kmp.app/SentrySetup.kt | 4 ++-- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.android.kt index 9ce3d67d..910d6706 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.android.kt @@ -22,15 +22,15 @@ internal fun SentryOptions.toAndroidSentryOptionsCallback(): (SentryAndroidOptio // Replay options androidOptions.sessionReplay.maskAllText = - kmpOptions.experimental.sessionReplay.maskAllText + kmpOptions.sessionReplay.maskAllText androidOptions.sessionReplay.maskAllImages = - kmpOptions.experimental.sessionReplay.maskAllImages + kmpOptions.sessionReplay.maskAllImages androidOptions.sessionReplay.sessionSampleRate = - kmpOptions.experimental.sessionReplay.sessionSampleRate + kmpOptions.sessionReplay.sessionSampleRate androidOptions.sessionReplay.onErrorSampleRate = - kmpOptions.experimental.sessionReplay.onErrorSampleRate + kmpOptions.sessionReplay.onErrorSampleRate androidOptions.sessionReplay.quality = - kmpOptions.experimental.sessionReplay.quality.toAndroidSentryQuality() + kmpOptions.sessionReplay.quality.toAndroidSentryQuality() // kForEach solves an issue with linter where it thinks forEach is the Java version // see here: https://stackoverflow.com/questions/44751469/kotlin-extension-functions-suddenly-require-api-level-24/68897591#68897591 diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt index a76ecb7b..fa3be932 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt @@ -200,11 +200,11 @@ public open class SentryOptions { * * Beware that experimental options can change at any time. */ - public class ExperimentalOptions { - /** - * Experimental feature. The options for session replay. - * Currently available for **Android** and **iOS**. - */ - public var sessionReplay: SentryReplayOptions = SentryReplayOptions() - } + public class ExperimentalOptions + + /** + * Experimental feature. The options for session replay. + * Currently available for **Android** and **iOS**. + */ + public var sessionReplay: SentryReplayOptions = SentryReplayOptions() } diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt index 73bb53ae..40b7b431 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt @@ -127,11 +127,11 @@ class SentryOptionsTest : BaseSentryTest() { assertEquals(2000L, options.appHangTimeoutIntervalMillis) assertTrue(options.isAnrEnabled) assertEquals(5000L, options.anrTimeoutIntervalMillis) - assertNull(options.experimental.sessionReplay.onErrorSampleRate) - assertNull(options.experimental.sessionReplay.sessionSampleRate) - assertTrue(options.experimental.sessionReplay.maskAllText) - assertTrue(options.experimental.sessionReplay.maskAllImages) - assertEquals(SentryReplayOptions.Quality.MEDIUM, options.experimental.sessionReplay.quality) + assertNull(options.sessionReplay.onErrorSampleRate) + assertNull(options.sessionReplay.sessionSampleRate) + assertTrue(options.sessionReplay.maskAllText) + assertTrue(options.sessionReplay.maskAllImages) + assertEquals(SentryReplayOptions.Quality.MEDIUM, options.sessionReplay.quality) assertTrue(options.enableWatchdogTerminationTracking) } @@ -158,11 +158,11 @@ class SentryOptionsTest : BaseSentryTest() { isAnrEnabled = false anrTimeoutIntervalMillis = 1000L enableWatchdogTerminationTracking = false - experimental.sessionReplay.onErrorSampleRate = 0.5 - experimental.sessionReplay.sessionSampleRate = 0.5 - experimental.sessionReplay.maskAllText = false - experimental.sessionReplay.maskAllImages = false - experimental.sessionReplay.quality = SentryReplayOptions.Quality.LOW + sessionReplay.onErrorSampleRate = 0.5 + sessionReplay.sessionSampleRate = 0.5 + sessionReplay.maskAllText = false + sessionReplay.maskAllImages = false + sessionReplay.quality = SentryReplayOptions.Quality.LOW } val platformOptions = createPlatformOptions() diff --git a/sentry-kotlin-multiplatform/src/iosMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.ios.kt b/sentry-kotlin-multiplatform/src/iosMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.ios.kt index 7efdd657..f5311921 100644 --- a/sentry-kotlin-multiplatform/src/iosMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.ios.kt +++ b/sentry-kotlin-multiplatform/src/iosMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.ios.kt @@ -20,13 +20,13 @@ internal fun SentryOptions.toIosOptionsConfiguration(): (CocoaSentryOptions?) -> dictionary = mapOf( // Setting the onErrorSampleRate like this, using setOnErrorSampleRate // crashes on compose multiplatform for some unknown reason - "errorSampleRate" to kmpOptions.experimental.sessionReplay.onErrorSampleRate?.toFloat() + "errorSampleRate" to kmpOptions.sessionReplay.onErrorSampleRate?.toFloat() ) ).apply { - setMaskAllText(kmpOptions.experimental.sessionReplay.maskAllText) - setMaskAllImages(kmpOptions.experimental.sessionReplay.maskAllImages) - kmpOptions.experimental.sessionReplay.sessionSampleRate?.let { setSessionSampleRate(it.toFloat()) } - setQuality(kmpOptions.experimental.sessionReplay.quality.ordinal.toLong()) + setMaskAllText(kmpOptions.sessionReplay.maskAllText) + setMaskAllImages(kmpOptions.sessionReplay.maskAllImages) + kmpOptions.sessionReplay.sessionSampleRate?.let { setSessionSampleRate(it.toFloat()) } + setQuality(kmpOptions.sessionReplay.quality.ordinal.toLong()) } cocoaOptions.setSessionReplay(replayOptions) } ?: run { diff --git a/sentry-kotlin-multiplatform/src/iosTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.ios.kt b/sentry-kotlin-multiplatform/src/iosTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.ios.kt index e3305e60..a4840529 100644 --- a/sentry-kotlin-multiplatform/src/iosTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.ios.kt +++ b/sentry-kotlin-multiplatform/src/iosTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.ios.kt @@ -40,9 +40,9 @@ actual fun ApplePlatformOptions.assertApplePlatformSpecificOptions(options: Sent assertEquals(attachViewHierarchy, options.attachViewHierarchy) assertEquals(enableAppHangTracking, options.enableAppHangTracking) assertEquals(appHangTimeoutIntervalMillis, options.appHangTimeoutIntervalMillis) - assertEquals(sessionReplay.maskAllText(), options.experimental.sessionReplay.maskAllText) - assertEquals(sessionReplay.maskAllImages(), options.experimental.sessionReplay.maskAllImages) - assertEquals(sessionReplay.onErrorSampleRate().toDouble(), options.experimental.sessionReplay.onErrorSampleRate) - assertEquals(sessionReplay.sessionSampleRate().toDouble(), options.experimental.sessionReplay.sessionSampleRate) - assertEquals(sessionReplay.quality(), options.experimental.sessionReplay.quality.ordinal.toLong()) + assertEquals(sessionReplay.maskAllText(), options.sessionReplay.maskAllText) + assertEquals(sessionReplay.maskAllImages(), options.sessionReplay.maskAllImages) + assertEquals(sessionReplay.onErrorSampleRate().toDouble(), options.sessionReplay.onErrorSampleRate) + assertEquals(sessionReplay.sessionSampleRate().toDouble(), options.sessionReplay.sessionSampleRate) + assertEquals(sessionReplay.quality(), options.sessionReplay.quality.ordinal.toLong()) } diff --git a/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt b/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt index 4926385f..c4bd5cdc 100644 --- a/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt +++ b/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt @@ -46,8 +46,8 @@ private fun optionsConfiguration(): OptionsConfiguration { it.debug = true it.failedRequestStatusCodes = listOf(HttpStatusCodeRange(400, 599)) it.failedRequestTargets = listOf("httpbin.org") - it.experimental.sessionReplay.onErrorSampleRate = 1.0 - it.experimental.sessionReplay.sessionSampleRate = 1.0 + it.sessionReplay.onErrorSampleRate = 1.0 + it.sessionReplay.sessionSampleRate = 1.0 it.beforeBreadcrumb = { breadcrumb -> breadcrumb.message = "Add message before every breadcrumb" breadcrumb From 63bbee26535ad799e34d88996b43b4da783d0ba1 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 16 Apr 2025 16:09:30 +0200 Subject: [PATCH 2/5] Move replay out of experimental --- .../io/sentry/kotlin/multiplatform/SentryOptions.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt index fa3be932..9f59f3a9 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt @@ -185,6 +185,12 @@ public open class SentryOptions { */ public var enableWatchdogTerminationTracking: Boolean = true + /** + * The options for session replay. + * Currently available for **Android** and **iOS**. + */ + public var sessionReplay: SentryReplayOptions = SentryReplayOptions() + /** * Experimental options for new features, these options are going to be promoted to SentryOptions * before GA. @@ -201,10 +207,4 @@ public open class SentryOptions { * Beware that experimental options can change at any time. */ public class ExperimentalOptions - - /** - * Experimental feature. The options for session replay. - * Currently available for **Android** and **iOS**. - */ - public var sessionReplay: SentryReplayOptions = SentryReplayOptions() } From c9aa143ab1f40820436d7f7da4c04af39911f44a Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 00:08:15 +0200 Subject: [PATCH 3/5] Update api --- .../api/android/sentry-kotlin-multiplatform.api | 4 ++-- .../api/jvm/sentry-kotlin-multiplatform.api | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api index bcc670c4..e479b79a 100644 --- a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api @@ -185,6 +185,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun getRelease ()Ljava/lang/String; public final fun getSampleRate ()Ljava/lang/Double; public final fun getSdk ()Lio/sentry/kotlin/multiplatform/protocol/SdkVersion; + public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions; public final fun getSessionTrackingIntervalMillis ()J public final fun getTracesSampleRate ()Ljava/lang/Double; public final fun isAnrEnabled ()Z @@ -213,14 +214,13 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun setRelease (Ljava/lang/String;)V public final fun setSampleRate (Ljava/lang/Double;)V public final fun setSdk (Lio/sentry/kotlin/multiplatform/protocol/SdkVersion;)V + public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V public final fun setSessionTrackingIntervalMillis (J)V public final fun setTracesSampleRate (Ljava/lang/Double;)V } public final class io/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions { public fun ()V - public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions; - public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V } public final class io/sentry/kotlin/multiplatform/SentryReplayOptions { diff --git a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api index 5c2b139d..e0779801 100644 --- a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api @@ -182,6 +182,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun getRelease ()Ljava/lang/String; public final fun getSampleRate ()Ljava/lang/Double; public final fun getSdk ()Lio/sentry/kotlin/multiplatform/protocol/SdkVersion; + public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions; public final fun getSessionTrackingIntervalMillis ()J public final fun getTracesSampleRate ()Ljava/lang/Double; public final fun isAnrEnabled ()Z @@ -210,14 +211,13 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun setRelease (Ljava/lang/String;)V public final fun setSampleRate (Ljava/lang/Double;)V public final fun setSdk (Lio/sentry/kotlin/multiplatform/protocol/SdkVersion;)V + public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V public final fun setSessionTrackingIntervalMillis (J)V public final fun setTracesSampleRate (Ljava/lang/Double;)V } public final class io/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions { public fun ()V - public final fun getSessionReplay ()Lio/sentry/kotlin/multiplatform/SentryReplayOptions; - public final fun setSessionReplay (Lio/sentry/kotlin/multiplatform/SentryReplayOptions;)V } public final class io/sentry/kotlin/multiplatform/SentryReplayOptions { From 400c77907c1e81e672fb0483aba9886b03bc10cb Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 00:09:27 +0200 Subject: [PATCH 4/5] Update CHANGELOG --- CHANGELOG.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00653181..66c33267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +### Feature + +- Move replay options out of experimental ([#367](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/367)) + - You can now access the replay options via `options.sessionReplay` + ### Fixes - Do not throw if exec operation fails ([#360](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/360)) @@ -43,8 +48,8 @@ ```kotlin Sentry.init { options -> // Adjust these values for production - options.experimental.sessionReplay.onErrorSampleRate = 1.0 - options.experimental.sessionReplay.sessionSampleRate = 1.0 + options.sessionReplay.onErrorSampleRate = 1.0 + options.sessionReplay.sessionSampleRate = 1.0 } ``` - Add `Sentry.isEnabled()` API to common code ([#273](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/273)) From 9d17fa884e37cdf01b06b4fa044c00fddb80388a Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 00:15:03 +0200 Subject: [PATCH 5/5] Update test --- .../io/sentry/kotlin/multiplatform/PlatformOptions.android.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt index 4dda0bb6..02a7e439 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt @@ -88,7 +88,7 @@ actual fun PlatformOptions.assertPlatformSpecificOptions(kmpOptions: SentryOptio assertEquals(androidOptions.isAnrEnabled, kmpOptions.isAnrEnabled) assertEquals(androidOptions.anrTimeoutIntervalMillis, kmpOptions.anrTimeoutIntervalMillis) - val kmpReplayOptions = kmpOptions.experimental.sessionReplay + val kmpReplayOptions = kmpOptions.sessionReplay assertViewClassMasking( kmpReplayOptions.maskAllText, androidOptions.sessionReplay.maskViewClasses,