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 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.*" 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 { 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..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 @@ -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,12 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { enableAutoSessionTracking = options.enableAutoSessionTracking maxAttachmentSize = options.maxAttachmentSize.convert() maxBreadcrumbs = options.maxBreadcrumbs.convert() + options.sampleRate?.let { + sampleRate = NSNumber(double = it) + } + options.tracesSampleRate?.let { + tracesSampleRate = NSNumber(double = 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/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..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 @@ -9,7 +9,6 @@ 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 +106,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 } 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..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 @@ -1,10 +1,40 @@ 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 `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`() {