From 646ea3b72537d0377fd735b639c5509cf4049f64 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 10 Mar 2023 11:46:08 +0100 Subject: [PATCH 1/4] add options --- .../kotlin/multiplatform/SentryBridge.kt | 12 +++++++++++ .../extensions/SentryOptionsExtensions.kt | 4 +++- .../kotlin/multiplatform/SentryBridge.kt | 12 +++++++++++ .../extensions/SentryOptionsExtensions.kt | 7 +++---- .../kotlin/multiplatform/SentryBridge.kt | 6 ++++++ .../kotlin/multiplatform/SentryOptions.kt | 8 ++++++- .../kotlin/multiplatform/SentryOptionsTest.kt | 21 +++++++++++++++++++ 7 files changed, 64 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index ed4579ec..a77e0276 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -1,9 +1,13 @@ package io.sentry.kotlin.multiplatform import cocoapods.Sentry.SentrySDK +import io.sentry.kotlin.multiplatform.extensions.toCocoaBreadcrumb +import io.sentry.kotlin.multiplatform.extensions.toCocoaUser import io.sentry.kotlin.multiplatform.extensions.toCocoaUserFeedback import io.sentry.kotlin.multiplatform.nsexception.asNSException +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User import io.sentry.kotlin.multiplatform.protocol.UserFeedback import platform.Foundation.NSError import platform.Foundation.NSException @@ -50,6 +54,14 @@ internal actual object SentryBridge { SentrySDK.configureScope(configureScopeCallback(scopeCallback)) } + actual fun addBreadcrumb(breadcrumb: Breadcrumb) { + SentrySDK.addBreadcrumb(breadcrumb.toCocoaBreadcrumb()) + } + + actual fun setUser(user: User) { + SentrySDK.setUser(user.toCocoaUser()) + } + actual fun close() { SentrySDK.close() } diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt index 1f0f8347..8490e652 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt @@ -28,6 +28,8 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { this.debug = options.debug this.sessionTrackingIntervalMillis = options.sessionTrackingIntervalMillis.convert() this.enableAutoSessionTracking = options.enableAutoSessionTracking + this.maxAttachmentSize = options.maxAttachmentSize.convert() + this.maxBreadcrumbs = options.maxBreadcrumbs.convert() this.beforeSend = { event -> dropKotlinCrashEvent(event as NSExceptionSentryEvent?) as SentryEvent? @@ -53,6 +55,6 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) { PrivateSentrySDKOnly.setSdkName(options.sdk.name, options.sdk.version) this.beforeBreadcrumb = { cocoaBreadcrumb -> cocoaBreadcrumb?.toKmpBreadcrumb() - .apply { this?.let { options.beforeBreadcrumb?.invoke(it) } }?.toCocoaBreadcrumb() + ?.let { options.beforeBreadcrumb?.invoke(it) }?.toCocoaBreadcrumb() } } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index ad51c830..f862de5b 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -1,8 +1,12 @@ package io.sentry.kotlin.multiplatform import io.sentry.Sentry +import io.sentry.kotlin.multiplatform.extensions.toJvmBreadcrumb +import io.sentry.kotlin.multiplatform.extensions.toJvmUser import io.sentry.kotlin.multiplatform.extensions.toJvmUserFeedback +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User import io.sentry.kotlin.multiplatform.protocol.UserFeedback internal expect fun initSentry(context: Context? = null, configuration: OptionsConfiguration) @@ -45,6 +49,14 @@ internal actual object SentryBridge { Sentry.configureScope(configureScopeCallback(scopeCallback)) } + actual fun addBreadcrumb(breadcrumb: Breadcrumb) { + Sentry.addBreadcrumb(breadcrumb.toJvmBreadcrumb()) + } + + actual fun setUser(user: User) { + Sentry.setUser(user.toJvmUser()) + } + actual fun close() { Sentry.close() } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt index 8b36e9f1..08bbabe2 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.kt @@ -28,10 +28,9 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(options: SentryOptions) { this.isDebug = options.debug this.sessionTrackingIntervalMillis = options.sessionTrackingIntervalMillis this.isEnableAutoSessionTracking = options.enableAutoSessionTracking + this.maxAttachmentSize = options.maxAttachmentSize + this.maxBreadcrumbs = options.maxBreadcrumbs this.setBeforeBreadcrumb { jvmBreadcrumb, _ -> - jvmBreadcrumb - .toKmpBreadcrumb() - .apply { options.beforeBreadcrumb?.invoke(this) } - .toJvmBreadcrumb() + options.beforeBreadcrumb?.invoke(jvmBreadcrumb.toKmpBreadcrumb())?.toJvmBreadcrumb() } } diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index a917ae5c..f98f1d66 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -1,6 +1,8 @@ package io.sentry.kotlin.multiplatform +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User import io.sentry.kotlin.multiplatform.protocol.UserFeedback internal expect object SentryBridge { @@ -21,5 +23,9 @@ internal expect object SentryBridge { fun captureUserFeedback(userFeedback: UserFeedback) + fun addBreadcrumb(breadcrumb: Breadcrumb) + + fun setUser(user: User) + fun close() } 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 c0b5bee5..68f017cd 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 @@ -56,8 +56,14 @@ open class SentryOptions { var attachScreenshot = false /** Hook that is triggered before a breadcrumb is sent to Sentry */ - var beforeBreadcrumb: ((Breadcrumb) -> Breadcrumb)? = null + var beforeBreadcrumb: ((Breadcrumb) -> Breadcrumb?)? = null /** Information about the Sentry SDK that generated this event. */ var sdk: SdkVersion = SdkVersion(BuildKonfig.SENTRY_KOTLIN_MULTIPLATFORM_SDK_NAME, BuildKonfig.VERSION_NAME) + + /** This variable controls the total amount of breadcrumbs that should be captured. Default is 100. */ + var maxBreadcrumbs = 100 + + /** This variable controls the max attachment size in bytes */ + var maxAttachmentSize: Long = 20 * 1024 * 1024 } 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 9a93b706..87ff40c4 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 @@ -43,4 +43,25 @@ class SentryOptionsTest { assertEquals(expectedBreadcrumb, modifiedBreadcrumb) } + + @Test + fun `Breadcrumb can be dropped via beforeBreadcrumb hook`() { + val options = SentryOptions() + + fun mockInit(configuration: (SentryOptions) -> Unit) { + configuration.invoke(options) + } + + mockInit { + it.beforeBreadcrumb = { breadcrumb -> + breadcrumb.message = "message" + null + } + } + + val modifiedBreadcrumb = options.beforeBreadcrumb?.invoke(Breadcrumb()) + + assertEquals(null, modifiedBreadcrumb) + } + } From abc919f9c281856dd29278982c15fcd7bf85c8f0 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 10 Mar 2023 11:57:53 +0100 Subject: [PATCH 2/4] add kmp bridge --- .../sentry/kotlin/multiplatform/SentryKMP.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt index 4172383a..11f26a01 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt @@ -1,6 +1,8 @@ package io.sentry.kotlin.multiplatform +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User import io.sentry.kotlin.multiplatform.protocol.UserFeedback typealias ScopeCallback = (Scope) -> Unit @@ -87,6 +89,24 @@ object Sentry { SentryBridge.configureScope(scopeCallback) } + /** + * Adds a breadcrumb to the current Scope. + * + * @param breadcrumb The breadcrumb to add. + */ + fun addBreadcrumb(breadcrumb: Breadcrumb) { + SentryBridge.addBreadcrumb(breadcrumb) + } + + /** + * Sets the user to the current scope. + * + * @param user The user to set. + */ + fun setUser(user: User) { + SentryBridge.setUser(user) + } + /** * Throws a RuntimeException, useful for testing. */ From c21608e31bde16da7a041c6cf01554e8a400e947 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 10 Mar 2023 12:24:48 +0100 Subject: [PATCH 3/4] format test --- .../kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt | 1 - 1 file changed, 1 deletion(-) 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 87ff40c4..2cfb7719 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 @@ -63,5 +63,4 @@ class SentryOptionsTest { assertEquals(null, modifiedBreadcrumb) } - } From 4b8905d602ba9567ed972e0977a722bcfe244456 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 10 Mar 2023 12:32:49 +0100 Subject: [PATCH 4/4] modify setUser to have a nullable user parameter --- .../kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt | 4 ++-- .../kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt | 4 ++-- .../kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt | 2 +- .../kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index a77e0276..03af3283 100644 --- a/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonAppleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -58,8 +58,8 @@ internal actual object SentryBridge { SentrySDK.addBreadcrumb(breadcrumb.toCocoaBreadcrumb()) } - actual fun setUser(user: User) { - SentrySDK.setUser(user.toCocoaUser()) + actual fun setUser(user: User?) { + SentrySDK.setUser(user?.toCocoaUser()) } actual fun close() { diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index f862de5b..1ef31e00 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -53,8 +53,8 @@ internal actual object SentryBridge { Sentry.addBreadcrumb(breadcrumb.toJvmBreadcrumb()) } - actual fun setUser(user: User) { - Sentry.setUser(user.toJvmUser()) + actual fun setUser(user: User?) { + Sentry.setUser(user?.toJvmUser()) } actual fun close() { diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt index f98f1d66..32c6a074 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.kt @@ -25,7 +25,7 @@ internal expect object SentryBridge { fun addBreadcrumb(breadcrumb: Breadcrumb) - fun setUser(user: User) + fun setUser(user: User?) fun close() } diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt index 11f26a01..c796c528 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt @@ -103,7 +103,7 @@ object Sentry { * * @param user The user to set. */ - fun setUser(user: User) { + fun setUser(user: User?) { SentryBridge.setUser(user) }