From 9191dc32a104ea2d7f4bd74ddaa47e85d13d1b4e Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 14:36:27 +0100 Subject: [PATCH 1/8] Add sample rate configuration --- .../extensions/SentryOptionsExtensions.apple.kt | 3 +++ .../extensions/SentryOptionsExtensions.jvm.kt | 2 ++ .../sentry/kotlin/multiplatform/SentryOptions.kt | 16 +++++++++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index 5d73d6cd..e17e1e9c 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -9,6 +9,7 @@ import io.sentry.kotlin.multiplatform.SentryEvent import io.sentry.kotlin.multiplatform.SentryOptions import io.sentry.kotlin.multiplatform.nsexception.dropKotlinCrashEvent import kotlinx.cinterop.convert +import platform.Foundation.NSNumber import NSException.Sentry.SentryEvent as NSExceptionSentryEvent internal fun SentryOptions.toCocoaOptionsConfiguration(): (CocoaSentryOptions?) -> Unit = { @@ -32,6 +33,8 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { enableAutoSessionTracking = options.enableAutoSessionTracking maxAttachmentSize = options.maxAttachmentSize.convert() maxBreadcrumbs = options.maxBreadcrumbs.convert() + sampleRate = options.sampleRate as? NSNumber + tracesSampleRate = options.tracesSampleRate as? NSNumber beforeSend = { event -> val cocoaName = BuildKonfig.SENTRY_COCOA_PACKAGE_NAME val cocoaVersion = BuildKonfig.SENTRY_COCOA_VERSION diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt index 8b6ef6ed..3821083b 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt @@ -40,6 +40,8 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(options: SentryOptions) { isEnableAutoSessionTracking = options.enableAutoSessionTracking maxAttachmentSize = options.maxAttachmentSize maxBreadcrumbs = options.maxBreadcrumbs + sampleRate = options.sampleRate + tracesSampleRate = options.tracesSampleRate setBeforeBreadcrumb { jvmBreadcrumb, _ -> if (options.beforeBreadcrumb == null) { jvmBreadcrumb 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 55b66f83..b29688f0 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 @@ -3,13 +3,13 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SdkVersion + private const val DEFAULT_MAX_BREADCRUMBS = 100 private const val DEFAULT_MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024L private const val DEFAULT_SESSION_INTERVAL_MILLIS = 30000L /** Sentry options that can be used to configure the SDK. */ public open class SentryOptions { - /** * The DSN tells the SDK where to send the events to. If this value is not provided, the SDK will * just not send any events. @@ -107,4 +107,18 @@ public open class SentryOptions { * Available on Apple. */ public var failedRequestTargets: List = listOf(".*") + + /** + * Configures the sample rate as a percentage of events to be sent in the range of 0.0 to 1.0. if + * 1.0 is set it means that 100% of events are sent. If set to 0.1 only 10% of events will be + * sent. Events are picked randomly. Default is null (disabled) + */ + public var sampleRate: Double? = null + + /** + * Configures the sample rate as a percentage of transactions to be sent in the range of 0.0 to + * 1.0. if 1.0 is set it means that 100% of transactions are sent. If set to 0.1 only 10% of + * transactions will be sent. Transactions are picked randomly. Default is null (disabled) + */ + public var tracesSampleRate: Double? = null } From da27dedd39ca15164a82146f05f6857df0db37af Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 16:04:43 +0100 Subject: [PATCH 2/8] fix formatting --- .../kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt | 1 - 1 file changed, 1 deletion(-) 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 b29688f0..b8cbb8eb 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 @@ -3,7 +3,6 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SdkVersion - private const val DEFAULT_MAX_BREADCRUMBS = 100 private const val DEFAULT_MAX_ATTACHMENT_SIZE = 20 * 1024 * 1024L private const val DEFAULT_SESSION_INTERVAL_MILLIS = 30000L From 76f9e4d86fbbe4b9c4021ac9d9abbe3e9d3aadff Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 16:11:35 +0100 Subject: [PATCH 3/8] run api dump --- .../api/android/sentry-kotlin-multiplatform.api | 4 ++++ .../api/jvm/sentry-kotlin-multiplatform.api | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api index 2107b08d..074d7115 100644 --- a/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api @@ -173,8 +173,10 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun getMaxAttachmentSize ()J public final fun getMaxBreadcrumbs ()I 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 getSessionTrackingIntervalMillis ()J + public final fun getTracesSampleRate ()Ljava/lang/Double; public final fun setAttachScreenshot (Z)V public final fun setAttachStackTrace (Z)V public final fun setAttachThreads (Z)V @@ -192,8 +194,10 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun setMaxAttachmentSize (J)V public final fun setMaxBreadcrumbs (I)V 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 setSessionTrackingIntervalMillis (J)V + public final fun setTracesSampleRate (Ljava/lang/Double;)V } public final class io/sentry/kotlin/multiplatform/protocol/Breadcrumb { diff --git a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api index 3ee9b135..c79819de 100644 --- a/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api +++ b/sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api @@ -170,8 +170,10 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun getMaxAttachmentSize ()J public final fun getMaxBreadcrumbs ()I 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 getSessionTrackingIntervalMillis ()J + public final fun getTracesSampleRate ()Ljava/lang/Double; public final fun setAttachScreenshot (Z)V public final fun setAttachStackTrace (Z)V public final fun setAttachThreads (Z)V @@ -189,8 +191,10 @@ public class io/sentry/kotlin/multiplatform/SentryOptions { public final fun setMaxAttachmentSize (J)V public final fun setMaxBreadcrumbs (I)V 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 setSessionTrackingIntervalMillis (J)V + public final fun setTracesSampleRate (Ljava/lang/Double;)V } public final class io/sentry/kotlin/multiplatform/protocol/Breadcrumb { From 70328c82fc2a37a5554c9fb575f992fadeeb2c05 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 17:52:02 +0100 Subject: [PATCH 4/8] Set to NSNumber --- .../extensions/SentryOptionsExtensions.apple.kt | 8 ++++++-- .../kotlin/multiplatform/FoundationTest.kt | 1 - .../kotlin/multiplatform/SentryOptionsTest.kt | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index e17e1e9c..ed455006 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -33,8 +33,12 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { enableAutoSessionTracking = options.enableAutoSessionTracking maxAttachmentSize = options.maxAttachmentSize.convert() maxBreadcrumbs = options.maxBreadcrumbs.convert() - sampleRate = options.sampleRate as? NSNumber - tracesSampleRate = options.tracesSampleRate as? NSNumber + options.sampleRate?.let { + sampleRate = NSNumber(it) + } + options.tracesSampleRate?.let { + tracesSampleRate = NSNumber(it) + } beforeSend = { event -> val cocoaName = BuildKonfig.SENTRY_COCOA_PACKAGE_NAME val cocoaVersion = BuildKonfig.SENTRY_COCOA_VERSION diff --git a/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/FoundationTest.kt b/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/FoundationTest.kt index 459ed529..1218677b 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/FoundationTest.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleTest/kotlin/io/sentry/kotlin/multiplatform/FoundationTest.kt @@ -11,7 +11,6 @@ import kotlin.test.assertContentEquals import kotlin.test.assertEquals class FoundationTest { - @Test fun `convert string to NSData and ByteArray is correct`() { val text = "$!()I!(DKDASKDKSD(#(ldkiadjk91jd" 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 2cfb7719..1efb39e6 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 @@ -1,10 +1,25 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.protocol.Breadcrumb +import io.sentry.kotlin.multiplatform.utils.fakeDsn import kotlin.test.Test import kotlin.test.assertEquals -class SentryOptionsTest { +class SentryOptionsTest : BaseSentryTest() { + @Test + fun `GIVEN sample rate WHEN set in Sentry init THEN does not crash`() { + // GIVEN + val sampleRate = 0.5 + + // WHEN + sentryInit { + it.dsn = fakeDsn + it.sampleRate = sampleRate + } + + // THEN + // does not crash + } @Test fun `Breadcrumb can be modified via callback in init and should return the modified Breadcrumb`() { From 3695aae75fcd26ea12c10f97bedcce87d86c3866 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 17:54:17 +0100 Subject: [PATCH 5/8] Modify NSNumber usage --- .../multiplatform/extensions/SentryOptionsExtensions.apple.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index ed455006..34063c1a 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -34,10 +34,10 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { maxAttachmentSize = options.maxAttachmentSize.convert() maxBreadcrumbs = options.maxBreadcrumbs.convert() options.sampleRate?.let { - sampleRate = NSNumber(it) + sampleRate = NSNumber(double = it) } options.tracesSampleRate?.let { - tracesSampleRate = NSNumber(it) + tracesSampleRate = NSNumber(double = it) } beforeSend = { event -> val cocoaName = BuildKonfig.SENTRY_COCOA_PACKAGE_NAME From 5b1313d10c8dda3f447e25ed7cce4c65aa5c1537 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 17:56:46 +0100 Subject: [PATCH 6/8] Add another test --- .../kotlin/multiplatform/SentryOptionsTest.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 1efb39e6..29f95bab 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 @@ -21,6 +21,21 @@ class SentryOptionsTest : BaseSentryTest() { // does not crash } + @Test + fun `GIVEN traces sample rate WHEN set in Sentry init THEN does not crash`() { + // GIVEN + val traceSampleRate = 0.5 + + // WHEN + sentryInit { + it.dsn = fakeDsn + it.tracesSampleRate = traceSampleRate + } + + // THEN + // does not crash + } + @Test fun `Breadcrumb can be modified via callback in init and should return the modified Breadcrumb`() { val options = SentryOptions() From 2a4e822bf4e6748cd21314ebfcbc253927a0342a Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 17:58:04 +0100 Subject: [PATCH 7/8] Add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23f4f114..24925f31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Features +- Add sample & trace rate configuration ([#144](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/144)) - Remove need for context in Sentry.init for Android ([#117](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/117)) ### Dependencies From 9e3bae0222fbf11ff38c929b2e3bc663e66e4ba5 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 9 Nov 2023 18:39:23 +0100 Subject: [PATCH 8/8] Ignore file for detekt --- config/detekt/detekt.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index 87ad3345..818763de 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -26,4 +26,7 @@ complexity: "**/JvmScopeProvider.kt", "**/Breadcrumb.kt", ] + LongMethod: + excludes: + - "**/SentryOptionsExtensions.*"