Skip to content

Commit ee7a56b

Browse files
authored
Log startup trace synchronously (#1973)
## Goal Eat the costs of logging the startup trace on the main thread so it will always be in the payload of the same session the trace ended in. This will take around 1ms on a mid-range device (Pixel 4) and about 4ms on a low end device (Samsung A14)
2 parents b80427c + e89e019 commit ee7a56b

File tree

8 files changed

+7
-21
lines changed

8 files changed

+7
-21
lines changed

embrace-android-features/src/main/kotlin/io/embrace/android/embracesdk/internal/capture/startup/AppStartupTraceEmitter.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.embrace.android.embracesdk.internal.capture.startup
22

33
import android.os.Build.VERSION_CODES
44
import android.os.Process
5+
import io.embrace.android.embracesdk.internal.Systrace
56
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
67
import io.embrace.android.embracesdk.internal.logging.EmbLogger
78
import io.embrace.android.embracesdk.internal.logging.InternalErrorType
@@ -10,7 +11,6 @@ import io.embrace.android.embracesdk.internal.spans.PersistableEmbraceSpan
1011
import io.embrace.android.embracesdk.internal.spans.SpanService
1112
import io.embrace.android.embracesdk.internal.utils.Provider
1213
import io.embrace.android.embracesdk.internal.utils.VersionChecker
13-
import io.embrace.android.embracesdk.internal.worker.BackgroundWorker
1414
import io.embrace.android.embracesdk.spans.EmbraceSpan
1515
import io.embrace.android.embracesdk.spans.EmbraceSpanEvent
1616
import io.embrace.android.embracesdk.spans.ErrorCode
@@ -44,10 +44,9 @@ internal class AppStartupTraceEmitter(
4444
private val clock: Clock,
4545
private val startupServiceProvider: Provider<StartupService?>,
4646
private val spanService: SpanService,
47-
private val backgroundWorker: BackgroundWorker,
4847
private val versionChecker: VersionChecker,
4948
private val logger: EmbLogger,
50-
manualEnd: Boolean
49+
manualEnd: Boolean,
5150
) : AppStartupDataCollector {
5251
private val processCreateRequestedMs: Long?
5352
private val processCreatedMs: Long?
@@ -216,7 +215,7 @@ internal class AppStartupTraceEmitter(
216215
*/
217216
private fun dataCollectionComplete(traceEndTimeMs: Long) {
218217
if (!dataCollectionComplete.getAndSet(true)) {
219-
backgroundWorker.submit {
218+
Systrace.traceSynchronous("record-startup") {
220219
recordStartup(traceEndTimeMs)
221220
if (appStartupRootSpan.get()?.isRecording != false) {
222221
logger.trackInternalError(

embrace-android-features/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/DataCaptureServiceModuleImpl.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ import io.embrace.android.embracesdk.internal.session.lifecycle.ActivityLifecycl
2121
import io.embrace.android.embracesdk.internal.ui.FirstDrawDetector
2222
import io.embrace.android.embracesdk.internal.utils.BuildVersionChecker
2323
import io.embrace.android.embracesdk.internal.utils.VersionChecker
24-
import io.embrace.android.embracesdk.internal.worker.Worker
2524

2625
internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
2726
initModule: InitModule,
2827
openTelemetryModule: OpenTelemetryModule,
2928
configService: ConfigService,
30-
workerThreadModule: WorkerThreadModule,
3129
versionChecker: VersionChecker = BuildVersionChecker,
3230
featureModule: FeatureModule,
3331
) : DataCaptureServiceModule {
@@ -61,7 +59,6 @@ internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
6159
clock = openTelemetryModule.openTelemetryClock,
6260
startupServiceProvider = { startupService },
6361
spanService = openTelemetryModule.spanService,
64-
backgroundWorker = workerThreadModule.backgroundWorker(Worker.Background.NonIoRegWorker),
6562
versionChecker = versionChecker,
6663
logger = initModule.logger,
6764
manualEnd = configService.autoDataCaptureBehavior.isEndStartupWithAppReadyEnabled()

embrace-android-features/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/DataCaptureServiceModuleSupplier.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ typealias DataCaptureServiceModuleSupplier = (
1111
initModule: InitModule,
1212
openTelemetryModule: OpenTelemetryModule,
1313
configService: ConfigService,
14-
workerThreadModule: WorkerThreadModule,
1514
versionChecker: VersionChecker,
1615
featureModule: FeatureModule,
1716
) -> DataCaptureServiceModule
@@ -20,14 +19,12 @@ fun createDataCaptureServiceModule(
2019
initModule: InitModule,
2120
openTelemetryModule: OpenTelemetryModule,
2221
configService: ConfigService,
23-
workerThreadModule: WorkerThreadModule,
2422
versionChecker: VersionChecker,
2523
featureModule: FeatureModule,
2624
): DataCaptureServiceModule = DataCaptureServiceModuleImpl(
2725
initModule,
2826
openTelemetryModule,
2927
configService,
30-
workerThreadModule,
3128
versionChecker,
3229
featureModule
3330
)

embrace-android-features/src/test/java/io/embrace/android/embracesdk/internal/capture/startup/AppStartupTraceEmitterTest.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import io.embrace.android.embracesdk.arch.assertDoesNotHaveEmbraceAttribute
66
import io.embrace.android.embracesdk.fakes.FakeClock
77
import io.embrace.android.embracesdk.fakes.FakeClock.Companion.DEFAULT_FAKE_CURRENT_TIME
88
import io.embrace.android.embracesdk.fakes.FakeEmbLogger
9-
import io.embrace.android.embracesdk.fakes.fakeBackgroundWorker
109
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
1110
import io.embrace.android.embracesdk.internal.arch.schema.PrivateSpan
1211
import io.embrace.android.embracesdk.internal.capture.startup.AppStartupTraceEmitter.Companion.ACTIVITY_INIT_DELAY_SPAN
@@ -26,7 +25,6 @@ import io.embrace.android.embracesdk.internal.spans.SpanService
2625
import io.embrace.android.embracesdk.internal.spans.SpanSink
2726
import io.embrace.android.embracesdk.internal.spans.findAttributeValue
2827
import io.embrace.android.embracesdk.internal.utils.BuildVersionChecker
29-
import io.embrace.android.embracesdk.internal.worker.BackgroundWorker
3028
import io.opentelemetry.sdk.common.Clock
3129
import org.junit.Assert.assertEquals
3230
import org.junit.Assert.assertNull
@@ -53,12 +51,10 @@ internal class AppStartupTraceEmitterTest {
5351
private lateinit var spanSink: SpanSink
5452
private lateinit var spanService: SpanService
5553
private lateinit var logger: FakeEmbLogger
56-
private lateinit var backgroundWorker: BackgroundWorker
5754

5855
@Before
5956
fun setUp() {
6057
clock = FakeClock(processInitTime)
61-
backgroundWorker = fakeBackgroundWorker()
6258
FakeInitModule(clock = clock).run {
6359
otelClock = openTelemetryModule.openTelemetryClock
6460
spanSink = openTelemetryModule.spanSink
@@ -485,7 +481,6 @@ internal class AppStartupTraceEmitterTest {
485481
clock = otelClock,
486482
startupServiceProvider = { startupService },
487483
spanService = spanService,
488-
backgroundWorker = backgroundWorker,
489484
versionChecker = BuildVersionChecker,
490485
logger = logger,
491486
manualEnd = manualEnd,

embrace-android-features/src/test/java/io/embrace/android/embracesdk/internal/injection/DataCaptureServiceModuleImplTest.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import io.embrace.android.embracesdk.fakes.FakeFeatureModule
55
import io.embrace.android.embracesdk.fakes.FakeVersionChecker
66
import io.embrace.android.embracesdk.fakes.behavior.FakeAutoDataCaptureBehavior
77
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
8-
import io.embrace.android.embracesdk.fakes.injection.FakeWorkerThreadModule
98
import org.junit.Assert.assertNotNull
109
import org.junit.Assert.assertNull
1110
import org.junit.Test
@@ -21,7 +20,6 @@ internal class DataCaptureServiceModuleImplTest {
2120
initModule,
2221
openTelemetryModule,
2322
FakeConfigService(),
24-
FakeWorkerThreadModule(),
2523
FakeVersionChecker(false),
2624
FakeFeatureModule()
2725
)
@@ -43,7 +41,6 @@ internal class DataCaptureServiceModuleImplTest {
4341
FakeConfigService(
4442
autoDataCaptureBehavior = FakeAutoDataCaptureBehavior(uiLoadTracingEnabled = false)
4543
),
46-
FakeWorkerThreadModule(),
4744
FakeVersionChecker(false),
4845
FakeFeatureModule()
4946
)
@@ -60,7 +57,6 @@ internal class DataCaptureServiceModuleImplTest {
6057
FakeConfigService(
6158
autoDataCaptureBehavior = FakeAutoDataCaptureBehavior(uiLoadTracingTraceAll = false)
6259
),
63-
FakeWorkerThreadModule(),
6460
FakeVersionChecker(false),
6561
FakeFeatureModule()
6662
)

embrace-android-sdk/embrace-proguard.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,6 @@
4848
-keep class io.embrace.android.embracesdk.WebViewChromeClientSwazzledHooks { *; }
4949
-keep class io.embrace.android.embracesdk.fcm.swazzle.callback.com.android.fcm.FirebaseSwazzledHooks { *; }
5050
-keep class io.embrace.android.embracesdk.internal.config.instrumented.** { *; }
51+
52+
## Keep internal files for tracing
53+
-keep class io.embrace.android.embracesdk.internal.injection.** { *; }

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/injection/ModuleInitBootstrapper.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,6 @@ internal class ModuleInitBootstrapper(
254254
initModule,
255255
openTelemetryModule,
256256
configModule.configService,
257-
workerThreadModule,
258257
versionChecker,
259258
featureModule
260259
)

embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeModuleInitBootstrapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ internal fun fakeModuleInitBootstrapper(
4545
essentialServiceModuleSupplier: EssentialServiceModuleSupplier = { _, _, _, _, _, _, _, _, _, _ -> FakeEssentialServiceModule() },
4646
configModuleSupplier: ConfigModuleSupplier = { _, _, _, _, _, _ -> FakeConfigModule() },
4747
dataSourceModuleSupplier: DataSourceModuleSupplier = { _, _ -> FakeDataSourceModule() },
48-
dataCaptureServiceModuleSupplier: DataCaptureServiceModuleSupplier = { _, _, _, _, _, _ -> FakeDataCaptureServiceModule() },
48+
dataCaptureServiceModuleSupplier: DataCaptureServiceModuleSupplier = { _, _, _, _, _ -> FakeDataCaptureServiceModule() },
4949
deliveryModuleSupplier: DeliveryModuleSupplier = { _, _, _, _, _, _, _, _, _, _, _, _, _ -> FakeDeliveryModule() },
5050
anrModuleSupplier: AnrModuleSupplier = { _, _, _ -> FakeAnrModule() },
5151
logModuleSupplier: LogModuleSupplier = { _, _, _, _, _, _, _, _ -> FakeLogModule() },

0 commit comments

Comments
 (0)