Skip to content

Commit 496bdfd

Browse files
authored
Align http.status to span data convention (#2786)
* added SpanDataConvention interface to hold all strings aligned with span data convention * added `http.response.status_code` to http request spans
1 parent 98fb9c7 commit 496bdfd

File tree

30 files changed

+171
-47
lines changed

30 files changed

+171
-47
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ val apolloClient = ApolloClient.Builder()
2323
- [changelog](https://github.com/getsentry/sentry-native/blob/master/CHANGELOG.md#063)
2424
- [diff](https://github.com/getsentry/sentry-native/compare/0.6.2...0.6.3)
2525

26+
### Fixes
27+
28+
- Align http.status with [span data conventions](https://develop.sentry.dev/sdk/performance/span-data-conventions/) ([#2786](https://github.com/getsentry/sentry-java/pull/2786))
29+
2630
## 6.22.0
2731

2832
### Features

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.sentry.Breadcrumb
44
import io.sentry.Hint
55
import io.sentry.IHub
66
import io.sentry.ISpan
7+
import io.sentry.SpanDataConvention
78
import io.sentry.SpanStatus
89
import io.sentry.TypeCheckHint
910
import io.sentry.android.okhttp.SentryOkHttpEventListener.Companion.CONNECTION_EVENT
@@ -48,7 +49,7 @@ internal class SentryOkHttpEvent(private val hub: IHub, private val request: Req
4849
callRootSpan?.setData("url", url)
4950
callRootSpan?.setData("host", host)
5051
callRootSpan?.setData("path", encodedPath)
51-
callRootSpan?.setData("http.method", method)
52+
callRootSpan?.setData(SpanDataConvention.HTTP_METHOD_KEY, method)
5253
}
5354

5455
/**
@@ -60,7 +61,7 @@ internal class SentryOkHttpEvent(private val hub: IHub, private val request: Req
6061
breadcrumb.setData(PROTOCOL_KEY, response.protocol.name)
6162
breadcrumb.setData("status_code", response.code)
6263
callRootSpan?.setData(PROTOCOL_KEY, response.protocol.name)
63-
callRootSpan?.setData("http.status_code", response.code)
64+
callRootSpan?.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, response.code)
6465
callRootSpan?.status = SpanStatus.fromHttpStatusCode(response.code)
6566
}
6667

@@ -81,7 +82,7 @@ internal class SentryOkHttpEvent(private val hub: IHub, private val request: Req
8182
fun setResponseBodySize(byteCount: Long) {
8283
if (byteCount > -1) {
8384
breadcrumb.setData("response_content_length", byteCount)
84-
callRootSpan?.setData("http.response_content_length", byteCount)
85+
callRootSpan?.setData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY, byteCount)
8586
}
8687
}
8788

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.sentry.android.okhttp
22

33
import io.sentry.HubAdapter
44
import io.sentry.IHub
5+
import io.sentry.SpanDataConvention
56
import io.sentry.SpanStatus
67
import okhttp3.Call
78
import okhttp3.Connection
@@ -311,7 +312,7 @@ class SentryOkHttpEventListener(
311312
val okHttpEvent: SentryOkHttpEvent = eventMap[call] ?: return
312313
okHttpEvent.setResponse(response)
313314
okHttpEvent.finishSpan(RESPONSE_HEADERS_EVENT) {
314-
it.setData("status_code", response.code)
315+
it.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, response.code)
315316
it.status = SpanStatus.fromHttpStatusCode(response.code)
316317
}
317318
}
@@ -334,7 +335,7 @@ class SentryOkHttpEventListener(
334335
okHttpEvent.setResponseBodySize(byteCount)
335336
okHttpEvent.finishSpan(RESPONSE_BODY_EVENT) {
336337
if (byteCount > 0) {
337-
it.setData("http.response_content_length", byteCount)
338+
it.setData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY, byteCount)
338339
}
339340
}
340341
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.sentry.IntegrationName
1111
import io.sentry.SentryEvent
1212
import io.sentry.SentryIntegrationPackageStorage
1313
import io.sentry.SentryOptions.DEFAULT_PROPAGATION_TARGETS
14+
import io.sentry.SpanDataConvention
1415
import io.sentry.SpanStatus
1516
import io.sentry.TypeCheckHint.OKHTTP_REQUEST
1617
import io.sentry.TypeCheckHint.OKHTTP_RESPONSE
@@ -101,6 +102,7 @@ class SentryOkHttpInterceptor(
101102
request = requestBuilder.build()
102103
response = chain.proceed(request)
103104
code = response.code
105+
span?.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, code)
104106
span?.status = SpanStatus.fromHttpStatusCode(code)
105107

106108
// OkHttp errors (4xx, 5xx) don't throw, so it's safe to call within this block.
@@ -134,7 +136,7 @@ class SentryOkHttpInterceptor(
134136
val hint = Hint().also { it.set(OKHTTP_REQUEST, request) }
135137
response?.let {
136138
it.body?.contentLength().ifHasValidLength { responseBodySize ->
137-
breadcrumb.setData("http.response_content_length", responseBodySize)
139+
breadcrumb.setData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY, responseBodySize)
138140
}
139141

140142
hint[OKHTTP_RESPONSE] = it

sentry-android-okhttp/src/test/java/io/sentry/android/okhttp/SentryOkHttpEventListenerTest.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.sentry.IHub
55
import io.sentry.SentryOptions
66
import io.sentry.SentryTraceHeader
77
import io.sentry.SentryTracer
8+
import io.sentry.SpanDataConvention
89
import io.sentry.SpanStatus
910
import io.sentry.TransactionContext
1011
import okhttp3.Call
@@ -158,7 +159,7 @@ class SentryOkHttpEventListenerTest {
158159
assertNotNull(span.data["proxies"])
159160
assertNotNull(span.data["domain_name"])
160161
assertNotNull(span.data["dns_addresses"])
161-
assertEquals(201, span.data["status_code"])
162+
assertEquals(201, span.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
162163
}
163164
1 -> {
164165
assertEquals("http.client.proxy_select", span.operation)
@@ -180,7 +181,7 @@ class SentryOkHttpEventListenerTest {
180181
}
181182
6 -> {
182183
assertEquals("http.client.response_headers", span.operation)
183-
assertEquals(201, span.data["status_code"])
184+
assertEquals(201, span.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
184185
}
185186
7 -> {
186187
assertEquals("http.client.response_body", span.operation)
@@ -223,8 +224,14 @@ class SentryOkHttpEventListenerTest {
223224
response.close()
224225
val requestBodySpan = fixture.sentryTracer.children.firstOrNull { it.operation == "http.client.response_body" }
225226
assertNotNull(requestBodySpan)
226-
assertEquals(responseBytes.size.toLong(), requestBodySpan.data["http.response_content_length"])
227-
assertEquals(responseBytes.size.toLong(), callSpan?.getData("http.response_content_length"))
227+
assertEquals(
228+
responseBytes.size.toLong(),
229+
requestBodySpan.data[SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY]
230+
)
231+
assertEquals(
232+
responseBytes.size.toLong(),
233+
callSpan?.getData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY)
234+
)
228235
}
229236

230237
@Test

sentry-android-okhttp/src/test/java/io/sentry/android/okhttp/SentryOkHttpEventTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import io.sentry.ISpan
66
import io.sentry.SentryOptions
77
import io.sentry.SentryTracer
88
import io.sentry.Span
9+
import io.sentry.SpanDataConvention
910
import io.sentry.SpanOptions
1011
import io.sentry.TracesSamplingDecision
1112
import io.sentry.TransactionContext
@@ -106,7 +107,7 @@ class SentryOkHttpEventTest {
106107
assertEquals(fixture.mockRequest.url.toString(), callSpan.getData("url"))
107108
assertEquals(fixture.mockRequest.url.host, callSpan.getData("host"))
108109
assertEquals(fixture.mockRequest.url.encodedPath, callSpan.getData("path"))
109-
assertEquals(fixture.mockRequest.method, callSpan.getData("http.method"))
110+
assertEquals(fixture.mockRequest.method, callSpan.getData(SpanDataConvention.HTTP_METHOD_KEY))
110111
}
111112

112113
@Test
@@ -247,7 +248,7 @@ class SentryOkHttpEventTest {
247248
sut.setResponse(fixture.response)
248249

249250
assertEquals(fixture.response.protocol.name, sut.callRootSpan?.getData("protocol"))
250-
assertEquals(fixture.response.code, sut.callRootSpan?.getData("http.status_code"))
251+
assertEquals(fixture.response.code, sut.callRootSpan?.getData(SpanDataConvention.HTTP_STATUS_CODE_KEY))
251252
sut.finishEvent()
252253

253254
verify(fixture.hub).addBreadcrumb(
@@ -321,7 +322,7 @@ class SentryOkHttpEventTest {
321322
fun `setResponseBodySize set ResponseBodySize in the breadcrumb and in the root span`() {
322323
val sut = fixture.getSut()
323324
sut.setResponseBodySize(10)
324-
assertEquals(10L, sut.callRootSpan?.getData("http.response_content_length"))
325+
assertEquals(10L, sut.callRootSpan?.getData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY))
325326
sut.finishEvent()
326327
verify(fixture.hub).addBreadcrumb(
327328
check<Breadcrumb> {
@@ -335,7 +336,7 @@ class SentryOkHttpEventTest {
335336
fun `setResponseBodySize is ignored if ResponseBodySize is negative`() {
336337
val sut = fixture.getSut()
337338
sut.setResponseBodySize(-1)
338-
assertNull(sut.callRootSpan?.getData("http.response_content_length"))
339+
assertNull(sut.callRootSpan?.getData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY))
339340
sut.finishEvent()
340341
verify(fixture.hub).addBreadcrumb(
341342
check<Breadcrumb> {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import io.sentry.IHub
1010
import io.sentry.SentryOptions
1111
import io.sentry.SentryTraceHeader
1212
import io.sentry.SentryTracer
13+
import io.sentry.SpanDataConvention
1314
import io.sentry.SpanStatus
1415
import io.sentry.TransactionContext
1516
import io.sentry.TypeCheckHint
@@ -226,6 +227,7 @@ class SentryOkHttpInterceptorTest {
226227
val httpClientSpan = fixture.sentryTracer.children.first()
227228
assertEquals("http.client", httpClientSpan.operation)
228229
assertEquals("GET ${request.url}", httpClientSpan.description)
230+
assertEquals(201, httpClientSpan.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
229231
assertEquals(SpanStatus.OK, httpClientSpan.status)
230232
assertTrue(httpClientSpan.isFinished)
231233
}
@@ -235,6 +237,7 @@ class SentryOkHttpInterceptorTest {
235237
val sut = fixture.getSut(httpStatusCode = 400)
236238
sut.newCall(getRequest()).execute()
237239
val httpClientSpan = fixture.sentryTracer.children.first()
240+
assertEquals(400, httpClientSpan.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
238241
assertEquals(SpanStatus.INVALID_ARGUMENT, httpClientSpan.status)
239242
}
240243

@@ -243,6 +246,7 @@ class SentryOkHttpInterceptorTest {
243246
val sut = fixture.getSut(httpStatusCode = 502)
244247
sut.newCall(getRequest()).execute()
245248
val httpClientSpan = fixture.sentryTracer.children.first()
249+
assertEquals(502, httpClientSpan.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
246250
assertNull(httpClientSpan.status)
247251
}
248252

@@ -253,7 +257,7 @@ class SentryOkHttpInterceptorTest {
253257
verify(fixture.hub).addBreadcrumb(
254258
check<Breadcrumb> {
255259
assertEquals("http", it.type)
256-
assertEquals(13L, it.data["http.response_content_length"])
260+
assertEquals(13L, it.data[SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY])
257261
assertEquals(12L, it.data["http.request_content_length"])
258262
},
259263
anyOrNull()
@@ -296,6 +300,7 @@ class SentryOkHttpInterceptorTest {
296300
// ignore
297301
}
298302
val httpClientSpan = fixture.sentryTracer.children.first()
303+
assertNull(httpClientSpan.data[SpanDataConvention.HTTP_STATUS_CODE_KEY])
299304
assertEquals(SpanStatus.INTERNAL_ERROR, httpClientSpan.status)
300305
assertTrue(httpClientSpan.throwable is IOException)
301306
}

sentry-android-sqlite/src/main/java/io/sentry/android/sqlite/SQLiteSpanManager.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.sentry.HubAdapter
55
import io.sentry.IHub
66
import io.sentry.SentryIntegrationPackageStorage
77
import io.sentry.SentryStackTraceFactory
8+
import io.sentry.SpanDataConvention
89
import io.sentry.SpanStatus
910

1011
internal class SQLiteSpanManager(
@@ -38,9 +39,9 @@ internal class SQLiteSpanManager(
3839
} finally {
3940
span?.apply {
4041
val isMainThread: Boolean = hub.options.mainThreadChecker.isMainThread
41-
setData("blocked_main_thread", isMainThread)
42+
setData(SpanDataConvention.BLOCKED_MAIN_THREAD_KEY, isMainThread)
4243
if (isMainThread) {
43-
setData("call_stack", stackTraceFactory.inAppCallStack)
44+
setData(SpanDataConvention.CALL_STACK_KEY, stackTraceFactory.inAppCallStack)
4445
}
4546
finish()
4647
}

sentry-android-sqlite/src/test/java/io/sentry/android/sqlite/SQLiteSpanManagerTest.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.sentry.IHub
55
import io.sentry.SentryIntegrationPackageStorage
66
import io.sentry.SentryOptions
77
import io.sentry.SentryTracer
8+
import io.sentry.SpanDataConvention
89
import io.sentry.SpanStatus
910
import io.sentry.TransactionContext
1011
import io.sentry.util.thread.IMainThreadChecker
@@ -100,8 +101,8 @@ class SQLiteSpanManagerTest {
100101
sut.performSql("sql") {}
101102
val span = fixture.sentryTracer.children.first()
102103

103-
assertFalse(span.getData("blocked_main_thread") as Boolean)
104-
assertNull(span.getData("call_stack"))
104+
assertFalse(span.getData(SpanDataConvention.BLOCKED_MAIN_THREAD_KEY) as Boolean)
105+
assertNull(span.getData(SpanDataConvention.CALL_STACK_KEY))
105106
}
106107

107108
@Test
@@ -114,7 +115,7 @@ class SQLiteSpanManagerTest {
114115
sut.performSql("sql") {}
115116
val span = fixture.sentryTracer.children.first()
116117

117-
assertTrue(span.getData("blocked_main_thread") as Boolean)
118-
assertNotNull(span.getData("call_stack"))
118+
assertTrue(span.getData(SpanDataConvention.BLOCKED_MAIN_THREAD_KEY) as Boolean)
119+
assertNotNull(span.getData(SpanDataConvention.CALL_STACK_KEY))
119120
}
120121
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import io.sentry.SentryEvent
1919
import io.sentry.SentryIntegrationPackageStorage
2020
import io.sentry.SentryLevel
2121
import io.sentry.SentryOptions.DEFAULT_PROPAGATION_TARGETS
22+
import io.sentry.SpanDataConvention
2223
import io.sentry.SpanStatus
2324
import io.sentry.TypeCheckHint.APOLLO_REQUEST
2425
import io.sentry.TypeCheckHint.APOLLO_RESPONSE
@@ -107,6 +108,7 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(
107108
try {
108109
httpResponse = chain.proceed(modifiedRequest)
109110
statusCode = httpResponse.statusCode
111+
span?.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, statusCode)
110112
span?.status = SpanStatus.fromHttpStatusCode(statusCode)
111113

112114
captureEvent(modifiedRequest, httpResponse, operationName, operationType)
@@ -117,6 +119,7 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(
117119
when (e) {
118120
is ApolloHttpException -> {
119121
statusCode = e.statusCode
122+
span?.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, statusCode)
120123
span?.status =
121124
SpanStatus.fromHttpStatusCode(statusCode, SpanStatus.INTERNAL_ERROR)
122125
}
@@ -209,10 +212,10 @@ class SentryApollo3HttpInterceptor @JvmOverloads constructor(
209212

210213
if (span != null) {
211214
statusCode?.let {
212-
span.setData("http.response.status_code", statusCode)
215+
span.setData(SpanDataConvention.HTTP_STATUS_CODE_KEY, statusCode)
213216
}
214217
responseContentLength?.let {
215-
span.setData("http.response_content_length", it)
218+
span.setData(SpanDataConvention.HTTP_RESPONSE_CONTENT_LENGTH_KEY, it)
216219
}
217220
if (beforeSpan != null) {
218221
try {

0 commit comments

Comments
 (0)