Skip to content

Commit 1bf5cc1

Browse files
authoredOct 8, 2024··
Expose enableWatchdogTerminationTracking in common options (#281)
* update * update * format * update * Update CHANGELOG.md * update
1 parent 887ef60 commit 1bf5cc1

File tree

9 files changed

+132
-128
lines changed

9 files changed

+132
-128
lines changed
 

‎CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Sentry.init { options ->
1313
}
1414
```
1515
- Add `Sentry.isEnabled()` API to common code ([#273](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/273))
16+
- Add `enableWatchdogTerminationTracking` in common options ([#281](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/281))
1617

1718
### Dependencies
1819

‎sentry-kotlin-multiplatform/api/android/sentry-kotlin-multiplatform.api

+2
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
174174
public final fun getEnableAppHangTracking ()Z
175175
public final fun getEnableAutoSessionTracking ()Z
176176
public final fun getEnableCaptureFailedRequests ()Z
177+
public final fun getEnableWatchdogTerminationTracking ()Z
177178
public final fun getEnvironment ()Ljava/lang/String;
178179
public final fun getExperimental ()Lio/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions;
179180
public final fun getFailedRequestStatusCodes ()Ljava/util/List;
@@ -201,6 +202,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
201202
public final fun setEnableAppHangTracking (Z)V
202203
public final fun setEnableAutoSessionTracking (Z)V
203204
public final fun setEnableCaptureFailedRequests (Z)V
205+
public final fun setEnableWatchdogTerminationTracking (Z)V
204206
public final fun setEnvironment (Ljava/lang/String;)V
205207
public final fun setFailedRequestStatusCodes (Ljava/util/List;)V
206208
public final fun setFailedRequestTargets (Ljava/util/List;)V

‎sentry-kotlin-multiplatform/api/jvm/sentry-kotlin-multiplatform.api

+2
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
171171
public final fun getEnableAppHangTracking ()Z
172172
public final fun getEnableAutoSessionTracking ()Z
173173
public final fun getEnableCaptureFailedRequests ()Z
174+
public final fun getEnableWatchdogTerminationTracking ()Z
174175
public final fun getEnvironment ()Ljava/lang/String;
175176
public final fun getExperimental ()Lio/sentry/kotlin/multiplatform/SentryOptions$ExperimentalOptions;
176177
public final fun getFailedRequestStatusCodes ()Ljava/util/List;
@@ -198,6 +199,7 @@ public class io/sentry/kotlin/multiplatform/SentryOptions {
198199
public final fun setEnableAppHangTracking (Z)V
199200
public final fun setEnableAutoSessionTracking (Z)V
200201
public final fun setEnableCaptureFailedRequests (Z)V
202+
public final fun setEnableWatchdogTerminationTracking (Z)V
201203
public final fun setEnvironment (Ljava/lang/String;)V
202204
public final fun setFailedRequestStatusCodes (Ljava/util/List;)V
203205
public final fun setFailedRequestTargets (Ljava/util/List;)V

‎sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt

+30-28
Original file line numberDiff line numberDiff line change
@@ -15,60 +15,62 @@ internal fun SentryOptions.toCocoaOptionsConfiguration(): (CocoaSentryOptions?)
1515
* Applies the given options to this CocoaSentryOptions.
1616
* This avoids code duplication for init on iOS.
1717
*/
18-
internal fun CocoaSentryOptions.applyCocoaBaseOptions(options: SentryOptions) {
19-
dsn = options.dsn
20-
attachStacktrace = options.attachStackTrace
21-
dist = options.dist
22-
options.environment?.let {
23-
environment = it
18+
internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) {
19+
val cocoaOptions = this
20+
cocoaOptions.dsn = kmpOptions.dsn
21+
cocoaOptions.attachStacktrace = kmpOptions.attachStackTrace
22+
cocoaOptions.dist = kmpOptions.dist
23+
kmpOptions.environment?.let {
24+
cocoaOptions.environment = it
2425
}
25-
releaseName = options.release
26-
debug = options.debug
27-
sessionTrackingIntervalMillis = options.sessionTrackingIntervalMillis.convert()
28-
enableAutoSessionTracking = options.enableAutoSessionTracking
29-
maxAttachmentSize = options.maxAttachmentSize.convert()
30-
maxBreadcrumbs = options.maxBreadcrumbs.convert()
31-
enableAppHangTracking = options.enableAppHangTracking
32-
appHangTimeoutInterval = options.appHangTimeoutIntervalMillis.toDouble()
33-
options.sampleRate?.let {
34-
sampleRate = NSNumber(double = it)
26+
cocoaOptions.releaseName = kmpOptions.release
27+
cocoaOptions.debug = kmpOptions.debug
28+
cocoaOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis.convert()
29+
cocoaOptions.enableAutoSessionTracking = kmpOptions.enableAutoSessionTracking
30+
cocoaOptions.maxAttachmentSize = kmpOptions.maxAttachmentSize.convert()
31+
cocoaOptions.maxBreadcrumbs = kmpOptions.maxBreadcrumbs.convert()
32+
cocoaOptions.enableAppHangTracking = kmpOptions.enableAppHangTracking
33+
cocoaOptions.enableWatchdogTerminationTracking = kmpOptions.enableWatchdogTerminationTracking
34+
cocoaOptions.appHangTimeoutInterval = kmpOptions.appHangTimeoutIntervalMillis.toDouble()
35+
kmpOptions.sampleRate?.let {
36+
cocoaOptions.sampleRate = NSNumber(double = it)
3537
}
36-
options.tracesSampleRate?.let {
37-
tracesSampleRate = NSNumber(double = it)
38+
kmpOptions.tracesSampleRate?.let {
39+
cocoaOptions.tracesSampleRate = NSNumber(double = it)
3840
}
39-
beforeSend = { event ->
41+
cocoaOptions.beforeSend = { event ->
4042
val sdk = event?.sdk?.toMutableMap()
4143

42-
val packages = options.sdk?.packages?.map {
44+
val packages = kmpOptions.sdk?.packages?.map {
4345
mapOf("name" to it.name, "version" to it.version)
4446
}?.toMutableList() ?: mutableListOf()
4547

4648
sdk?.set("packages", packages)
4749

4850
event?.sdk = sdk
4951

50-
if (options.beforeSend == null) {
52+
if (kmpOptions.beforeSend == null) {
5153
event
5254
} else {
5355
event?.let { SentryEvent(it) }?.let { unwrappedEvent ->
54-
val result = options.beforeSend?.invoke(unwrappedEvent)
56+
val result = kmpOptions.beforeSend?.invoke(unwrappedEvent)
5557
result?.let { event.applyKmpEvent(it) }
5658
}
5759
}
5860
}
5961

60-
beforeBreadcrumb = { cocoaBreadcrumb ->
61-
if (options.beforeBreadcrumb == null) {
62+
cocoaOptions.beforeBreadcrumb = { cocoaBreadcrumb ->
63+
if (kmpOptions.beforeBreadcrumb == null) {
6264
cocoaBreadcrumb
6365
} else {
6466
cocoaBreadcrumb?.toKmpBreadcrumb()
65-
?.let { options.beforeBreadcrumb?.invoke(it) }?.toCocoaBreadcrumb()
67+
?.let { kmpOptions.beforeBreadcrumb?.invoke(it) }?.toCocoaBreadcrumb()
6668
}
6769
}
6870

69-
enableCaptureFailedRequests = options.enableCaptureFailedRequests
70-
failedRequestTargets = options.failedRequestTargets
71-
failedRequestStatusCodes = options.failedRequestStatusCodes.map {
71+
cocoaOptions.enableCaptureFailedRequests = kmpOptions.enableCaptureFailedRequests
72+
cocoaOptions.failedRequestTargets = kmpOptions.failedRequestTargets
73+
cocoaOptions.failedRequestStatusCodes = kmpOptions.failedRequestStatusCodes.map {
7274
SentryHttpStatusCodeRange(
7375
min = it.min.convert(),
7476
max = it.max.convert()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package io.sentry.kotlin.multiplatform
2+
3+
import io.sentry.kotlin.multiplatform.extensions.toCocoaOptionsConfiguration
4+
import io.sentry.kotlin.multiplatform.utils.fakeDsn
5+
import kotlinx.cinterop.convert
6+
import kotlin.test.assertEquals
7+
8+
actual interface PlatformOptions : CommonPlatformOptions {
9+
val enableWatchdogTerminationTracking: Boolean
10+
}
11+
12+
open class SentryAppleOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) :
13+
PlatformOptions {
14+
override val dsn: String?
15+
get() = cocoaOptions.dsn
16+
17+
override val attachStackTrace: Boolean
18+
get() = cocoaOptions.attachStacktrace
19+
20+
override val release: String?
21+
get() = cocoaOptions.releaseName
22+
23+
override val debug: Boolean
24+
get() = cocoaOptions.debug
25+
26+
override val environment: String
27+
get() = cocoaOptions.environment
28+
29+
override val dist: String?
30+
get() = cocoaOptions.dist
31+
32+
override val enableAutoSessionTracking: Boolean
33+
get() = cocoaOptions.enableAutoSessionTracking
34+
35+
override val sessionTrackingIntervalMillis: Long
36+
get() = cocoaOptions.sessionTrackingIntervalMillis.convert()
37+
38+
override val maxBreadcrumbs: Int
39+
get() = cocoaOptions.maxBreadcrumbs.convert()
40+
41+
override val maxAttachmentSize: Long
42+
get() = cocoaOptions.maxAttachmentSize.convert()
43+
44+
override val sampleRate: Double?
45+
get() = cocoaOptions.sampleRate?.doubleValue
46+
47+
override val tracesSampleRate: Double?
48+
get() = cocoaOptions.tracesSampleRate?.doubleValue
49+
50+
override val enableWatchdogTerminationTracking: Boolean
51+
get() = cocoaOptions.enableWatchdogTerminationTracking
52+
53+
override fun applyFromOptions(options: SentryOptions) {
54+
options.toCocoaOptionsConfiguration().invoke(cocoaOptions)
55+
}
56+
}
57+
58+
expect interface ApplePlatformOptions : PlatformOptions
59+
60+
actual fun createPlatformOptions(): PlatformOptions = createApplePlatformOptions()
61+
62+
expect fun createApplePlatformOptions(): PlatformOptions
63+
64+
expect fun ApplePlatformOptions.assertApplePlatformSpecificOptions(options: SentryOptions)
65+
66+
actual fun PlatformOptions.assertPlatformSpecificOptions(options: SentryOptions) {
67+
(this as ApplePlatformOptions).assertApplePlatformSpecificOptions(options)
68+
69+
val appleOptions = this
70+
assertEquals(appleOptions.enableWatchdogTerminationTracking, options.enableWatchdogTerminationTracking)
71+
}
72+
73+
actual fun createSentryPlatformOptionsConfiguration(): PlatformOptionsConfiguration = {
74+
val cocoaOptions = it as CocoaSentryOptions
75+
cocoaOptions.dsn = fakeDsn
76+
}

‎sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt

+10
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,16 @@ public open class SentryOptions {
172172
*/
173173
public var anrTimeoutIntervalMillis: Long = DEFAULT_ANR_TIMEOUT_INTERVAL_MILLIS
174174

175+
/**
176+
* Whether to enable Watchdog Termination tracking or not.
177+
*
178+
* **Default**: Enabled.
179+
*
180+
* **Platform Availability**: Cocoa.
181+
*
182+
*/
183+
public var enableWatchdogTerminationTracking: Boolean = true
184+
175185
/**
176186
* Experimental options for new features, these options are going to be promoted to SentryOptions
177187
* before GA.

‎sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,11 @@ class SentryOptionsTest : BaseSentryTest() {
131131
assertTrue(options.experimental.sessionReplay.redactAllText)
132132
assertTrue(options.experimental.sessionReplay.redactAllImages)
133133
assertEquals(SentryReplayOptions.Quality.MEDIUM, options.experimental.sessionReplay.quality)
134+
assertTrue(options.enableWatchdogTerminationTracking)
134135
}
135136

136137
@Test
137-
fun `GIVEN SentryOptions WHEN applyFromOptions THEN applies values to native options`() {
138+
fun `GIVEN non-default SentryOptions WHEN options initialized THEN applies values to native options`() {
138139
val options = SentryOptions().apply {
139140
dsn = fakeDsn
140141
attachStackTrace = false
@@ -154,6 +155,7 @@ class SentryOptionsTest : BaseSentryTest() {
154155
appHangTimeoutIntervalMillis = 1000L
155156
isAnrEnabled = false
156157
anrTimeoutIntervalMillis = 1000L
158+
enableWatchdogTerminationTracking = false
157159
experimental.sessionReplay.onErrorSampleRate = 0.5
158160
experimental.sessionReplay.sessionSampleRate = 0.5
159161
experimental.sessionReplay.redactAllText = false
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,12 @@
11
package io.sentry.kotlin.multiplatform
22

3-
import io.sentry.kotlin.multiplatform.extensions.toCocoaOptionsConfiguration
4-
import io.sentry.kotlin.multiplatform.utils.fakeDsn
5-
import kotlinx.cinterop.convert
3+
actual interface ApplePlatformOptions : PlatformOptions
64

7-
actual interface PlatformOptions : CommonPlatformOptions
5+
class SentryTvWatchMacOsOptionsWrapper(cocoaOptions: CocoaSentryOptions) : SentryAppleOptionsWrapper(cocoaOptions)
86

9-
class SentryTvWatchMacOsOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) :
10-
PlatformOptions {
11-
override val dsn: String?
12-
get() = cocoaOptions.dsn
13-
14-
override val attachStackTrace: Boolean
15-
get() = cocoaOptions.attachStacktrace
16-
17-
override val release: String?
18-
get() = cocoaOptions.releaseName
19-
20-
override val debug: Boolean
21-
get() = cocoaOptions.debug
22-
23-
override val environment: String
24-
get() = cocoaOptions.environment
25-
26-
override val dist: String?
27-
get() = cocoaOptions.dist
28-
29-
override val enableAutoSessionTracking: Boolean
30-
get() = cocoaOptions.enableAutoSessionTracking
31-
32-
override val sessionTrackingIntervalMillis: Long
33-
get() = cocoaOptions.sessionTrackingIntervalMillis.convert()
34-
35-
override val maxBreadcrumbs: Int
36-
get() = cocoaOptions.maxBreadcrumbs.convert()
37-
38-
override val maxAttachmentSize: Long
39-
get() = cocoaOptions.maxAttachmentSize.convert()
40-
41-
override val sampleRate: Double?
42-
get() = cocoaOptions.sampleRate?.doubleValue
43-
44-
override val tracesSampleRate: Double?
45-
get() = cocoaOptions.tracesSampleRate?.doubleValue
46-
47-
override fun applyFromOptions(options: SentryOptions) {
48-
options.toCocoaOptionsConfiguration().invoke(cocoaOptions)
49-
}
50-
}
51-
52-
actual fun createPlatformOptions(): PlatformOptions =
7+
actual fun createApplePlatformOptions(): PlatformOptions =
538
SentryTvWatchMacOsOptionsWrapper(CocoaSentryOptions())
549

55-
actual fun PlatformOptions.assertPlatformSpecificOptions(options: SentryOptions) {
10+
actual fun ApplePlatformOptions.assertApplePlatformSpecificOptions(options: SentryOptions) {
5611
// no-op
5712
}
58-
59-
actual fun createSentryPlatformOptionsConfiguration(): PlatformOptionsConfiguration = {
60-
it.dsn = fakeDsn
61-
}

‎sentry-kotlin-multiplatform/src/iosTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.ios.kt

+4-46
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,17 @@ package io.sentry.kotlin.multiplatform
22

33
import cocoapods.Sentry.SentryReplayOptions
44
import io.sentry.kotlin.multiplatform.extensions.toIosOptionsConfiguration
5-
import io.sentry.kotlin.multiplatform.utils.fakeDsn
6-
import kotlinx.cinterop.convert
75
import kotlin.test.assertEquals
86

9-
actual interface PlatformOptions : CommonPlatformOptions {
7+
actual interface ApplePlatformOptions : PlatformOptions {
108
val attachScreenshot: Boolean
119
val attachViewHierarchy: Boolean
1210
val enableAppHangTracking: Boolean
1311
val appHangTimeoutIntervalMillis: Long
1412
val sessionReplay: SentryReplayOptions
1513
}
1614

17-
class SentryIosOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) : PlatformOptions {
15+
class SentryIosOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) : SentryAppleOptionsWrapper(cocoaOptions), ApplePlatformOptions {
1816
override val attachScreenshot: Boolean
1917
get() = cocoaOptions.attachScreenshot
2018

@@ -27,42 +25,6 @@ class SentryIosOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) : Pl
2725
override val appHangTimeoutIntervalMillis: Long
2826
get() = cocoaOptions.appHangTimeoutInterval.toLong()
2927

30-
override val dsn: String?
31-
get() = cocoaOptions.dsn
32-
33-
override val attachStackTrace: Boolean
34-
get() = cocoaOptions.attachStacktrace
35-
36-
override val release: String?
37-
get() = cocoaOptions.releaseName
38-
39-
override val debug: Boolean
40-
get() = cocoaOptions.debug
41-
42-
override val environment: String
43-
get() = cocoaOptions.environment
44-
45-
override val dist: String?
46-
get() = cocoaOptions.dist
47-
48-
override val enableAutoSessionTracking: Boolean
49-
get() = cocoaOptions.enableAutoSessionTracking
50-
51-
override val sessionTrackingIntervalMillis: Long
52-
get() = cocoaOptions.sessionTrackingIntervalMillis.convert()
53-
54-
override val maxBreadcrumbs: Int
55-
get() = cocoaOptions.maxBreadcrumbs.convert()
56-
57-
override val maxAttachmentSize: Long
58-
get() = cocoaOptions.maxAttachmentSize.convert()
59-
60-
override val sampleRate: Double?
61-
get() = cocoaOptions.sampleRate?.doubleValue
62-
63-
override val tracesSampleRate: Double?
64-
get() = cocoaOptions.tracesSampleRate?.doubleValue
65-
6628
override val sessionReplay: SentryReplayOptions
6729
get() = cocoaOptions.experimental.sessionReplay()
6830

@@ -71,9 +33,9 @@ class SentryIosOptionsWrapper(private val cocoaOptions: CocoaSentryOptions) : Pl
7133
}
7234
}
7335

74-
actual fun createPlatformOptions(): PlatformOptions = SentryIosOptionsWrapper(CocoaSentryOptions())
36+
actual fun createApplePlatformOptions(): PlatformOptions = SentryIosOptionsWrapper(CocoaSentryOptions())
7537

76-
actual fun PlatformOptions.assertPlatformSpecificOptions(options: SentryOptions) {
38+
actual fun ApplePlatformOptions.assertApplePlatformSpecificOptions(options: SentryOptions) {
7739
assertEquals(attachScreenshot, options.attachScreenshot)
7840
assertEquals(attachViewHierarchy, options.attachViewHierarchy)
7941
assertEquals(enableAppHangTracking, options.enableAppHangTracking)
@@ -84,7 +46,3 @@ actual fun PlatformOptions.assertPlatformSpecificOptions(options: SentryOptions)
8446
assertEquals(sessionReplay.sessionSampleRate().toDouble(), options.experimental.sessionReplay.sessionSampleRate)
8547
assertEquals(sessionReplay.quality(), options.experimental.sessionReplay.quality.ordinal.toLong())
8648
}
87-
88-
actual fun createSentryPlatformOptionsConfiguration(): PlatformOptionsConfiguration = {
89-
it.dsn = fakeDsn
90-
}

0 commit comments

Comments
 (0)
Please sign in to comment.