Skip to content

Commit 592160f

Browse files
authored
Merge e29772c into ae7c69e
2 parents ae7c69e + e29772c commit 592160f

File tree

19 files changed

+275
-18
lines changed

19 files changed

+275
-18
lines changed

sentry-openfeign/src/main/java/io/sentry/openfeign/SentryFeignClient.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.sentry.SpanOptions;
1616
import io.sentry.SpanStatus;
1717
import io.sentry.util.Objects;
18+
import io.sentry.util.SpanUtils;
1819
import io.sentry.util.TracingUtils;
1920
import io.sentry.util.UrlUtils;
2021
import java.io.IOException;
@@ -98,6 +99,10 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O
9899

99100
private @NotNull Request maybeAddTracingHeaders(
100101
final @NotNull Request request, final @Nullable ISpan span) {
102+
if (isIgnored()) {
103+
return request;
104+
}
105+
101106
final @NotNull RequestWrapper requestWrapper = new RequestWrapper(request);
102107
final @Nullable Collection<String> requestBaggageHeaders =
103108
request.headers().get(BaggageHeader.BAGGAGE_HEADER);
@@ -124,6 +129,10 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O
124129
return requestWrapper.build();
125130
}
126131

132+
private boolean isIgnored() {
133+
return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN);
134+
}
135+
127136
private void addBreadcrumb(final @NotNull Request request, final @Nullable Response response) {
128137
final Breadcrumb breadcrumb =
129138
Breadcrumb.http(

sentry-openfeign/src/test/kotlin/io/sentry/openfeign/SentryFeignClientTest.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,17 @@ class SentryFeignClientTest {
130130
assertNotNull(recorderRequest.headers[BaggageHeader.BAGGAGE_HEADER])
131131
}
132132

133+
@Test
134+
fun `does not add sentry trace header when span origin is ignored`() {
135+
fixture.sentryOptions.dsn = "https://[email protected]/proj"
136+
fixture.sentryOptions.ignoredSpanOrigins = listOf("auto.http.openfeign")
137+
val sut = fixture.getSut(isSpanActive = false)
138+
sut.getOk()
139+
val recorderRequest = fixture.server.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
140+
assertNull(recorderRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
141+
assertNull(recorderRequest.headers[BaggageHeader.BAGGAGE_HEADER])
142+
}
143+
133144
@Test
134145
fun `when there is no active span, does not add sentry trace header to the request if host is disallowed`() {
135146
fixture.sentryOptions.setTracePropagationTargets(listOf("some-host-that-does-not-exist"))

sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestClientCustomizerTest.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import okhttp3.mockwebserver.MockWebServer
1717
import okhttp3.mockwebserver.SocketPolicy
1818
import org.apache.hc.client5.http.impl.classic.HttpClients
1919
import org.assertj.core.api.Assertions.assertThat
20+
import org.junit.Assert.assertNull
2021
import org.mockito.Mockito.doAnswer
2122
import org.mockito.Mockito.mock
2223
import org.mockito.Mockito.verify
@@ -248,6 +249,24 @@ class SentrySpanRestClientCustomizerTest {
248249
assertTrue(baggageHeaderValues[0].contains("sentry-trace_id"))
249250
}
250251

252+
@Test
253+
fun `does not add sentry-trace header if span origin is ignored`() {
254+
fixture.sentryOptions.ignoredSpanOrigins = listOf("auto.http.spring_jakarta.restclient")
255+
val sut = fixture.getSut(isTransactionActive = false)
256+
val headers = HttpHeaders()
257+
258+
sut.build()
259+
.get()
260+
.uri(fixture.url)
261+
.httpRequest { it.headers.addAll(headers) }
262+
.retrieve()
263+
.toEntity(String::class.java)
264+
265+
val recorderRequest = fixture.mockServer.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
266+
assertNull(recorderRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
267+
assertNull(recorderRequest.headers[BaggageHeader.BAGGAGE_HEADER])
268+
}
269+
251270
@Test
252271
fun `when transaction is active adds breadcrumb when http calls succeeds`() {
253272
fixture.getSut(isTransactionActive = true)

sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanRestTemplateCustomizerTest.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import okhttp3.mockwebserver.MockResponse
1616
import okhttp3.mockwebserver.MockWebServer
1717
import okhttp3.mockwebserver.SocketPolicy
1818
import org.assertj.core.api.Assertions.assertThat
19+
import org.junit.Assert.assertNull
1920
import org.mockito.kotlin.any
2021
import org.mockito.kotlin.anyOrNull
2122
import org.mockito.kotlin.check
@@ -198,6 +199,20 @@ class SentrySpanRestTemplateCustomizerTest {
198199
assertTrue(baggageHeaderValues[0].contains("sentry-trace_id"))
199200
}
200201

202+
@Test
203+
fun `does not add sentry-trace header when span origin is ignored`() {
204+
fixture.sentryOptions.ignoredSpanOrigins = listOf("auto.http.spring_jakarta.resttemplate")
205+
val sut = fixture.getSut(isTransactionActive = false)
206+
val headers = HttpHeaders()
207+
val requestEntity = HttpEntity<Unit>(headers)
208+
209+
sut.exchange(fixture.url, HttpMethod.GET, requestEntity, String::class.java)
210+
211+
val recorderRequest = fixture.mockServer.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
212+
assertNull(recorderRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
213+
assertNull(recorderRequest.headers[BaggageHeader.BAGGAGE_HEADER])
214+
}
215+
201216
@Test
202217
fun `avoids duplicate registration`() {
203218
val restTemplate = fixture.getSut(isTransactionActive = true)

sentry-spring-boot-jakarta/src/test/kotlin/io/sentry/spring/boot/jakarta/SentrySpanWebClientCustomizerTest.kt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.sentry.IScope
66
import io.sentry.IScopes
77
import io.sentry.Scope
88
import io.sentry.ScopeCallback
9+
import io.sentry.Sentry.OptionsConfiguration
910
import io.sentry.SentryOptions
1011
import io.sentry.SentryTraceHeader
1112
import io.sentry.SentryTracer
@@ -46,14 +47,15 @@ class SentrySpanWebClientCustomizerTest {
4647
lateinit var transaction: SentryTracer
4748
private val customizer = SentrySpanWebClientCustomizer(scopes)
4849

49-
fun getSut(isTransactionActive: Boolean, status: HttpStatus = HttpStatus.OK, throwIOException: Boolean = false, includeMockServerInTracingOrigins: Boolean = true): WebClient {
50-
sentryOptions = SentryOptions().apply {
50+
fun getSut(isTransactionActive: Boolean, status: HttpStatus = HttpStatus.OK, throwIOException: Boolean = false, includeMockServerInTracingOrigins: Boolean = true, optionsConfiguration: OptionsConfiguration<SentryOptions>? = null): WebClient {
51+
sentryOptions = SentryOptions().also {
52+
optionsConfiguration?.configure(it)
5153
if (includeMockServerInTracingOrigins) {
52-
setTracePropagationTargets(listOf(mockServer.hostName))
54+
it.setTracePropagationTargets(listOf(mockServer.hostName))
5355
} else {
54-
setTracePropagationTargets(listOf("other-api"))
56+
it.setTracePropagationTargets(listOf("other-api"))
5557
}
56-
dsn = "http://key@localhost/proj"
58+
it.dsn = "http://key@localhost/proj"
5759
}
5860
scope = Scope(sentryOptions)
5961
whenever(scopes.options).thenReturn(sentryOptions)
@@ -163,6 +165,22 @@ class SentrySpanWebClientCustomizerTest {
163165
assertNotNull(recordedRequest.headers[BaggageHeader.BAGGAGE_HEADER])
164166
}
165167

168+
@Test
169+
fun `does not add sentry-trace header when span origin is ignored`() {
170+
val sut = fixture.getSut(isTransactionActive = false, includeMockServerInTracingOrigins = true) { options ->
171+
options.ignoredSpanOrigins = listOf("auto.http.spring_jakarta.webclient")
172+
}
173+
sut
174+
.get()
175+
.uri(fixture.mockServer.url("/test/123").toUri())
176+
.retrieve()
177+
.bodyToMono(String::class.java)
178+
.block()
179+
val recordedRequest = fixture.mockServer.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
180+
assertNull(recordedRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
181+
assertNull(recordedRequest.headers[BaggageHeader.BAGGAGE_HEADER])
182+
}
183+
166184
@Test
167185
fun `when transaction is active and server is listed in tracing origins, adds sentry trace header to the request`() {
168186
fixture.getSut(isTransactionActive = true)

sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanRestTemplateCustomizerTest.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import okhttp3.mockwebserver.MockResponse
1616
import okhttp3.mockwebserver.MockWebServer
1717
import okhttp3.mockwebserver.SocketPolicy
1818
import org.assertj.core.api.Assertions.assertThat
19+
import org.junit.Assert.assertNull
1920
import org.mockito.kotlin.any
2021
import org.mockito.kotlin.anyOrNull
2122
import org.mockito.kotlin.check
@@ -200,6 +201,20 @@ class SentrySpanRestTemplateCustomizerTest {
200201
assertTrue(baggageHeaderValues[0].contains("sentry-trace_id"))
201202
}
202203

204+
@Test
205+
fun `does not add sentry-trace header when span origin is ignored`() {
206+
fixture.sentryOptions.ignoredSpanOrigins = listOf("auto.http.spring.resttemplate")
207+
val sut = fixture.getSut(isTransactionActive = false)
208+
val headers = HttpHeaders()
209+
val requestEntity = HttpEntity<Unit>(headers)
210+
211+
sut.exchange(fixture.url, HttpMethod.GET, requestEntity, String::class.java)
212+
213+
val recorderRequest = fixture.mockServer.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
214+
assertNull(recorderRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
215+
assertNull(recorderRequest.headers[BaggageHeader.BAGGAGE_HEADER])
216+
}
217+
203218
@Test
204219
fun `avoids duplicate registration`() {
205220
val restTemplate = fixture.getSut(isTransactionActive = true)

sentry-spring-boot/src/test/kotlin/io/sentry/spring/boot/SentrySpanWebClientCustomizerTest.kt

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.sentry.IScope
66
import io.sentry.IScopes
77
import io.sentry.Scope
88
import io.sentry.ScopeCallback
9+
import io.sentry.Sentry.OptionsConfiguration
910
import io.sentry.SentryOptions
1011
import io.sentry.SentryTraceHeader
1112
import io.sentry.SentryTracer
@@ -46,14 +47,15 @@ class SentrySpanWebClientCustomizerTest {
4647
lateinit var transaction: SentryTracer
4748
private val customizer = SentrySpanWebClientCustomizer(scopes)
4849

49-
fun getSut(isTransactionActive: Boolean, status: HttpStatus = HttpStatus.OK, throwIOException: Boolean = false, includeMockServerInTracingOrigins: Boolean = true): WebClient {
50-
sentryOptions = SentryOptions().apply {
50+
fun getSut(isTransactionActive: Boolean, status: HttpStatus = HttpStatus.OK, throwIOException: Boolean = false, includeMockServerInTracingOrigins: Boolean = true, optionsConfiguration: OptionsConfiguration<SentryOptions>? = null): WebClient {
51+
sentryOptions = SentryOptions().also {
52+
optionsConfiguration?.configure(it)
5153
if (includeMockServerInTracingOrigins) {
52-
setTracePropagationTargets(listOf(mockServer.hostName))
54+
it.setTracePropagationTargets(listOf(mockServer.hostName))
5355
} else {
54-
setTracePropagationTargets(listOf("other-api"))
56+
it.setTracePropagationTargets(listOf("other-api"))
5557
}
56-
dsn = "http://key@localhost/proj"
58+
it.dsn = "http://key@localhost/proj"
5759
}
5860
scope = Scope(sentryOptions)
5961
whenever(scopes.options).thenReturn(sentryOptions)
@@ -165,6 +167,22 @@ class SentrySpanWebClientCustomizerTest {
165167
assertNotNull(recordedRequest.headers[BaggageHeader.BAGGAGE_HEADER])
166168
}
167169

170+
@Test
171+
fun `does not add sentry-trace header when span origin is ignored`() {
172+
val sut = fixture.getSut(isTransactionActive = false, includeMockServerInTracingOrigins = true) { options ->
173+
options.ignoredSpanOrigins = listOf("auto.http.spring.webclient")
174+
}
175+
sut
176+
.get()
177+
.uri(fixture.mockServer.url("/test/123").toUri())
178+
.retrieve()
179+
.bodyToMono(String::class.java)
180+
.block()
181+
val recordedRequest = fixture.mockServer.takeRequest(mockServerRequestTimeoutMillis, TimeUnit.MILLISECONDS)!!
182+
assertNull(recordedRequest.headers[SentryTraceHeader.SENTRY_TRACE_HEADER])
183+
assertNull(recordedRequest.headers[BaggageHeader.BAGGAGE_HEADER])
184+
}
185+
168186
@Test
169187
fun `when transaction is active and server is listed in tracing origins, adds sentry trace header to the request`() {
170188
fixture.getSut(isTransactionActive = true)

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientHttpRequestInterceptor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.sentry.SpanOptions;
1515
import io.sentry.SpanStatus;
1616
import io.sentry.util.Objects;
17+
import io.sentry.util.SpanUtils;
1718
import io.sentry.util.TracingUtils;
1819
import io.sentry.util.UrlUtils;
1920
import java.io.IOException;
@@ -90,6 +91,10 @@ public SentrySpanClientHttpRequestInterceptor(
9091

9192
private void maybeAddTracingHeaders(
9293
final @NotNull HttpRequest request, final @Nullable ISpan span) {
94+
if (isIgnored()) {
95+
return;
96+
}
97+
9398
final @Nullable TracingUtils.TracingHeaders tracingHeaders =
9499
TracingUtils.traceIfAllowed(
95100
scopes,
@@ -111,6 +116,10 @@ private void maybeAddTracingHeaders(
111116
}
112117
}
113118

119+
private boolean isIgnored() {
120+
return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), traceOrigin);
121+
}
122+
114123
private void addBreadcrumb(
115124
final @NotNull HttpRequest request,
116125
final @NotNull byte[] body,

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentrySpanClientWebRequestFilter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.sentry.SpanOptions;
1414
import io.sentry.SpanStatus;
1515
import io.sentry.util.Objects;
16+
import io.sentry.util.SpanUtils;
1617
import io.sentry.util.TracingUtils;
1718
import java.util.Locale;
1819
import org.jetbrains.annotations.NotNull;
@@ -71,6 +72,10 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) {
7172

7273
private @NotNull ClientRequest maybeAddTracingHeaders(
7374
final @NotNull ClientRequest request, final @Nullable ISpan span) {
75+
if (isIgnored()) {
76+
return request;
77+
}
78+
7479
final ClientRequest.Builder requestBuilder = ClientRequest.from(request);
7580

7681
final @Nullable TracingUtils.TracingHeaders tracingHeaders =
@@ -98,6 +103,10 @@ public SentrySpanClientWebRequestFilter(final @NotNull IScopes scopes) {
98103
return requestBuilder.build();
99104
}
100105

106+
private boolean isIgnored() {
107+
return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN);
108+
}
109+
101110
private void addBreadcrumb(
102111
final @NotNull ClientRequest request, final @Nullable ClientResponse response) {
103112
final Breadcrumb breadcrumb =

sentry-spring-jakarta/src/main/java/io/sentry/spring/jakarta/tracing/SentryTracingFilter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.sentry.TransactionOptions;
1313
import io.sentry.protocol.TransactionNameSource;
1414
import io.sentry.util.Objects;
15+
import io.sentry.util.SpanUtils;
1516
import jakarta.servlet.FilterChain;
1617
import jakarta.servlet.ServletException;
1718
import jakarta.servlet.http.HttpServletRequest;
@@ -77,7 +78,7 @@ protected void doFilterInternal(
7778
final @NotNull HttpServletResponse httpResponse,
7879
final @NotNull FilterChain filterChain)
7980
throws ServletException, IOException {
80-
if (scopes.isEnabled()) {
81+
if (scopes.isEnabled() && !isIgnored()) {
8182
final @Nullable String sentryTraceHeader =
8283
httpRequest.getHeader(SentryTraceHeader.SENTRY_TRACE_HEADER);
8384
final @Nullable List<String> baggageHeader =
@@ -94,6 +95,10 @@ protected void doFilterInternal(
9495
}
9596
}
9697

98+
private boolean isIgnored() {
99+
return SpanUtils.isIgnored(scopes.getOptions().getIgnoredSpanOrigins(), TRACE_ORIGIN);
100+
}
101+
97102
private void doFilterWithTransaction(
98103
HttpServletRequest httpRequest,
99104
HttpServletResponse httpResponse,

0 commit comments

Comments
 (0)