Skip to content

Commit 93a76ca

Browse files
authored
Tag all spans with main thread flag (#2998)
1 parent 1ab82a3 commit 93a76ca

File tree

6 files changed

+45
-0
lines changed

6 files changed

+45
-0
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Features
6+
7+
- Add thread information to spans ([#2998](https://github.com/getsentry/sentry-java/pull/2998))
8+
59
### Fixes
610

711
- Fix crash when HTTP connection error message contains formatting symbols ([#3002](https://github.com/getsentry/sentry-java/pull/3002))

sentry/api/sentry.api

+2
Original file line numberDiff line numberDiff line change
@@ -2397,6 +2397,8 @@ public abstract interface class io/sentry/SpanDataConvention {
23972397
public static final field HTTP_QUERY_KEY Ljava/lang/String;
23982398
public static final field HTTP_RESPONSE_CONTENT_LENGTH_KEY Ljava/lang/String;
23992399
public static final field HTTP_STATUS_CODE_KEY Ljava/lang/String;
2400+
public static final field THREAD_ID Ljava/lang/String;
2401+
public static final field THREAD_NAME Ljava/lang/String;
24002402
}
24012403

24022404
public final class io/sentry/SpanId : io/sentry/JsonSerializable {

sentry/src/main/java/io/sentry/SentryTracer.java

+6
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,12 @@ private ISpan createChild(
384384
}
385385
});
386386
span.setDescription(description);
387+
span.setData(SpanDataConvention.THREAD_ID, String.valueOf(Thread.currentThread().getId()));
388+
span.setData(
389+
SpanDataConvention.THREAD_NAME,
390+
hub.getOptions().getMainThreadChecker().isMainThread()
391+
? "main"
392+
: Thread.currentThread().getName());
387393
this.children.add(span);
388394
return span;
389395
}

sentry/src/main/java/io/sentry/SpanDataConvention.java

+2
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public interface SpanDataConvention {
1515
String HTTP_RESPONSE_CONTENT_LENGTH_KEY = "http.response_content_length";
1616
String BLOCKED_MAIN_THREAD_KEY = "blocked_main_thread";
1717
String CALL_STACK_KEY = "call_stack";
18+
String THREAD_ID = "thread.id";
19+
String THREAD_NAME = "thread.name";
1820
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.sentry.hints.Retryable
55
import io.sentry.protocol.SentryId
66
import io.sentry.protocol.SentryTransaction
77
import io.sentry.util.HintUtils
8+
import io.sentry.util.thread.NoOpMainThreadChecker
89
import org.mockito.kotlin.any
910
import org.mockito.kotlin.argWhere
1011
import org.mockito.kotlin.check
@@ -38,6 +39,7 @@ class OutboxSenderTest {
3839
init {
3940
whenever(options.dsn).thenReturn("https://[email protected]/proj")
4041
whenever(options.dateProvider).thenReturn(SentryNanotimeDateProvider())
42+
whenever(options.mainThreadChecker).thenReturn(NoOpMainThreadChecker.getInstance())
4143
whenever(hub.options).thenReturn(this.options)
4244
}
4345

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

+29
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.sentry
22

33
import io.sentry.protocol.TransactionNameSource
44
import io.sentry.protocol.User
5+
import io.sentry.util.thread.IMainThreadChecker
56
import org.awaitility.kotlin.await
67
import org.mockito.kotlin.any
78
import org.mockito.kotlin.anyOrNull
@@ -11,12 +12,14 @@ import org.mockito.kotlin.never
1112
import org.mockito.kotlin.spy
1213
import org.mockito.kotlin.times
1314
import org.mockito.kotlin.verify
15+
import org.mockito.kotlin.whenever
1416
import java.time.LocalDateTime
1517
import java.time.ZoneOffset
1618
import java.util.Date
1719
import kotlin.test.Test
1820
import kotlin.test.assertEquals
1921
import kotlin.test.assertFalse
22+
import kotlin.test.assertNotEquals
2023
import kotlin.test.assertNotNull
2124
import kotlin.test.assertNull
2225
import kotlin.test.assertSame
@@ -1236,4 +1239,30 @@ class SentryTracerTest {
12361239
assertTrue(tracer.isFinished)
12371240
verify(fixture.hub).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
12381241
}
1242+
1243+
@Test
1244+
fun `when a span is launched on the main thread, the thread info should be set correctly`() {
1245+
val mainThreadChecker = mock<IMainThreadChecker>()
1246+
whenever(mainThreadChecker.isMainThread).thenReturn(true)
1247+
1248+
val tracer = fixture.getSut(optionsConfiguration = { options ->
1249+
options.mainThreadChecker = mainThreadChecker
1250+
})
1251+
val span = tracer.startChild("span.op")
1252+
assertNotNull(span.getData(SpanDataConvention.THREAD_ID))
1253+
assertEquals("main", span.getData(SpanDataConvention.THREAD_NAME))
1254+
}
1255+
1256+
@Test
1257+
fun `when a span is launched on the background thread, the thread info should be set correctly`() {
1258+
val mainThreadChecker = mock<IMainThreadChecker>()
1259+
whenever(mainThreadChecker.isMainThread).thenReturn(false)
1260+
1261+
val tracer = fixture.getSut(optionsConfiguration = { options ->
1262+
options.mainThreadChecker = mainThreadChecker
1263+
})
1264+
val span = tracer.startChild("span.op")
1265+
assertNotNull(span.getData(SpanDataConvention.THREAD_ID))
1266+
assertNotEquals("main", span.getData(SpanDataConvention.THREAD_NAME))
1267+
}
12391268
}

0 commit comments

Comments
 (0)