From 07838c6bd8daf98fb414a4ac300136d69cab7eac Mon Sep 17 00:00:00 2001 From: Julian Bissekkou Date: Fri, 26 Jul 2024 10:58:10 +0200 Subject: [PATCH 1/7] configure native sample rate on android --- .../src/main/kotlin/io/sentry/flutter/SentryFlutter.kt | 10 +++++++--- flutter/lib/src/native/sentry_native_channel.dart | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt index c06a8b0dc2..aa11253b94 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt @@ -119,6 +119,12 @@ class SentryFlutter( data.getIfNotNull("readTimeoutMillis") { options.readTimeoutMillis = it } + data.getIfNotNull("sampleRate") { + options.sampleRate = it + } + data.getIfNotNull("tracesSampleRate") { + options.tracesSampleRate = it + } } } @@ -128,7 +134,5 @@ private fun Map.getIfNotNull( key: String, callback: (T) -> Unit, ) { - (get(key) as? T)?.let { - callback(it) - } + (get(key) as? T)?.let(callback) } diff --git a/flutter/lib/src/native/sentry_native_channel.dart b/flutter/lib/src/native/sentry_native_channel.dart index 0a3b97820d..273a5d6b2f 100644 --- a/flutter/lib/src/native/sentry_native_channel.dart +++ b/flutter/lib/src/native/sentry_native_channel.dart @@ -1,4 +1,5 @@ import 'dart:async'; + // backcompatibility for Flutter < 3.3 // ignore: unnecessary_import import 'dart:typed_data'; @@ -66,6 +67,8 @@ class SentryNativeChannel 'readTimeoutMillis': options.readTimeout.inMilliseconds, 'appHangTimeoutIntervalMillis': options.appHangTimeoutInterval.inMilliseconds, + 'tracesSampleRate': options.tracesSampleRate, + 'sampleRate': options.sampleRate }); } From 1c1e7083be76e8aeadd583f9be9449c939ade2d7 Mon Sep 17 00:00:00 2001 From: Julian Bissekkou Date: Fri, 26 Jul 2024 14:07:06 +0200 Subject: [PATCH 2/7] configure native sample rate on iOS --- flutter/ios/Classes/SentryFlutter.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flutter/ios/Classes/SentryFlutter.swift b/flutter/ios/Classes/SentryFlutter.swift index b26bcfc30d..e9380ad3f3 100644 --- a/flutter/ios/Classes/SentryFlutter.swift +++ b/flutter/ios/Classes/SentryFlutter.swift @@ -70,6 +70,12 @@ public final class SentryFlutter { if let appHangTimeoutIntervalMillis = data["appHangTimeoutIntervalMillis"] as? NSNumber { options.appHangTimeoutInterval = appHangTimeoutIntervalMillis.doubleValue / 1000 } + if let sampleRate = data["sampleRate"] as? NSNumber? { + options.sampleRate = sampleRate + } + if let tracesSampleRate = data["tracingSampleRate"] as? NSNumber? { + options.tracesSampleRate = tracesSampleRate + } } private func logLevelFrom(diagnosticLevel: String) -> SentryLevel { From 5884f08254088ea359b512483e8569438a3c3e93 Mon Sep 17 00:00:00 2001 From: Julian Bissekkou Date: Fri, 26 Jul 2024 14:12:19 +0200 Subject: [PATCH 3/7] fix typo --- flutter/ios/Classes/SentryFlutter.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/ios/Classes/SentryFlutter.swift b/flutter/ios/Classes/SentryFlutter.swift index e9380ad3f3..6121864f91 100644 --- a/flutter/ios/Classes/SentryFlutter.swift +++ b/flutter/ios/Classes/SentryFlutter.swift @@ -73,7 +73,7 @@ public final class SentryFlutter { if let sampleRate = data["sampleRate"] as? NSNumber? { options.sampleRate = sampleRate } - if let tracesSampleRate = data["tracingSampleRate"] as? NSNumber? { + if let tracesSampleRate = data["tracesSampleRate"] as? NSNumber? { options.tracesSampleRate = tracesSampleRate } } From 4861728d4c129867229372c5a5c156f22eb5cea4 Mon Sep 17 00:00:00 2001 From: Julian Bissekkou <36447137+JulianBissekkou@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:10:26 +0300 Subject: [PATCH 4/7] Update flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt Co-authored-by: Giancarlo Buenaflor --- .../android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt index aa11253b94..59c52f86b9 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt @@ -122,9 +122,6 @@ class SentryFlutter( data.getIfNotNull("sampleRate") { options.sampleRate = it } - data.getIfNotNull("tracesSampleRate") { - options.tracesSampleRate = it - } } } From e0023142881d6d7615f4b9cafc7d4c48de74d351 Mon Sep 17 00:00:00 2001 From: Julian Bissekkou <36447137+JulianBissekkou@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:10:31 +0300 Subject: [PATCH 5/7] Update flutter/lib/src/native/sentry_native_channel.dart Co-authored-by: Giancarlo Buenaflor --- flutter/lib/src/native/sentry_native_channel.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter/lib/src/native/sentry_native_channel.dart b/flutter/lib/src/native/sentry_native_channel.dart index 273a5d6b2f..bf89ba00c6 100644 --- a/flutter/lib/src/native/sentry_native_channel.dart +++ b/flutter/lib/src/native/sentry_native_channel.dart @@ -67,7 +67,6 @@ class SentryNativeChannel 'readTimeoutMillis': options.readTimeout.inMilliseconds, 'appHangTimeoutIntervalMillis': options.appHangTimeoutInterval.inMilliseconds, - 'tracesSampleRate': options.tracesSampleRate, 'sampleRate': options.sampleRate }); } From a0fe29200cc28ceb274824845c19de98fbffdc5a Mon Sep 17 00:00:00 2001 From: Julian Bissekkou <36447137+JulianBissekkou@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:11:50 +0300 Subject: [PATCH 6/7] Update flutter/ios/Classes/SentryFlutter.swift Co-authored-by: Giancarlo Buenaflor --- flutter/ios/Classes/SentryFlutter.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/flutter/ios/Classes/SentryFlutter.swift b/flutter/ios/Classes/SentryFlutter.swift index 6121864f91..068cc9651d 100644 --- a/flutter/ios/Classes/SentryFlutter.swift +++ b/flutter/ios/Classes/SentryFlutter.swift @@ -73,9 +73,6 @@ public final class SentryFlutter { if let sampleRate = data["sampleRate"] as? NSNumber? { options.sampleRate = sampleRate } - if let tracesSampleRate = data["tracesSampleRate"] as? NSNumber? { - options.tracesSampleRate = tracesSampleRate - } } private func logLevelFrom(diagnosticLevel: String) -> SentryLevel { From 7ea555dc96dd5a72fa7b93d5aae8038fa8b9bd3a Mon Sep 17 00:00:00 2001 From: Julian Bissekkou Date: Wed, 18 Sep 2024 16:20:51 +0200 Subject: [PATCH 7/7] fix tests and update changelog --- CHANGELOG.md | 4 ++++ .../src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt | 3 +++ flutter/example/ios/RunnerTests/SentryFlutterTests.swift | 5 ++++- flutter/ios/Classes/SentryFlutter.swift | 4 ++-- flutter/test/integrations/init_native_sdk_test.dart | 6 +++++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d7b75b7bf..c59182f1d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ - Fixes ([#2103](https://github.com/getsentry/sentry-dart/issues/2103)) - Fixes ([#2233](https://github.com/getsentry/sentry-dart/issues/2233)) +### Fixes + +- Pass `sampleRate` to native SDKs ([#2200](https://github.com/getsentry/sentry-dart/pull/2200)) + ## 8.9.0 ### Features diff --git a/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt b/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt index efab672972..c8376b9c9f 100644 --- a/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt +++ b/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt @@ -71,6 +71,8 @@ class SentryFlutterTest { assertEquals(0.5, fixture.options.experimental.sessionReplay.sessionSampleRate) assertEquals(0.6, fixture.options.experimental.sessionReplay.errorSampleRate) + assertEquals(0.751, fixture.options.sampleRate) + // Note: these are currently read-only in SentryReplayOptions so we're only asserting the default values here to // know when there's a change in the native SDK, as it may require a manual change in the Flutter implementation. assertEquals(1, fixture.options.experimental.sessionReplay.frameRate) @@ -157,6 +159,7 @@ class Fixture { "sessionSampleRate" to 0.5, "onErrorSampleRate" to 0.6, ), + "sampleRate" to 0.751 ) fun getSut(): SentryFlutter = diff --git a/flutter/example/ios/RunnerTests/SentryFlutterTests.swift b/flutter/example/ios/RunnerTests/SentryFlutterTests.swift index 4873388f2f..57dddc7100 100644 --- a/flutter/example/ios/RunnerTests/SentryFlutterTests.swift +++ b/flutter/example/ios/RunnerTests/SentryFlutterTests.swift @@ -52,7 +52,8 @@ final class SentryFlutterTests: XCTestCase { "type": "hTtP", // mixed case to check enum mapping "user": "admin", "pass": "0000" - ] + ], + "sampleRate": NSNumber(value: 0.5) ] ) @@ -84,6 +85,8 @@ final class SentryFlutterTests: XCTestCase { XCTAssertEqual(8080, fixture.options.urlSession?.configuration.connectionProxyDictionary?[kCFNetworkProxiesHTTPPort as String] as? Int) XCTAssertEqual("admin", fixture.options.urlSession?.configuration.connectionProxyDictionary?[kCFProxyUsernameKey as String] as? String) XCTAssertEqual("0000", fixture.options.urlSession?.configuration.connectionProxyDictionary?[kCFProxyPasswordKey as String] as? String) + + XCTAssertEqual(0.5, fixture.options.sampleRate) } func testUpdateSocksProxy() { diff --git a/flutter/ios/Classes/SentryFlutter.swift b/flutter/ios/Classes/SentryFlutter.swift index 0460295b3e..467f66cd9e 100644 --- a/flutter/ios/Classes/SentryFlutter.swift +++ b/flutter/ios/Classes/SentryFlutter.swift @@ -113,8 +113,8 @@ public final class SentryFlutter { (replayOptions["onErrorSampleRate"] as? NSNumber)?.floatValue ?? 0 } #endif - data.getIfNotNull("sampleRate") { - options.sampleRate = it + if let sampleRate = data["sampleRate"] as? NSNumber { + options.sampleRate = sampleRate } } diff --git a/flutter/test/integrations/init_native_sdk_test.dart b/flutter/test/integrations/init_native_sdk_test.dart index 6f84e946f5..0184aecc2d 100644 --- a/flutter/test/integrations/init_native_sdk_test.dart +++ b/flutter/test/integrations/init_native_sdk_test.dart @@ -69,6 +69,7 @@ void main() { 'sessionSampleRate': null, 'onErrorSampleRate': null, }, + 'sampleRate': null, }); }); @@ -118,7 +119,8 @@ void main() { pass: '0000', ) ..experimental.replay.sessionSampleRate = 0.1 - ..experimental.replay.onErrorSampleRate = 0.2; + ..experimental.replay.onErrorSampleRate = 0.2 + ..sampleRate = 0.751; fixture.options.sdk.addIntegration('foo'); fixture.options.sdk.addPackage('bar', '1'); @@ -174,6 +176,7 @@ void main() { 'sessionSampleRate': 0.1, 'onErrorSampleRate': 0.2, }, + 'sampleRate': 0.751, }); }); } @@ -200,6 +203,7 @@ SentryFlutterOptions createOptions() { class Fixture { late SentryFlutterOptions options; + SentryNativeChannel getSut(MethodChannel channel) { options = createOptions()..methodChannel = channel; return SentryNativeChannel(options);