Skip to content

Commit 3f6f636

Browse files
adinauerdependabot[bot]getsentry-bot
authored
Send http.request.method in span data (#2896)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sentry Github Bot <[email protected]>
1 parent 0f34a0c commit 3f6f636

File tree

13 files changed

+37
-7
lines changed

13 files changed

+37
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Features
66

77
- Send `db.system` and `db.name` in span data ([#2894](https://github.com/getsentry/sentry-java/pull/2894))
8+
- Send `http.request.method` in span data ([#2896](https://github.com/getsentry/sentry-java/pull/2896))
89

910
## 6.28.0
1011

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.sentry.android.okhttp.SentryOkHttpEventListener.Companion.SECURE_CONNE
1717
import io.sentry.util.UrlUtils
1818
import okhttp3.Request
1919
import okhttp3.Response
20+
import java.util.Locale
2021
import java.util.concurrent.ConcurrentHashMap
2122

2223
private const val PROTOCOL_KEY = "protocol"
@@ -50,7 +51,7 @@ internal class SentryOkHttpEvent(private val hub: IHub, private val request: Req
5051
callRootSpan?.setData("url", url)
5152
callRootSpan?.setData("host", host)
5253
callRootSpan?.setData("path", encodedPath)
53-
callRootSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method)
54+
callRootSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT))
5455
}
5556

5657
/**

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.sentry.SentryIntegrationPackageStorage
2020
import io.sentry.SentryLevel
2121
import io.sentry.SentryOptions.DEFAULT_PROPAGATION_TARGETS
2222
import io.sentry.SpanDataConvention
23+
import io.sentry.SpanDataConvention.HTTP_METHOD_KEY
2324
import io.sentry.SpanStatus
2425
import io.sentry.TypeCheckHint.APOLLO_REQUEST
2526
import io.sentry.TypeCheckHint.APOLLO_RESPONSE
@@ -34,6 +35,7 @@ import io.sentry.util.UrlUtils
3435
import io.sentry.vendor.Base64
3536
import okio.Buffer
3637
import org.jetbrains.annotations.ApiStatus
38+
import java.util.Locale
3739

3840
private const val TRACE_ORIGIN = "auto.graphql.apollo3"
3941

@@ -171,7 +173,7 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(
171173
variables?.let {
172174
setData("variables", it)
173175
}
174-
setData("http.method", method)
176+
setData(HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT))
175177
}
176178
}
177179

sentry-apollo-3/src/test/java/io/sentry/apollo3/SentryApollo3InterceptorTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import io.sentry.SentryOptions.DEFAULT_PROPAGATION_TARGETS
1818
import io.sentry.SentryTraceHeader
1919
import io.sentry.SentryTracer
2020
import io.sentry.SpanDataConvention
21+
import io.sentry.SpanDataConvention.HTTP_METHOD_KEY
2122
import io.sentry.SpanStatus
2223
import io.sentry.TraceContext
2324
import io.sentry.TracesSamplingDecision
@@ -154,6 +155,7 @@ class SentryApollo3InterceptorTest {
154155
verify(fixture.hub).captureTransaction(
155156
check {
156157
assertTransactionDetails(it, httpStatusCode = 404, contentLength = null)
158+
assertEquals("POST", it.spans.first().data?.get(SpanDataConvention.HTTP_METHOD_KEY))
157159
assertEquals(404, it.spans.first().data?.get(SpanDataConvention.HTTP_STATUS_CODE_KEY))
158160
assertEquals(SpanStatus.NOT_FOUND, it.spans.first().status)
159161
},
@@ -314,7 +316,7 @@ class SentryApollo3InterceptorTest {
314316
assertTrue { httpClientSpan.description?.startsWith("Post LaunchDetails") == true }
315317
assertNotNull(httpClientSpan.data) {
316318
assertNotNull(it["operationId"])
317-
assertEquals("Post", it["http.method"])
319+
assertEquals("POST", it[HTTP_METHOD_KEY])
318320
httpStatusCode?.let { code ->
319321
assertEquals(code, it[SpanDataConvention.HTTP_STATUS_CODE_KEY])
320322
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import io.sentry.SpanStatus
2626
import io.sentry.TypeCheckHint.APOLLO_REQUEST
2727
import io.sentry.TypeCheckHint.APOLLO_RESPONSE
2828
import io.sentry.util.TracingUtils
29+
import java.util.Locale
2930
import java.util.concurrent.Executor
3031

3132
private const val TRACE_ORIGIN = "auto.graphql.apollo"
@@ -72,6 +73,12 @@ class SentryApolloInterceptor(
7273
} else {
7374
span.status = SpanStatus.UNKNOWN
7475
}
76+
response.httpResponse.map { it.request().method() }.orNull()?.let {
77+
span.setData(
78+
SpanDataConvention.HTTP_METHOD_KEY,
79+
it.toUpperCase(Locale.ROOT)
80+
)
81+
}
7582

7683
finish(span, requestWithHeader, response)
7784
callBack.onResponse(response)

sentry-apollo/src/test/java/io/sentry/apollo/SentryApolloInterceptorTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class SentryApolloInterceptorTest {
100100
check {
101101
assertTransactionDetails(it)
102102
assertEquals(SpanStatus.OK, it.spans.first().status)
103+
assertEquals("POST", it.spans.first().data?.get(SpanDataConvention.HTTP_METHOD_KEY))
103104
},
104105
anyOrNull<TraceContext>(),
105106
anyOrNull(),
@@ -116,6 +117,8 @@ class SentryApolloInterceptorTest {
116117
assertTransactionDetails(it)
117118
assertEquals(SpanStatus.PERMISSION_DENIED, it.spans.first().status)
118119
assertEquals(403, it.spans.first().data?.get(SpanDataConvention.HTTP_STATUS_CODE_KEY))
120+
// we do not have access to the request and method in case of an error
121+
assertNull(it.spans.first().data?.get(SpanDataConvention.HTTP_METHOD_KEY))
119122
},
120123
anyOrNull<TraceContext>(),
121124
anyOrNull(),

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collection;
2222
import java.util.Collections;
2323
import java.util.LinkedHashMap;
24+
import java.util.Locale;
2425
import java.util.Map;
2526
import org.jetbrains.annotations.NotNull;
2627
import org.jetbrains.annotations.Nullable;
@@ -56,7 +57,9 @@ public Response execute(final @NotNull Request request, final @NotNull Request.O
5657
ISpan span = activeSpan.startChild("http.client");
5758
span.getSpanContext().setOrigin(TRACE_ORIGIN);
5859
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.url());
59-
span.setDescription(request.httpMethod().name() + " " + urlDetails.getUrlOrFallback());
60+
final @NotNull String method = request.httpMethod().name();
61+
span.setDescription(method + " " + urlDetails.getUrlOrFallback());
62+
span.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT));
6063
urlDetails.applyToSpan(span);
6164

6265
final @NotNull Request modifiedRequest = maybeAddTracingHeaders(request, span);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ class SentryFeignClientTest {
167167
assertEquals("http.client", httpClientSpan.operation)
168168
assertEquals("GET ${fixture.server.url("/status/200")}", httpClientSpan.description)
169169
assertEquals(201, httpClientSpan.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
170+
assertEquals("GET", httpClientSpan.data[SpanDataConvention.HTTP_METHOD_KEY])
170171
assertEquals(SpanStatus.OK, httpClientSpan.status)
171172
assertEquals("auto.http.openfeign", httpClientSpan.spanContext.origin)
172173
assertTrue(httpClientSpan.isFinished)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.sentry.util.TracingUtils;
1717
import io.sentry.util.UrlUtils;
1818
import java.io.IOException;
19+
import java.util.Locale;
1920
import org.jetbrains.annotations.NotNull;
2021
import org.jetbrains.annotations.Nullable;
2122
import org.springframework.http.HttpRequest;
@@ -53,6 +54,7 @@ public SentrySpanClientHttpRequestInterceptor(final @NotNull IHub hub) {
5354
request.getMethod() != null ? request.getMethod().name() : "unknown";
5455
final @NotNull UrlUtils.UrlDetails urlDetails = UrlUtils.parse(request.getURI().toString());
5556
span.setDescription(methodName + " " + urlDetails.getUrlOrFallback());
57+
span.setData(SpanDataConvention.HTTP_METHOD_KEY, methodName.toUpperCase(Locale.ROOT));
5658
urlDetails.applyToSpan(span);
5759

5860
maybeAddTracingHeaders(request, span);

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.sentry.SpanStatus;
1414
import io.sentry.util.Objects;
1515
import io.sentry.util.TracingUtils;
16+
import java.util.Locale;
1617
import org.jetbrains.annotations.NotNull;
1718
import org.jetbrains.annotations.Nullable;
1819
import org.springframework.web.reactive.function.client.ClientRequest;
@@ -42,7 +43,9 @@ public SentrySpanClientWebRequestFilter(final @NotNull IHub hub) {
4243

4344
final ISpan span = activeSpan.startChild("http.client");
4445
span.getSpanContext().setOrigin(TRACE_ORIGIN);
45-
span.setDescription(request.method().name() + " " + request.url());
46+
final @NotNull String method = request.method().name();
47+
span.setDescription(method + " " + request.url());
48+
span.setData(SpanDataConvention.HTTP_METHOD_KEY, method.toUpperCase(Locale.ROOT));
4649

4750
final @NotNull ClientRequest modifiedRequest = maybeAddTracingHeaders(request, span);
4851

0 commit comments

Comments
 (0)