diff --git a/CHANGELOG.md b/CHANGELOG.md index f6c787322b..6e97eeca71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +* Fix: Allow disabling sending of client reports via Android Manifest and external options (#2007) + ## 6.0.0-alpha.6 * Feat: Add sentry-servlet-jakarta module (#1987) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java index 63ef31a5e6..54e4389b39 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/ManifestMetadataReader.java @@ -65,6 +65,7 @@ final class ManifestMetadataReader { static final String PROGUARD_UUID = "io.sentry.proguard-uuid"; static final String ATTACH_SCREENSHOT = "io.sentry.attach-screenshot"; + static final String CLIENT_REPORTS_ENABLE = "io.sentry.send-client-reports"; /** ManifestMetadataReader ctor */ private ManifestMetadataReader() {} @@ -201,6 +202,9 @@ static void applyMetadata( options.setAttachScreenshot( readBool(metadata, logger, ATTACH_SCREENSHOT, options.isAttachScreenshot())); + options.setSendClientReports( + readBool(metadata, logger, CLIENT_REPORTS_ENABLE, options.isSendClientReports())); + if (options.getTracesSampleRate() == null) { final Double tracesSampleRate = readDouble(metadata, logger, TRACES_SAMPLE_RATE); if (tracesSampleRate != -1) { diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt index adad606d2d..a33acddc49 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/ManifestMetadataReaderTest.kt @@ -813,4 +813,29 @@ class ManifestMetadataReaderTest { // Assert assertFalse(fixture.options.isAttachScreenshot) } + + @Test + fun `applyMetadata reads send client reports to options`() { + // Arrange + val bundle = bundleOf(ManifestMetadataReader.CLIENT_REPORTS_ENABLE to false) + val context = fixture.getContext(metaData = bundle) + + // Act + ManifestMetadataReader.applyMetadata(context, fixture.options) + + // Assert + assertFalse(fixture.options.isSendClientReports) + } + + @Test + fun `applyMetadata reads send client reports and keep default value if not found`() { + // Arrange + val context = fixture.getContext() + + // Act + ManifestMetadataReader.applyMetadata(context, fixture.options) + + // Assert + assertTrue(fixture.options.isSendClientReports) + } } diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index bceaa14271..a0bfdc2887 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -161,6 +161,7 @@ public final class io/sentry/ExternalOptions { public fun getProguardUuid ()Ljava/lang/String; public fun getProxy ()Lio/sentry/SentryOptions$Proxy; public fun getRelease ()Ljava/lang/String; + public fun getSendClientReports ()Ljava/lang/Boolean; public fun getServerName ()Ljava/lang/String; public fun getTags ()Ljava/util/Map; public fun getTracesSampleRate ()Ljava/lang/Double; @@ -176,6 +177,7 @@ public final class io/sentry/ExternalOptions { public fun setProguardUuid (Ljava/lang/String;)V public fun setProxy (Lio/sentry/SentryOptions$Proxy;)V public fun setRelease (Ljava/lang/String;)V + public fun setSendClientReports (Ljava/lang/Boolean;)V public fun setServerName (Ljava/lang/String;)V public fun setTag (Ljava/lang/String;Ljava/lang/String;)V public fun setTracesSampleRate (Ljava/lang/Double;)V diff --git a/sentry/src/main/java/io/sentry/ExternalOptions.java b/sentry/src/main/java/io/sentry/ExternalOptions.java index 8f10ca8c40..b9ba68a80a 100644 --- a/sentry/src/main/java/io/sentry/ExternalOptions.java +++ b/sentry/src/main/java/io/sentry/ExternalOptions.java @@ -37,6 +37,7 @@ public final class ExternalOptions { private final @NotNull Set> ignoredExceptionsForType = new CopyOnWriteArraySet<>(); private @Nullable Boolean printUncaughtStackTrace; + private @Nullable Boolean sendClientReports; @SuppressWarnings("unchecked") public static @NotNull ExternalOptions from( @@ -54,6 +55,7 @@ public final class ExternalOptions { options.setTracesSampleRate(propertiesProvider.getDoubleProperty("traces-sample-rate")); options.setDebug(propertiesProvider.getBooleanProperty("debug")); options.setEnableDeduplication(propertiesProvider.getBooleanProperty("enable-deduplication")); + options.setSendClientReports(propertiesProvider.getBooleanProperty("send-client-reports")); final String maxRequestBodySize = propertiesProvider.getProperty("max-request-body-size"); if (maxRequestBodySize != null) { options.setMaxRequestBodySize( @@ -263,4 +265,12 @@ public void setTag(final @NotNull String key, final @NotNull String value) { public void setPrintUncaughtStackTrace(final @Nullable Boolean printUncaughtStackTrace) { this.printUncaughtStackTrace = printUncaughtStackTrace; } + + public @Nullable Boolean getSendClientReports() { + return sendClientReports; + } + + public void setSendClientReports(final @Nullable Boolean sendClientReports) { + this.sendClientReports = sendClientReports; + } } diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 25a7b9a960..b293233bde 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -1692,6 +1692,9 @@ void merge(final @NotNull ExternalOptions options) { if (options.getEnableDeduplication() != null) { setEnableDeduplication(options.getEnableDeduplication()); } + if (options.getSendClientReports() != null) { + setSendClientReports(options.getSendClientReports()); + } final Map tags = new HashMap<>(options.getTags()); for (final Map.Entry tag : tags.entrySet()) { this.tags.put(tag.getKey(), tag.getValue()); diff --git a/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt b/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt index 0e7ea3d931..09f0777477 100644 --- a/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt +++ b/sentry/src/test/java/io/sentry/ExternalOptionsTest.kt @@ -122,6 +122,15 @@ class ExternalOptionsTest { } } + @Test + fun `creates options with sendClientReports using external properties`() { + withPropertiesFile("send-client-reports=false") { + assertNotNull(it.sendClientReports) { + assertFalse(it) + } + } + } + @Test fun `creates options with maxRequestBodySize using external properties`() { withPropertiesFile("max-request-body-size=small") {