Skip to content

Commit 3e8377a

Browse files
authored
Merge db965a6 into 4361e86
2 parents 4361e86 + db965a6 commit 3e8377a

File tree

12 files changed

+189
-49
lines changed

12 files changed

+189
-49
lines changed

sentry/api/sentry.api

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,12 @@ public final class io/sentry/ExternalOptions {
509509
public fun setTracesSampleRate (Ljava/lang/Double;)V
510510
}
511511

512+
public final class io/sentry/FilterString {
513+
public fun <init> (Ljava/lang/String;)V
514+
public fun getFilterString ()Ljava/lang/String;
515+
public fun matches (Ljava/lang/String;)Z
516+
}
517+
512518
public final class io/sentry/FullyDisplayedReporter {
513519
public static fun getInstance ()Lio/sentry/FullyDisplayedReporter;
514520
public fun registerFullyDrawnListener (Lio/sentry/FullyDisplayedReporter$FullyDisplayedReporterListener;)V
@@ -2788,7 +2794,10 @@ public class io/sentry/SentryOptions {
27882794
public fun addBundleId (Ljava/lang/String;)V
27892795
public fun addContextTag (Ljava/lang/String;)V
27902796
public fun addEventProcessor (Lio/sentry/EventProcessor;)V
2797+
public fun addIgnoredCheckIn (Ljava/lang/String;)V
27912798
public fun addIgnoredExceptionForType (Ljava/lang/Class;)V
2799+
public fun addIgnoredSpanOrigin (Ljava/lang/String;)V
2800+
public fun addIgnoredTransaction (Ljava/lang/String;)V
27922801
public fun addInAppExclude (Ljava/lang/String;)V
27932802
public fun addInAppInclude (Ljava/lang/String;)V
27942803
public fun addIntegration (Lio/sentry/Integration;)V
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package io.sentry;
2+
3+
import java.util.Objects;
4+
import java.util.regex.Pattern;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
public final class FilterString {
8+
private final @NotNull String filterString;
9+
private final @NotNull Pattern pattern;
10+
11+
public FilterString(@NotNull String filterString) {
12+
this.filterString = filterString;
13+
this.pattern = Pattern.compile(filterString);
14+
}
15+
16+
public @NotNull String getFilterString() {
17+
return filterString;
18+
}
19+
20+
public boolean matches(String input) {
21+
return pattern.matcher(input).matches();
22+
}
23+
24+
@Override
25+
public boolean equals(Object o) {
26+
if (o == null || getClass() != o.getClass()) return false;
27+
FilterString that = (FilterString) o;
28+
return Objects.equals(filterString, that.filterString);
29+
}
30+
31+
@Override
32+
public int hashCode() {
33+
return Objects.hashCode(filterString);
34+
}
35+
}

sentry/src/main/java/io/sentry/SentryOptions.java

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -466,12 +466,12 @@ public class SentryOptions {
466466
private boolean enableScopePersistence = true;
467467

468468
/** Contains a list of monitor slugs for which check-ins should not be sent. */
469-
@ApiStatus.Experimental private @Nullable List<String> ignoredCheckIns = null;
469+
@ApiStatus.Experimental private @Nullable List<FilterString> ignoredCheckIns = null;
470470

471471
/** Contains a list of span origins for which spans / transactions should not be created. */
472-
@ApiStatus.Experimental private @Nullable List<String> ignoredSpanOrigins = null;
472+
@ApiStatus.Experimental private @Nullable List<FilterString> ignoredSpanOrigins = null;
473473

474-
private @Nullable List<String> ignoredTransactions = null;
474+
private @Nullable List<FilterString> ignoredTransactions = null;
475475

476476
@ApiStatus.Experimental
477477
private @NotNull IBackpressureMonitor backpressureMonitor = NoOpBackpressureMonitor.getInstance();
@@ -2173,35 +2173,27 @@ public void setSendModules(boolean sendModules) {
21732173
}
21742174

21752175
@ApiStatus.Experimental
2176-
public void setIgnoredCheckIns(final @Nullable List<String> ignoredCheckIns) {
2177-
if (ignoredCheckIns == null) {
2178-
this.ignoredCheckIns = null;
2179-
} else {
2180-
@NotNull final List<String> filteredIgnoredCheckIns = new ArrayList<>();
2181-
for (String slug : ignoredCheckIns) {
2182-
if (!slug.isEmpty()) {
2183-
filteredIgnoredCheckIns.add(slug);
2184-
}
2185-
}
2186-
2187-
this.ignoredCheckIns = filteredIgnoredCheckIns;
2188-
}
2176+
public @Nullable List<FilterString> getIgnoredSpanOrigins() {
2177+
return ignoredSpanOrigins;
21892178
}
21902179

21912180
@ApiStatus.Experimental
2192-
public @Nullable List<String> getIgnoredSpanOrigins() {
2193-
return ignoredSpanOrigins;
2181+
public void addIgnoredSpanOrigin(String ignoredSpanOrigin) {
2182+
if (ignoredSpanOrigins == null) {
2183+
ignoredSpanOrigins = new ArrayList<>();
2184+
}
2185+
ignoredSpanOrigins.add(new FilterString(ignoredSpanOrigin));
21942186
}
21952187

21962188
@ApiStatus.Experimental
21972189
public void setIgnoredSpanOrigins(final @Nullable List<String> ignoredSpanOrigins) {
21982190
if (ignoredSpanOrigins == null) {
21992191
this.ignoredSpanOrigins = null;
22002192
} else {
2201-
@NotNull final List<String> filtered = new ArrayList<>();
2193+
@NotNull final List<FilterString> filtered = new ArrayList<>();
22022194
for (String origin : ignoredSpanOrigins) {
22032195
if (origin != null && !origin.isEmpty()) {
2204-
filtered.add(origin);
2196+
filtered.add(new FilterString(origin));
22052197
}
22062198
}
22072199

@@ -2210,23 +2202,55 @@ public void setIgnoredSpanOrigins(final @Nullable List<String> ignoredSpanOrigin
22102202
}
22112203

22122204
@ApiStatus.Experimental
2213-
public @Nullable List<String> getIgnoredCheckIns() {
2205+
public @Nullable List<FilterString> getIgnoredCheckIns() {
22142206
return ignoredCheckIns;
22152207
}
22162208

2217-
public @Nullable List<String> getIgnoredTransactions() {
2209+
@ApiStatus.Experimental
2210+
public void addIgnoredCheckIn(String ignoredCheckIn) {
2211+
if (ignoredCheckIns == null) {
2212+
ignoredCheckIns = new ArrayList<>();
2213+
}
2214+
ignoredCheckIns.add(new FilterString(ignoredCheckIn));
2215+
}
2216+
2217+
@ApiStatus.Experimental
2218+
public void setIgnoredCheckIns(final @Nullable List<String> ignoredCheckIns) {
2219+
if (ignoredCheckIns == null) {
2220+
this.ignoredCheckIns = null;
2221+
} else {
2222+
@NotNull final List<FilterString> filteredIgnoredCheckIns = new ArrayList<>();
2223+
for (String slug : ignoredCheckIns) {
2224+
if (!slug.isEmpty()) {
2225+
filteredIgnoredCheckIns.add(new FilterString(slug));
2226+
}
2227+
}
2228+
2229+
this.ignoredCheckIns = filteredIgnoredCheckIns;
2230+
}
2231+
}
2232+
2233+
public @Nullable List<FilterString> getIgnoredTransactions() {
22182234
return ignoredTransactions;
22192235
}
22202236

2237+
@ApiStatus.Experimental
2238+
public void addIgnoredTransaction(String ignoredTransaction) {
2239+
if (ignoredTransactions == null) {
2240+
ignoredTransactions = new ArrayList<>();
2241+
}
2242+
ignoredTransactions.add(new FilterString(ignoredTransaction));
2243+
}
2244+
22212245
@ApiStatus.Experimental
22222246
public void setIgnoredTransactions(final @Nullable List<String> ignoredTransactions) {
22232247
if (ignoredTransactions == null) {
22242248
this.ignoredTransactions = null;
22252249
} else {
2226-
@NotNull final List<String> filtered = new ArrayList<>();
2250+
@NotNull final List<FilterString> filtered = new ArrayList<>();
22272251
for (String transactionName : ignoredTransactions) {
22282252
if (transactionName != null && !transactionName.isEmpty()) {
2229-
filtered.add(transactionName);
2253+
filtered.add(new FilterString(transactionName));
22302254
}
22312255
}
22322256

sentry/src/main/java/io/sentry/util/CheckInUtils.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.sentry.CheckIn;
44
import io.sentry.CheckInStatus;
55
import io.sentry.DateUtils;
6+
import io.sentry.FilterString;
67
import io.sentry.IScopes;
78
import io.sentry.ISentryLifecycleToken;
89
import io.sentry.MonitorConfig;
@@ -116,18 +117,20 @@ public static <U> U withCheckIn(
116117
/** Checks if a check-in for a monitor (CRON) has been ignored. */
117118
@ApiStatus.Internal
118119
public static boolean isIgnored(
119-
final @Nullable List<String> ignoredSlugs, final @NotNull String slug) {
120+
final @Nullable List<FilterString> ignoredSlugs, final @NotNull String slug) {
120121
if (ignoredSlugs == null || ignoredSlugs.isEmpty()) {
121122
return false;
122123
}
123124

124-
for (final String ignoredSlug : ignoredSlugs) {
125-
if (ignoredSlug.equalsIgnoreCase(slug)) {
125+
for (final FilterString ignoredSlug : ignoredSlugs) {
126+
if (ignoredSlug.getFilterString().equalsIgnoreCase(slug)) {
126127
return true;
127128
}
129+
}
128130

131+
for (final FilterString ignoredSlug : ignoredSlugs) {
129132
try {
130-
if (slug.matches(ignoredSlug)) {
133+
if (ignoredSlug.matches(slug)) {
131134
return true;
132135
}
133136
} catch (Throwable t) {

sentry/src/main/java/io/sentry/util/SpanUtils.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package io.sentry.util;
22

3+
import io.sentry.FilterString;
34
import java.util.ArrayList;
45
import java.util.List;
6+
import java.util.Map;
7+
import java.util.concurrent.ConcurrentHashMap;
58
import org.jetbrains.annotations.ApiStatus;
69
import org.jetbrains.annotations.NotNull;
710
import org.jetbrains.annotations.Nullable;
@@ -37,28 +40,39 @@ public final class SpanUtils {
3740
return origins;
3841
}
3942

43+
private static final Map<String, Boolean> ignoredSpanDecisionsCache = new ConcurrentHashMap<>();
44+
4045
/** Checks if a span origin has been ignored. */
4146
@ApiStatus.Internal
4247
public static boolean isIgnored(
43-
final @Nullable List<String> ignoredOrigins, final @Nullable String origin) {
48+
final @Nullable List<FilterString> ignoredOrigins, final @Nullable String origin) {
4449
if (origin == null || ignoredOrigins == null || ignoredOrigins.isEmpty()) {
4550
return false;
4651
}
4752

48-
for (final String ignoredOrigin : ignoredOrigins) {
49-
if (ignoredOrigin.equalsIgnoreCase(origin)) {
53+
if (ignoredSpanDecisionsCache.containsKey(origin)) {
54+
return ignoredSpanDecisionsCache.get(origin);
55+
}
56+
57+
for (final FilterString ignoredOrigin : ignoredOrigins) {
58+
if (ignoredOrigin.getFilterString().equalsIgnoreCase(origin)) {
59+
ignoredSpanDecisionsCache.put(origin, true);
5060
return true;
5161
}
62+
}
5263

64+
for (final FilterString ignoredOrigin : ignoredOrigins) {
5365
try {
54-
if (origin.matches(ignoredOrigin)) {
66+
if (ignoredOrigin.matches(origin)) {
67+
ignoredSpanDecisionsCache.put(origin, true);
5568
return true;
5669
}
5770
} catch (Throwable t) {
5871
// ignore invalid regex
5972
}
6073
}
6174

75+
ignoredSpanDecisionsCache.put(origin, false);
6276
return false;
6377
}
6478
}

sentry/src/main/java/io/sentry/util/TracingUtils.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.sentry.Baggage;
44
import io.sentry.BaggageHeader;
5+
import io.sentry.FilterString;
56
import io.sentry.IScope;
67
import io.sentry.IScopes;
78
import io.sentry.ISpan;
@@ -123,21 +124,25 @@ public TracingHeaders(
123124
/** Checks if a transaction is to be ignored. */
124125
@ApiStatus.Internal
125126
public static boolean isIgnored(
126-
final @Nullable List<String> ignoredTransactions, final @Nullable String transactionName) {
127+
final @Nullable List<FilterString> ignoredTransactions,
128+
final @Nullable String transactionName) {
127129
if (transactionName == null) {
128130
return false;
129131
}
130132
if (ignoredTransactions == null || ignoredTransactions.isEmpty()) {
131133
return false;
132134
}
133135

134-
for (final String ignoredSlug : ignoredTransactions) {
135-
if (ignoredSlug.equalsIgnoreCase(transactionName)) {
136+
for (final FilterString ignoredTransaction : ignoredTransactions) {
137+
if (ignoredTransaction.getFilterString().equalsIgnoreCase(transactionName)) {
136138
return true;
137139
}
140+
}
141+
142+
for (final FilterString ignoredTransaction : ignoredTransactions) {
138143

139144
try {
140-
if (transactionName.matches(ignoredSlug)) {
145+
if (ignoredTransaction.matches(transactionName)) {
141146
return true;
142147
}
143148
} catch (Throwable t) {

sentry/src/test/java/io/sentry/ScopesTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2084,7 +2084,7 @@ class ScopesTest {
20842084
@Test
20852085
fun `creating a transaction with an ignored origin noops`() {
20862086
val scopes = generateScopes {
2087-
it.ignoredSpanOrigins = listOf("ignored.span.origin")
2087+
it.setIgnoredSpanOrigins(listOf("ignored.span.origin"))
20882088
}
20892089

20902090
val transactionContext = TransactionContext("transaction-name", "transaction-op")
@@ -2101,7 +2101,7 @@ class ScopesTest {
21012101
@Test
21022102
fun `creating a transaction with a non ignored origin creates the transaction`() {
21032103
val scopes = generateScopes {
2104-
it.ignoredSpanOrigins = listOf("ignored.span.origin")
2104+
it.setIgnoredSpanOrigins(listOf("ignored.span.origin"))
21052105
}
21062106

21072107
val transactionContext = TransactionContext("transaction-name", "transaction-op")

sentry/src/test/java/io/sentry/SentryClientTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ class SentryClientTest {
587587
@Test
588588
fun `when captureCheckIn, envelope is sent if ignored slug does not match`() {
589589
val sut = fixture.getSut { options ->
590-
options.ignoredCheckIns = listOf("non_matching_slug")
590+
options.setIgnoredCheckIns(listOf("non_matching_slug"))
591591
}
592592

593593
sut.captureCheckIn(checkIn, null, null)
@@ -611,7 +611,7 @@ class SentryClientTest {
611611
@Test
612612
fun `when captureCheckIn, envelope is not sent if slug is ignored`() {
613613
val sut = fixture.getSut { options ->
614-
options.ignoredCheckIns = listOf("some_slug")
614+
options.setIgnoredCheckIns(listOf("some_slug"))
615615
}
616616

617617
sut.captureCheckIn(checkIn, null, null)
@@ -821,7 +821,7 @@ class SentryClientTest {
821821

822822
@Test
823823
fun `transaction dropped by ignoredTransactions is recorded`() {
824-
fixture.sentryOptions.ignoredTransactions = listOf("a-transaction")
824+
fixture.sentryOptions.setIgnoredTransactions(listOf("a-transaction"))
825825

826826
val transaction = SentryTransaction(fixture.sentryTracer)
827827

@@ -843,7 +843,7 @@ class SentryClientTest {
843843

844844
@Test
845845
fun `transaction dropped by ignoredTransactions with regex is recorded`() {
846-
fixture.sentryOptions.ignoredTransactions = listOf("a.*action")
846+
fixture.sentryOptions.setIgnoredTransactions(listOf("a.*action"))
847847

848848
val transaction = SentryTransaction(fixture.sentryTracer)
849849

sentry/src/test/java/io/sentry/SentryOptionsTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,8 +368,8 @@ class SentryOptionsTest {
368368
assertFalse(options.isEnabled)
369369
assertFalse(options.isEnablePrettySerializationOutput)
370370
assertFalse(options.isSendModules)
371-
assertEquals(listOf("slug1", "slug-B"), options.ignoredCheckIns)
372-
assertEquals(listOf("transactionName1", "transaction-name-B"), options.ignoredTransactions)
371+
assertEquals(listOf(FilterString("slug1"), FilterString("slug-B")), options.ignoredCheckIns)
372+
assertEquals(listOf(FilterString("transactionName1"), FilterString("transaction-name-B")), options.ignoredTransactions)
373373
assertFalse(options.isEnableBackpressureHandling)
374374
assertTrue(options.isForceInit)
375375
assertNotNull(options.cron)

sentry/src/test/java/io/sentry/SentryTracerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class SentryTracerTest {
8787
val tracer = fixture.getSut({
8888
it.setDebug(true)
8989
it.setLogger(SystemOutLogger())
90-
it.ignoredSpanOrigins = listOf("ignored")
90+
it.setIgnoredSpanOrigins(listOf("ignored"))
9191
})
9292
tracer.startChild("child1", null, SpanOptions().also { it.origin = "ignored" })
9393
tracer.startChild("child2")

0 commit comments

Comments
 (0)