From 2b0af6c6d6129ca94cf14a14a272f3c2c1272d4e Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 10:25:24 +0000 Subject: [PATCH 1/2] ref(options): Return strings from ignored filter getters getIgnoredErrors, getIgnoredTransactions, getIgnoredCheckIns and getIgnoredSpanOrigins returned List while their setters take List. The asymmetry breaks Kotlin property access and exposes an internal type. The public getters now return the configured strings. The compiled filters used by the SDK move to new internal *Filters() getters. Co-Authored-By: Alexander Dinauer --- .../core/ManifestMetadataReaderTest.kt | 3 +- .../apollo3/SentryApollo3HttpInterceptor.kt | 2 +- .../apollo4/SentryApollo4HttpInterceptor.kt | 2 +- .../apollo5/SentryApollo5HttpInterceptor.kt | 2 +- .../sentry/apollo/SentryApolloInterceptor.kt | 2 +- .../kafka/SentryKafkaConsumerTracing.java | 2 +- .../io/sentry/kafka/SentryKafkaProducer.java | 2 +- .../ktorClient/SentryKtorClientPlugin.kt | 2 +- .../sentry/okhttp/SentryOkHttpInterceptor.kt | 2 +- .../sentry/openfeign/SentryFeignClient.java | 2 +- .../sentry/opentelemetry/OtelSpanFactory.java | 3 +- .../kafka/SentryKafkaRecordInterceptor.java | 2 +- ...entrySpanClientHttpRequestInterceptor.java | 2 +- .../SentrySpanClientWebRequestFilter.java | 2 +- .../spring7/tracing/SentryTracingFilter.java | 2 +- .../webflux/AbstractSentryWebFilter.java | 2 +- .../boot4/SentryAutoConfigurationTest.kt | 10 +-- .../jakarta/SentryAutoConfigurationTest.kt | 10 +-- .../boot/SentryAutoConfigurationTest.kt | 10 +-- .../kafka/SentryKafkaRecordInterceptor.java | 2 +- ...entrySpanClientHttpRequestInterceptor.java | 2 +- .../SentrySpanClientWebRequestFilter.java | 2 +- .../jakarta/tracing/SentryTracingFilter.java | 2 +- .../webflux/AbstractSentryWebFilter.java | 2 +- .../kafka/SentryKafkaRecordInterceptor.java | 2 +- ...entrySpanClientHttpRequestInterceptor.java | 2 +- .../SentrySpanClientWebRequestFilter.java | 2 +- .../spring/tracing/SentryTracingFilter.java | 2 +- .../spring/webflux/SentryWebFilter.java | 2 +- sentry/api/sentry.api | 4 ++ sentry/src/main/java/io/sentry/Scopes.java | 2 +- .../src/main/java/io/sentry/SentryClient.java | 7 +- .../main/java/io/sentry/SentryOptions.java | 68 +++++++++++++++++-- .../src/main/java/io/sentry/SentryTracer.java | 3 +- .../test/java/io/sentry/SentryOptionsTest.kt | 44 ++++++++++-- 35 files changed, 149 insertions(+), 63 deletions(-) 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 a32abe4befd..d7481c22b25 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 @@ -5,7 +5,6 @@ import android.os.Bundle import androidx.core.os.bundleOf import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat -import io.sentry.FilterString import io.sentry.HttpBodyType import io.sentry.ILogger import io.sentry.KeyValueCollectionBehavior @@ -2083,7 +2082,7 @@ class ManifestMetadataReaderTest { // Assert assertEquals( - listOf(FilterString("Some error"), FilterString("Another .*")), + listOf("Some error", "Another .*"), fixture.options.ignoredErrors, ) } diff --git a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt index 53e48657393..b9fdd060c3e 100644 --- a/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt +++ b/sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt @@ -148,7 +148,7 @@ constructor( } private fun isIgnored(): Boolean = - SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN) + SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN) private fun removeSentryInternalHeaders(headers: List): List = headers.filterNot { diff --git a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt index aea5d6691c4..c39638bac58 100644 --- a/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt +++ b/sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt @@ -148,7 +148,7 @@ constructor( } private fun isIgnored(): Boolean = - SpanUtils.isIgnored(scopes.getOptions().ignoredSpanOrigins, TRACE_ORIGIN) + SpanUtils.isIgnored(scopes.getOptions().ignoredSpanOriginFilters, TRACE_ORIGIN) private fun removeSentryInternalHeaders(headers: List): List = headers.filterNot { header -> diff --git a/sentry-apollo-5/src/main/java/io/sentry/apollo5/SentryApollo5HttpInterceptor.kt b/sentry-apollo-5/src/main/java/io/sentry/apollo5/SentryApollo5HttpInterceptor.kt index f74d0fec111..b0c4aadae1d 100644 --- a/sentry-apollo-5/src/main/java/io/sentry/apollo5/SentryApollo5HttpInterceptor.kt +++ b/sentry-apollo-5/src/main/java/io/sentry/apollo5/SentryApollo5HttpInterceptor.kt @@ -152,7 +152,7 @@ constructor( } private fun isIgnored(): Boolean = - SpanUtils.isIgnored(scopes.getOptions().ignoredSpanOrigins, TRACE_ORIGIN) + SpanUtils.isIgnored(scopes.getOptions().ignoredSpanOriginFilters, TRACE_ORIGIN) private fun startChild( request: HttpRequest, diff --git a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt index 907217bea7f..c50d85a05eb 100644 --- a/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt +++ b/sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt @@ -164,7 +164,7 @@ class SentryApolloInterceptor( } private fun isIgnored(): Boolean = - SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN) + SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN) private fun startChild(request: InterceptorRequest, activeSpan: ISpan): ISpan { val operation = request.operation.name().name() diff --git a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java index a45505f1019..15e97b3663d 100644 --- a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java +++ b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaConsumerTracing.java @@ -131,7 +131,7 @@ private static void throwUnchecked(final @NotNull Throwabl } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private @Nullable ITransaction startTransaction( diff --git a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducer.java b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducer.java index 312faabbb42..4ea3853977e 100644 --- a/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducer.java +++ b/sentry-kafka/src/main/java/io/sentry/kafka/SentryKafkaProducer.java @@ -209,7 +209,7 @@ private void finishWithError(final @NotNull ISpan span, final @NotNull Throwable } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), traceOrigin); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), traceOrigin); } private void maybeInjectHeaders(final @NotNull Headers headers, final @Nullable ISpan span) { diff --git a/sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientPlugin.kt b/sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientPlugin.kt index 0e4538fb418..a400a64762a 100644 --- a/sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientPlugin.kt +++ b/sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientPlugin.kt @@ -125,7 +125,7 @@ public val SentryKtorClientPlugin: ClientPlugin = if ( !SpanUtils.isIgnored( - effectiveScopes.options.getIgnoredSpanOrigins(), + effectiveScopes.options.getIgnoredSpanOriginFilters(), TRACE_ORIGIN, ) ) { diff --git a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt index f29396d1068..1cfe0ae1da7 100644 --- a/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt +++ b/sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt @@ -234,7 +234,7 @@ public open class SentryOkHttpInterceptor( } private fun isIgnored(): Boolean = - SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN) + SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN) private fun sendBreadcrumb( request: Request, diff --git a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java index 25c93a15640..96f40814587 100644 --- a/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java +++ b/sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java @@ -175,7 +175,7 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void addBreadcrumb(final @NotNull Request request, final @Nullable Response response) { diff --git a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java index f64d07e8c3c..0e28cedf177 100644 --- a/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java +++ b/sentry-opentelemetry/sentry-opentelemetry-bootstrap/src/main/java/io/sentry/opentelemetry/OtelSpanFactory.java @@ -67,7 +67,8 @@ public OtelSpanFactory() { final @NotNull SpanOptions spanOptions, final @NotNull SpanContext spanContext, final @Nullable ISpan parentSpan) { - if (SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), spanOptions.getOrigin())) { + if (SpanUtils.isIgnored( + scopes.getOptions().getIgnoredSpanOriginFilters(), spanOptions.getOrigin())) { return NoOpSpan.getInstance(); } diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/kafka/SentryKafkaRecordInterceptor.java b/sentry-spring-7/src/main/java/io/sentry/spring7/kafka/SentryKafkaRecordInterceptor.java index dca7c7d61dd..abae5b44cb6 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/kafka/SentryKafkaRecordInterceptor.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/kafka/SentryKafkaRecordInterceptor.java @@ -129,7 +129,7 @@ public void clearThreadState(final @NotNull Consumer consumer) { } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private @Nullable ConsumerRecord delegateIntercept( diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientHttpRequestInterceptor.java b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientHttpRequestInterceptor.java index d0d0923a42b..d468d43ccec 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientHttpRequestInterceptor.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientHttpRequestInterceptor.java @@ -126,7 +126,7 @@ private void maybeAddTracingHeaders( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), traceOrigin); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), traceOrigin); } private void addBreadcrumb( diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientWebRequestFilter.java b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientWebRequestFilter.java index df3cd548218..9ab8520484d 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientWebRequestFilter.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentrySpanClientWebRequestFilter.java @@ -110,7 +110,7 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) { } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void addBreadcrumb( diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentryTracingFilter.java b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentryTracingFilter.java index 048d1b584c1..a978c57d9c3 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentryTracingFilter.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/tracing/SentryTracingFilter.java @@ -127,7 +127,7 @@ protected void doFilterInternal( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void doFilterWithTransaction( diff --git a/sentry-spring-7/src/main/java/io/sentry/spring7/webflux/AbstractSentryWebFilter.java b/sentry-spring-7/src/main/java/io/sentry/spring7/webflux/AbstractSentryWebFilter.java index 488d0ab4816..898c9fd5937 100644 --- a/sentry-spring-7/src/main/java/io/sentry/spring7/webflux/AbstractSentryWebFilter.java +++ b/sentry-spring-7/src/main/java/io/sentry/spring7/webflux/AbstractSentryWebFilter.java @@ -66,7 +66,7 @@ && shouldTraceRequest(requestScopes, request)) { } private boolean isIgnored(final @NotNull IScopes scopes, final @NotNull String origin) { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), origin); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), origin); } protected void doFinally( diff --git a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentryAutoConfigurationTest.kt b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentryAutoConfigurationTest.kt index 9aa8cb006d1..7f15669b104 100644 --- a/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentryAutoConfigurationTest.kt +++ b/sentry-spring-boot-4/src/test/kotlin/io/sentry/spring/boot4/SentryAutoConfigurationTest.kt @@ -4,7 +4,6 @@ import com.acme.MainBootClass import io.opentelemetry.api.OpenTelemetry import io.sentry.Breadcrumb import io.sentry.EventProcessor -import io.sentry.FilterString import io.sentry.Hint import io.sentry.IContinuousProfiler import io.sentry.IProfileConverter @@ -279,12 +278,9 @@ class SentryAutoConfigurationTest { .containsOnly("localhost", "^(http|https)://api\\..*\$") assertThat(options.isEnabled).isEqualTo(false) assertThat(options.isSendModules).isEqualTo(false) - assertThat(options.ignoredCheckIns) - .containsOnly(FilterString("slug1"), FilterString("slugB")) - assertThat(options.ignoredErrors) - .containsOnly(FilterString("Some error"), FilterString("Another .*")) - assertThat(options.ignoredTransactions) - .containsOnly(FilterString("transactionName1"), FilterString("transactionNameB")) + assertThat(options.ignoredCheckIns).containsOnly("slug1", "slugB") + assertThat(options.ignoredErrors).containsOnly("Some error", "Another .*") + assertThat(options.ignoredTransactions).containsOnly("transactionName1", "transactionNameB") assertThat(options.isEnableBackpressureHandling).isEqualTo(false) assertThat(options.isEnableDatabaseTransactionTracing).isEqualTo(true) assertThat(options.isEnableCacheTracing).isEqualTo(true) diff --git a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryAutoConfigurationTest.kt b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryAutoConfigurationTest.kt index c3a8fd2506b..1b46809b3f3 100644 --- a/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryAutoConfigurationTest.kt +++ b/sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentryAutoConfigurationTest.kt @@ -5,7 +5,6 @@ import io.opentelemetry.api.OpenTelemetry import io.sentry.Breadcrumb import io.sentry.DataCategory import io.sentry.EventProcessor -import io.sentry.FilterString import io.sentry.Hint import io.sentry.IContinuousProfiler import io.sentry.IProfileConverter @@ -284,12 +283,9 @@ class SentryAutoConfigurationTest { .containsOnly("localhost", "^(http|https)://api\\..*\$") assertThat(options.isEnabled).isEqualTo(false) assertThat(options.isSendModules).isEqualTo(false) - assertThat(options.ignoredCheckIns) - .containsOnly(FilterString("slug1"), FilterString("slugB")) - assertThat(options.ignoredErrors) - .containsOnly(FilterString("Some error"), FilterString("Another .*")) - assertThat(options.ignoredTransactions) - .containsOnly(FilterString("transactionName1"), FilterString("transactionNameB")) + assertThat(options.ignoredCheckIns).containsOnly("slug1", "slugB") + assertThat(options.ignoredErrors).containsOnly("Some error", "Another .*") + assertThat(options.ignoredTransactions).containsOnly("transactionName1", "transactionNameB") assertThat(options.isEnableBackpressureHandling).isEqualTo(false) assertThat(options.isEnableDatabaseTransactionTracing).isEqualTo(true) assertThat(options.isForceInit).isEqualTo(true) diff --git a/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentryAutoConfigurationTest.kt b/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentryAutoConfigurationTest.kt index 315a3c1449b..9b9501246e5 100644 --- a/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentryAutoConfigurationTest.kt +++ b/sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentryAutoConfigurationTest.kt @@ -5,7 +5,6 @@ import io.opentelemetry.api.OpenTelemetry import io.sentry.Breadcrumb import io.sentry.DataCategory import io.sentry.EventProcessor -import io.sentry.FilterString import io.sentry.Hint import io.sentry.IContinuousProfiler import io.sentry.IProfileConverter @@ -282,12 +281,9 @@ class SentryAutoConfigurationTest { .containsOnly("localhost", "^(http|https)://api\\..*\$") assertThat(options.isEnabled).isEqualTo(false) assertThat(options.isSendModules).isEqualTo(false) - assertThat(options.ignoredCheckIns) - .containsOnly(FilterString("slug1"), FilterString("slugB")) - assertThat(options.ignoredErrors) - .containsOnly(FilterString("Some error"), FilterString("Another .*")) - assertThat(options.ignoredTransactions) - .containsOnly(FilterString("transactionName1"), FilterString("transactionNameB")) + assertThat(options.ignoredCheckIns).containsOnly("slug1", "slugB") + assertThat(options.ignoredErrors).containsOnly("Some error", "Another .*") + assertThat(options.ignoredTransactions).containsOnly("transactionName1", "transactionNameB") assertThat(options.isEnableBackpressureHandling).isEqualTo(false) assertThat(options.isEnableDatabaseTransactionTracing).isEqualTo(true) assertThat(options.isForceInit).isEqualTo(true) diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryKafkaRecordInterceptor.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryKafkaRecordInterceptor.java index 4d5abda711f..32db2eea846 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryKafkaRecordInterceptor.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/kafka/SentryKafkaRecordInterceptor.java @@ -129,7 +129,7 @@ public void clearThreadState(final @NotNull Consumer consumer) { } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private @Nullable ConsumerRecord delegateIntercept( diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java index 8a5d1db3e05..7f0c23f714f 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java @@ -126,7 +126,7 @@ private void maybeAddTracingHeaders( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), traceOrigin); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), traceOrigin); } private void addBreadcrumb( diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java index 1920a8f6ea2..1a0238e5be0 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java @@ -110,7 +110,7 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) { } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void addBreadcrumb( diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java index f32dcb3b873..4832e1c21ff 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java @@ -127,7 +127,7 @@ protected void doFilterInternal( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void doFilterWithTransaction( diff --git a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/webflux/AbstractSentryWebFilter.java b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/webflux/AbstractSentryWebFilter.java index da7be16d9af..a3edfd54c83 100644 --- a/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/webflux/AbstractSentryWebFilter.java +++ b/sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/webflux/AbstractSentryWebFilter.java @@ -66,7 +66,7 @@ && shouldTraceRequest(requestScopes, request)) { } private boolean isIgnored(final @NotNull IScopes scopes, final @NotNull String origin) { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), origin); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), origin); } protected void doFinally( diff --git a/sentry-spring/src/main/java/io/sentry/spring/kafka/SentryKafkaRecordInterceptor.java b/sentry-spring/src/main/java/io/sentry/spring/kafka/SentryKafkaRecordInterceptor.java index ed26e2ee795..bf65b64f950 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/kafka/SentryKafkaRecordInterceptor.java +++ b/sentry-spring/src/main/java/io/sentry/spring/kafka/SentryKafkaRecordInterceptor.java @@ -135,7 +135,7 @@ public void clearThreadState(final @NotNull Consumer consumer) { } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private @Nullable ConsumerRecord delegateIntercept( diff --git a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientHttpRequestInterceptor.java b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientHttpRequestInterceptor.java index 3a0bd6fc8cb..bdf2613540c 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientHttpRequestInterceptor.java +++ b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientHttpRequestInterceptor.java @@ -118,7 +118,7 @@ private void maybeAddTracingHeaders( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void addBreadcrumb( diff --git a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientWebRequestFilter.java b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientWebRequestFilter.java index eda50c41af2..5eeb0604463 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientWebRequestFilter.java +++ b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentrySpanClientWebRequestFilter.java @@ -107,7 +107,7 @@ private ClientRequest maybeAddHeaders( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void addBreadcrumb( diff --git a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentryTracingFilter.java b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentryTracingFilter.java index 941e160153e..02da16feaca 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/tracing/SentryTracingFilter.java +++ b/sentry-spring/src/main/java/io/sentry/spring/tracing/SentryTracingFilter.java @@ -126,7 +126,7 @@ protected void doFilterInternal( } private boolean isIgnored() { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private void doFilterWithTransaction( diff --git a/sentry-spring/src/main/java/io/sentry/spring/webflux/SentryWebFilter.java b/sentry-spring/src/main/java/io/sentry/spring/webflux/SentryWebFilter.java index 36e431dc124..031f579d4e4 100644 --- a/sentry-spring/src/main/java/io/sentry/spring/webflux/SentryWebFilter.java +++ b/sentry-spring/src/main/java/io/sentry/spring/webflux/SentryWebFilter.java @@ -110,7 +110,7 @@ isTracingEnabled && shouldTraceRequest(requestScopes, request) } private boolean isIgnored(final @NotNull IScopes scopes) { - return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN); + return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOriginFilters(), TRACE_ORIGIN); } private boolean shouldTraceRequest( diff --git a/sentry/api/sentry.api b/sentry/api/sentry.api index 8a08b2133be..f5dba14a31a 100644 --- a/sentry/api/sentry.api +++ b/sentry/api/sentry.api @@ -3551,10 +3551,14 @@ public class io/sentry/SentryOptions : io/sentry/transport/RateLimiterConfig { public fun getGestureTargetLocators ()Ljava/util/List; public fun getHostnameCache ()Lio/sentry/HostnameCache; public fun getIdleTimeout ()Ljava/lang/Long; + public fun getIgnoredCheckInFilters ()Ljava/util/List; public fun getIgnoredCheckIns ()Ljava/util/List; + public fun getIgnoredErrorFilters ()Ljava/util/List; public fun getIgnoredErrors ()Ljava/util/List; public fun getIgnoredExceptionsForType ()Ljava/util/Set; + public fun getIgnoredSpanOriginFilters ()Ljava/util/List; public fun getIgnoredSpanOrigins ()Ljava/util/List; + public fun getIgnoredTransactionFilters ()Ljava/util/List; public fun getIgnoredTransactions ()Ljava/util/List; public fun getInAppExcludes ()Ljava/util/List; public fun getInAppIncludes ()Ljava/util/List; diff --git a/sentry/src/main/java/io/sentry/Scopes.java b/sentry/src/main/java/io/sentry/Scopes.java index 1f3581d2af0..618c9c212a8 100644 --- a/sentry/src/main/java/io/sentry/Scopes.java +++ b/sentry/src/main/java/io/sentry/Scopes.java @@ -885,7 +885,7 @@ public void flush(long timeoutMillis) { "Instance is disabled and this 'startTransaction' returns a no-op."); transaction = NoOpTransaction.getInstance(); } else if (SpanUtils.isIgnored( - getOptions().getIgnoredSpanOrigins(), transactionContext.getOrigin())) { + getOptions().getIgnoredSpanOriginFilters(), transactionContext.getOrigin())) { getOptions() .getLogger() .log( diff --git a/sentry/src/main/java/io/sentry/SentryClient.java b/sentry/src/main/java/io/sentry/SentryClient.java index 22d330587c9..e0b1901f9b8 100644 --- a/sentry/src/main/java/io/sentry/SentryClient.java +++ b/sentry/src/main/java/io/sentry/SentryClient.java @@ -128,7 +128,7 @@ private boolean shouldApplyScopeData(final @NotNull CheckIn event, final @NotNul return SentryId.EMPTY_ID; } - if (ErrorUtils.isIgnored(options.getIgnoredErrors(), event)) { + if (ErrorUtils.isIgnored(options.getIgnoredErrorFilters(), event)) { options .getLogger() .log( @@ -1006,7 +1006,8 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint .getLogger() .log(SentryLevel.DEBUG, "Capturing transaction: %s", transaction.getEventId()); - if (TracingUtils.isIgnored(options.getIgnoredTransactions(), transaction.getTransaction())) { + if (TracingUtils.isIgnored( + options.getIgnoredTransactionFilters(), transaction.getTransaction())) { options .getLogger() .log( @@ -1165,7 +1166,7 @@ public void captureSession(final @NotNull Session session, final @Nullable Hint checkIn.setRelease(options.getRelease()); } - if (CheckInUtils.isIgnored(options.getIgnoredCheckIns(), checkIn.getMonitorSlug())) { + if (CheckInUtils.isIgnored(options.getIgnoredCheckInFilters(), checkIn.getMonitorSlug())) { options .getLogger() .log( diff --git a/sentry/src/main/java/io/sentry/SentryOptions.java b/sentry/src/main/java/io/sentry/SentryOptions.java index 3ed3e22befa..151567aa229 100644 --- a/sentry/src/main/java/io/sentry/SentryOptions.java +++ b/sentry/src/main/java/io/sentry/SentryOptions.java @@ -2032,11 +2032,23 @@ boolean containsIgnoredExceptionForType(final @NotNull Throwable throwable) { * `{event.throwable.class.name}: {event.throwable.message}` are checked against to determine if * an event shall be sent to Sentry or ignored. * + *

The returned list is a copy. Use the setter or adder to change the configured values. + * * @return the list of strings/regex patterns that `event.message`, `event.formatted`, and * `{event.throwable.class.name}: {event.throwable.message}` are checked against to determine * if an event shall be sent to Sentry or ignored */ - public @Nullable List getIgnoredErrors() { + public @Nullable List getIgnoredErrors() { + return toFilterStrings(ignoredErrors); + } + + /** + * Returns the compiled filters for {@link #getIgnoredErrors()}. + * + * @return the compiled filters + */ + @ApiStatus.Internal + public @Nullable List getIgnoredErrorFilters() { return ignoredErrors; } @@ -2959,10 +2971,22 @@ public void setSendModules(boolean sendModules) { * Returns the list of strings/regex patterns the origin of a new span/transaction will be tested * against to determine whether the span/transaction shall be created. * + *

The returned list is a copy. Use the setter or adder to change the configured values. + * * @return the list of strings or regex patterns */ @ApiStatus.Experimental - public @Nullable List getIgnoredSpanOrigins() { + public @Nullable List getIgnoredSpanOrigins() { + return toFilterStrings(ignoredSpanOrigins); + } + + /** + * Returns the compiled filters for {@link #getIgnoredSpanOrigins()}. + * + * @return the compiled filters + */ + @ApiStatus.Internal + public @Nullable List getIgnoredSpanOriginFilters() { return ignoredSpanOrigins; } @@ -3005,9 +3029,21 @@ public void setIgnoredSpanOrigins(final @Nullable List ignoredSpanOrigin /** * Returns the list of monitor slugs for which captured check-ins should not be sent to Sentry. * + *

The returned list is a copy. Use the setter or adder to change the configured values. + * * @return the list of monitor slugs */ - public @Nullable List getIgnoredCheckIns() { + public @Nullable List getIgnoredCheckIns() { + return toFilterStrings(ignoredCheckIns); + } + + /** + * Returns the compiled filters for {@link #getIgnoredCheckIns()}. + * + * @return the compiled filters + */ + @ApiStatus.Internal + public @Nullable List getIgnoredCheckInFilters() { return ignoredCheckIns; } @@ -3048,12 +3084,36 @@ public void setIgnoredCheckIns(final @Nullable List ignoredCheckIns) { * Returns the list of strings/regex patterns that captured transaction names are checked against * to determine if a transaction shall be sent to Sentry or ignored. * + *

The returned list is a copy. Use the setter or adder to change the configured values. + * * @return the list of strings/regex patterns */ - public @Nullable List getIgnoredTransactions() { + public @Nullable List getIgnoredTransactions() { + return toFilterStrings(ignoredTransactions); + } + + /** + * Returns the compiled filters for {@link #getIgnoredTransactions()}. + * + * @return the compiled filters + */ + @ApiStatus.Internal + public @Nullable List getIgnoredTransactionFilters() { return ignoredTransactions; } + private static @Nullable List toFilterStrings( + final @Nullable List filters) { + if (filters == null) { + return null; + } + final @NotNull List strings = new ArrayList<>(filters.size()); + for (final @NotNull FilterString filter : filters) { + strings.add(filter.getFilterString()); + } + return strings; + } + /** * Adds an element the list of strings/regex patterns that captured transaction names are checked * against to determine if a transaction shall be sent to Sentry or ignored. diff --git a/sentry/src/main/java/io/sentry/SentryTracer.java b/sentry/src/main/java/io/sentry/SentryTracer.java index 0c6c1106041..ad130ac55a9 100644 --- a/sentry/src/main/java/io/sentry/SentryTracer.java +++ b/sentry/src/main/java/io/sentry/SentryTracer.java @@ -426,7 +426,8 @@ private ISpan createChild( return NoOpSpan.getInstance(); } - if (SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), spanOptions.getOrigin())) { + if (SpanUtils.isIgnored( + scopes.getOptions().getIgnoredSpanOriginFilters(), spanOptions.getOrigin())) { return NoOpSpan.getInstance(); } diff --git a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt index e8e9046cfe1..2a33e9b53f1 100644 --- a/sentry/src/test/java/io/sentry/SentryOptionsTest.kt +++ b/sentry/src/test/java/io/sentry/SentryOptionsTest.kt @@ -626,13 +626,13 @@ class SentryOptionsTest { assertFalse(options.isEnabled) assertFalse(options.isEnablePrettySerializationOutput) assertFalse(options.isSendModules) - assertEquals(listOf(FilterString("slug1"), FilterString("slug-B")), options.ignoredCheckIns) + assertEquals(listOf("slug1", "slug-B"), options.ignoredCheckIns) assertEquals( - listOf(FilterString("transactionName1"), FilterString("transaction-name-B")), + listOf("transactionName1", "transaction-name-B"), options.ignoredTransactions, ) assertEquals( - listOf(FilterString("Some error"), FilterString("Another .*")), + listOf("Some error", "Another .*"), options.ignoredErrors, ) assertFalse(options.isEnableBackpressureHandling) @@ -1049,13 +1049,45 @@ class SentryOptionsTest { assertEquals(SentryOptions().initPriority, InitPriority.MEDIUM) } + @Test + fun `ignored filter getters return the strings that were set`() { + val options = SentryOptions() + options.ignoredErrors = listOf("error", "") + options.ignoredTransactions = listOf("transaction.*") + options.ignoredCheckIns = listOf("slug") + options.ignoredSpanOrigins = listOf("auto.http.*") + options.addIgnoredSpanOrigin("manual") + + assertEquals(listOf("error"), options.ignoredErrors) + assertEquals(listOf("transaction.*"), options.ignoredTransactions) + assertEquals(listOf("slug"), options.ignoredCheckIns) + assertEquals(listOf("auto.http.*", "manual"), options.ignoredSpanOrigins) + + assertEquals(listOf(FilterString("error")), options.ignoredErrorFilters) + assertEquals(listOf(FilterString("transaction.*")), options.ignoredTransactionFilters) + assertEquals(listOf(FilterString("slug")), options.ignoredCheckInFilters) + assertEquals( + listOf(FilterString("auto.http.*"), FilterString("manual")), + options.ignoredSpanOriginFilters, + ) + } + + @Test + fun `ignored filter getters return null when unset`() { + val options = SentryOptions() + assertNull(options.ignoredErrors) + assertNull(options.ignoredTransactions) + assertNull(options.ignoredCheckIns) + assertNull(options.ignoredSpanOrigins) + } + @Test fun `merging options when ignoredErrors is not set preserves the previous value`() { val externalOptions = ExternalOptions() val options = SentryOptions() options.setIgnoredErrors(listOf("error1", "error2")) options.merge(externalOptions) - assertEquals(listOf(FilterString("error1"), FilterString("error2")), options.ignoredErrors) + assertEquals(listOf("error1", "error2"), options.ignoredErrors) } @Test @@ -1065,7 +1097,7 @@ class SentryOptionsTest { options.setIgnoredTransactions(listOf("transaction1", "transaction2")) options.merge(externalOptions) assertEquals( - listOf(FilterString("transaction1"), FilterString("transaction2")), + listOf("transaction1", "transaction2"), options.ignoredTransactions, ) } @@ -1077,7 +1109,7 @@ class SentryOptionsTest { options.setIgnoredCheckIns(listOf("checkin1", "checkin2")) options.merge(externalOptions) assertEquals( - listOf(FilterString("checkin1"), FilterString("checkin2")), + listOf("checkin1", "checkin2"), options.ignoredCheckIns, ) } From af0aceb5f18769bf336d81e57ff7f82e4cd0c4d3 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Fri, 6 Nov 2026 10:25:58 +0000 Subject: [PATCH 2/2] changelog Co-Authored-By: Alexander Dinauer --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbc3ed4d50..4326222ff6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Breaking Changes +- `SentryOptions.getIgnoredErrors()`, `getIgnoredTransactions()`, `getIgnoredCheckIns()` and `getIgnoredSpanOrigins()` now return `List` instead of `List`, matching their setters ([#6489](https://github.com/getsentry/sentry-java/pull/6489)) - The SDK is now compiled for Java 11 instead of Java 8. JVM applications need Java 11 or newer ([#6459](https://github.com/getsentry/sentry-java/pull/6459)) - Default trace context status to `ok` when an active span has no explicit status ([#6418](https://github.com/getsentry/sentry-java/pull/6418)) - Remove the deprecated user feedback APIs ([#6337](https://github.com/getsentry/sentry-java/pull/6337))