Skip to content

Commit 86e38ab

Browse files
authored
Merge pull request #5810 from getsentry/feat/data-collection-query-params
feat(http): [Data Collection 12] Apply query parameter policy
2 parents 14a445d + c1f1de2 commit 86e38ab

36 files changed

Lines changed: 408 additions & 53 deletions

File tree

‎sentry-apollo-3/src/main/java/io/sentry/apollo3/SentryApollo3HttpInterceptor.kt‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ constructor(
160160
operationType: String?,
161161
operationId: String?,
162162
): ISpan {
163-
val urlDetails = UrlUtils.parse(request.url)
163+
val urlDetails = UrlUtils.parse(request.url, scopes.options.dataCollectionResolver)
164164
val method = request.method.name
165165

166166
val operation = if (operationType != null) "http.graphql.$operationType" else "http.graphql"
@@ -232,7 +232,13 @@ constructor(
232232
span.finish()
233233
}
234234

235-
val breadcrumb = Breadcrumb.http(request.url, request.method.name, statusCode)
235+
val breadcrumb =
236+
Breadcrumb.http(
237+
request.url,
238+
request.method.name,
239+
statusCode,
240+
scopes.options.dataCollectionResolver,
241+
)
236242

237243
request.body?.contentLength.ifHasValidLength { contentLength ->
238244
breadcrumb.setData("request_body_size", contentLength)
@@ -351,7 +357,7 @@ constructor(
351357
// url will be: https://api.github.com/users/getsentry/repos/
352358
// ideally we'd like a parameterized url: https://api.github.com/users/{user}/repos/
353359
// but that's not possible
354-
val urlDetails = UrlUtils.parse(request.url)
360+
val urlDetails = UrlUtils.parse(request.url, scopes.options.dataCollectionResolver)
355361

356362
// return if its not a target match
357363
if (!PropagationTargetsUtils.contain(failedRequestTargets, urlDetails.urlOrFallback)) {

‎sentry-apollo-4/src/main/java/io/sentry/apollo4/SentryApollo4HttpInterceptor.kt‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ constructor(
159159
operationType: String?,
160160
operationId: String?,
161161
): ISpan {
162-
val urlDetails = UrlUtils.parse(request.url)
162+
val urlDetails = UrlUtils.parse(request.url, scopes.options.dataCollectionResolver)
163163
val method = request.method.name
164164

165165
val operation = if (operationType != null) "http.graphql.$operationType" else "http.graphql"
@@ -231,7 +231,13 @@ constructor(
231231
span.finish()
232232
}
233233

234-
val breadcrumb = Breadcrumb.http(request.url, request.method.name, statusCode)
234+
val breadcrumb =
235+
Breadcrumb.http(
236+
request.url,
237+
request.method.name,
238+
statusCode,
239+
scopes.options.dataCollectionResolver,
240+
)
235241

236242
request.body?.contentLength.ifHasValidLength { contentLength ->
237243
breadcrumb.setData("request_body_size", contentLength)
@@ -350,7 +356,7 @@ constructor(
350356
// url will be: https://api.github.com/users/getsentry/repos/
351357
// ideally we'd like a parameterized url: https://api.github.com/users/{user}/repos/
352358
// but that's not possible
353-
val urlDetails = UrlUtils.parse(request.url)
359+
val urlDetails = UrlUtils.parse(request.url, scopes.options.dataCollectionResolver)
354360

355361
// return if it's not a target match
356362
if (!PropagationTargetsUtils.contain(failedRequestTargets, urlDetails.urlOrFallback)) {

‎sentry-apollo/src/main/java/io/sentry/apollo/SentryApolloInterceptor.kt‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,12 @@ class SentryApolloInterceptor(
198198
val httpRequest = httpResponse.request()
199199

200200
val breadcrumb =
201-
Breadcrumb.http(httpRequest.url().toString(), httpRequest.method(), httpResponse.code())
201+
Breadcrumb.http(
202+
httpRequest.url().toString(),
203+
httpRequest.method(),
204+
httpResponse.code(),
205+
scopes.options.dataCollectionResolver,
206+
)
202207

203208
httpRequest.body()?.contentLength().ifHasValidLength { contentLength ->
204209
breadcrumb.setData("request_body_size", contentLength)

‎sentry-ktor-client/src/main/java/io/sentry/ktorClient/SentryKtorClientUtils.kt‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal object SentryKtorClientUtils {
2525
request: HttpRequest,
2626
response: HttpResponse,
2727
) {
28-
val urlDetails = UrlUtils.parse(request.url.toString())
28+
val urlDetails = UrlUtils.parse(request.url.toString(), scopes.options.dataCollectionResolver)
2929

3030
val mechanism = Mechanism().apply { type = "SentryKtorClientPlugin" }
3131
val exception =
@@ -116,7 +116,12 @@ internal object SentryKtorClientUtils {
116116
endTimestamp: SentryDate?,
117117
) {
118118
val breadcrumb =
119-
Breadcrumb.http(request.url.toString(), request.method.value, response.status.value)
119+
Breadcrumb.http(
120+
request.url.toString(),
121+
request.method.value,
122+
response.status.value,
123+
scopes.options.dataCollectionResolver,
124+
)
120125
breadcrumb.setData(
121126
SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY,
122127
response.contentLength(),

‎sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpEvent.kt‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ internal class SentryOkHttpEvent(private val scopes: IScopes, private val reques
3434
private var method: String
3535

3636
init {
37-
val urlDetails = UrlUtils.parse(request.url.toString())
37+
val urlDetails = UrlUtils.parse(request.url.toString(), scopes.options.dataCollectionResolver)
3838
url = urlDetails.urlOrFallback
3939
method = request.method
4040

@@ -62,7 +62,7 @@ internal class SentryOkHttpEvent(private val scopes: IScopes, private val reques
6262
* due to interceptors.
6363
*/
6464
fun setRequest(request: Request) {
65-
val urlDetails = UrlUtils.parse(request.url.toString())
65+
val urlDetails = UrlUtils.parse(request.url.toString(), scopes.options.dataCollectionResolver)
6666
url = urlDetails.urlOrFallback
6767

6868
val host: String = request.url.host
@@ -78,8 +78,8 @@ internal class SentryOkHttpEvent(private val scopes: IScopes, private val reques
7878
breadcrumb.setData("url", urlDetails.url!!)
7979
}
8080
breadcrumb.setData("method", method.uppercase())
81-
if (urlDetails.query != null) {
82-
breadcrumb.setData("http.query", urlDetails.query!!)
81+
urlDetails.query?.let {
82+
breadcrumb.setData("http.query", it)
8383
}
8484
if (urlDetails.fragment != null) {
8585
breadcrumb.setData("http.fragment", urlDetails.fragment!!)

‎sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpInterceptor.kt‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public open class SentryOkHttpInterceptor(
8181
override fun intercept(chain: Interceptor.Chain): Response {
8282
var request = chain.request()
8383

84-
val urlDetails = UrlUtils.parse(request.url.toString())
84+
val urlDetails = UrlUtils.parse(request.url.toString(), scopes.options.dataCollectionResolver)
8585
val url = urlDetails.urlOrFallback
8686
val method = request.method
8787

@@ -235,7 +235,13 @@ public open class SentryOkHttpInterceptor(
235235
startTimestamp: Long,
236236
networkDetailData: NetworkRequestData?,
237237
) {
238-
val breadcrumb = Breadcrumb.http(request.url.toString(), request.method, code)
238+
val breadcrumb =
239+
Breadcrumb.http(
240+
request.url.toString(),
241+
request.method,
242+
code,
243+
scopes.options.dataCollectionResolver,
244+
)
239245

240246
// Track request and response body sizes for the breadcrumb
241247
request.body?.contentLength().ifHasValidLength {

‎sentry-okhttp/src/main/java/io/sentry/okhttp/SentryOkHttpUtils.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ internal object SentryOkHttpUtils {
2121
// url will be: https://api.github.com/users/getsentry/repos/
2222
// ideally we'd like a parameterized url: https://api.github.com/users/{user}/repos/
2323
// but that's not possible
24-
val urlDetails = UrlUtils.parse(request.url.toString())
24+
val urlDetails = UrlUtils.parse(request.url.toString(), scopes.options.dataCollectionResolver)
2525

2626
val mechanism = Mechanism().apply { type = "SentryOkHttpInterceptor" }
2727
val exception =

‎sentry-okhttp/src/test/java/io/sentry/okhttp/SentryOkHttpInterceptorTest.kt‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,26 @@ class SentryOkHttpInterceptorTest {
504504
)
505505
}
506506

507+
@Test
508+
fun `data collection filters failed request query parameters`() {
509+
val sut =
510+
fixture.getSut(
511+
captureFailedRequests = true,
512+
httpStatusCode = 500,
513+
optionsConfiguration = { it.dataCollection.setUserInfo(false) },
514+
)
515+
516+
sut.newCall(getRequest(url = "/hello?name=value&token=secret")).execute()
517+
518+
verify(fixture.scopes)
519+
.captureEvent(
520+
check {
521+
assertEquals("name=value&token=[Filtered]", it.request!!.queryString)
522+
},
523+
any<Hint>(),
524+
)
525+
}
526+
507527
@Test
508528
fun `captures an error event with request body size`() {
509529
val sut = fixture.getSut(captureFailedRequests = true, httpStatusCode = 500)

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O
7373
final @NotNull SpanOptions spanOptions = new SpanOptions();
7474
spanOptions.setOrigin(TRACE_ORIGIN);
7575
ISpan span = activeSpan.startChild("http.client", null, spanOptions);
76-
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.url());
76+
final @NotNull UrlUtils.UrlDetails urlDetails =
77+
UrlUtils.parse(request.url(), scopes.getOptions().getDataCollectionResolver());
7778
final @NotNull String method = request.httpMethod().name();
7879
span.setDescription(method + " " + urlDetails.getUrlOrFallback());
7980
span.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT));
@@ -158,7 +159,8 @@ private void addBreadcrumb(final @NotNull Request request, final @Nullable Respo
158159
Breadcrumb.http(
159160
request.url(),
160161
request.httpMethod().name(),
161-
response != null ? response.status() : null);
162+
response != null ? response.status() : null,
163+
scopes.getOptions().getDataCollectionResolver());
162164
breadcrumb.setData("request_body_size", request.body() != null ? request.body().length : 0);
163165
if (response != null && response.body() != null && response.body().length() != null) {
164166
breadcrumb.setData("response_body_size", response.body().length());

‎sentry-servlet-jakarta/src/main/java/io/sentry/servlet/jakarta/SentryRequestHttpServletRequestProcessor.java‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ public SentryRequestHttpServletRequestProcessor(
3636
final Request sentryRequest = new Request();
3737
sentryRequest.setMethod(httpRequest.getMethod());
3838
final @NotNull UrlUtils.UrlDetails urlDetails =
39-
UrlUtils.parse(httpRequest.getRequestURL().toString());
39+
UrlUtils.parse(httpRequest.getRequestURL().toString(), options.getDataCollectionResolver());
4040
urlDetails.applyToRequest(sentryRequest);
41-
sentryRequest.setQueryString(httpRequest.getQueryString());
41+
sentryRequest.setQueryString(
42+
UrlUtils.filterQueryParams(
43+
httpRequest.getQueryString(), options.getDataCollectionResolver()));
4244
sentryRequest.setHeaders(resolveHeadersMap(httpRequest));
4345

4446
event.setRequest(sentryRequest);

0 commit comments

Comments
 (0)