Skip to content

Commit

Permalink
Merge pull request #558 from embrace-io/collator-module
Browse files Browse the repository at this point in the history
Add ability to create v2 collator from module
  • Loading branch information
fractalwrench committed Mar 14, 2024
2 parents e65cb6d + 4768398 commit 169a8bb
Show file tree
Hide file tree
Showing 10 changed files with 116 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,15 @@ internal class ModuleInitBootstrapper(
)
}

payloadModule = init(PayloadModule::class) {
payloadModuleSupplier(
essentialServiceModule,
nativeModule,
openTelemetryModule,
sdkObservabilityModule
)
}

sessionModule = init(SessionModule::class) {
sessionModuleSupplier(
initModule,
Expand All @@ -426,7 +435,8 @@ internal class ModuleInitBootstrapper(
customerLogModule,
sdkObservabilityModule,
workerThreadModule,
dataSourceModule
dataSourceModule,
payloadModule
)
}

Expand All @@ -444,15 +454,6 @@ internal class ModuleInitBootstrapper(
)
}

payloadModule = init(PayloadModule::class) {
payloadModuleSupplier(
essentialServiceModule,
nativeModule,
openTelemetryModule,
sdkObservabilityModule
)
}

postInit(CrashModule::class) {
Thread.setDefaultUncaughtExceptionHandler(crashModule.automaticVerificationExceptionHandler)
serviceRegistry.registerService(crashModule.crashService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import io.embrace.android.embracesdk.session.caching.PeriodicBackgroundActivityC
import io.embrace.android.embracesdk.session.caching.PeriodicSessionCacher
import io.embrace.android.embracesdk.session.message.PayloadFactory
import io.embrace.android.embracesdk.session.message.PayloadFactoryImpl
import io.embrace.android.embracesdk.session.message.PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V1PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V2PayloadMessageCollator
import io.embrace.android.embracesdk.session.orchestrator.OrchestratorBoundaryDelegate
import io.embrace.android.embracesdk.session.orchestrator.SessionOrchestrator
import io.embrace.android.embracesdk.session.orchestrator.SessionOrchestratorImpl
Expand All @@ -19,7 +19,8 @@ import io.embrace.android.embracesdk.worker.WorkerThreadModule

internal interface SessionModule {
val payloadFactory: PayloadFactory
val payloadMessageCollator: PayloadMessageCollator
val v1PayloadMessageCollator: V1PayloadMessageCollator
val v2PayloadMessageCollator: V2PayloadMessageCollator
val sessionPropertiesService: SessionPropertiesService
val sessionOrchestrator: SessionOrchestrator
val periodicSessionCacher: PeriodicSessionCacher
Expand All @@ -40,10 +41,11 @@ internal class SessionModuleImpl(
customerLogModule: CustomerLogModule,
sdkObservabilityModule: SdkObservabilityModule,
workerThreadModule: WorkerThreadModule,
dataSourceModule: DataSourceModule
dataSourceModule: DataSourceModule,
payloadModule: PayloadModule
) : SessionModule {

override val payloadMessageCollator: PayloadMessageCollator by singleton {
override val v1PayloadMessageCollator: V1PayloadMessageCollator by singleton {
V1PayloadMessageCollator(
essentialServiceModule.configService,
essentialServiceModule.metadataService,
Expand All @@ -64,6 +66,13 @@ internal class SessionModuleImpl(
)
}

override val v2PayloadMessageCollator: V2PayloadMessageCollator by singleton {
V2PayloadMessageCollator(
v1PayloadMessageCollator,
payloadModule.sessionEnvelopeSource
)
}

override val sessionPropertiesService: SessionPropertiesService by singleton {
EmbraceSessionPropertiesService(
nativeModule.ndkService,
Expand All @@ -90,7 +99,11 @@ internal class SessionModuleImpl(
}

override val payloadFactory: PayloadFactory by singleton {
PayloadFactoryImpl(payloadMessageCollator, essentialServiceModule.configService)
PayloadFactoryImpl(
v1PayloadMessageCollator,
v2PayloadMessageCollator,
essentialServiceModule.configService
)
}

private val boundaryDelegate by singleton {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,8 @@ internal typealias SessionModuleSupplier = (
customerLogModule: CustomerLogModule,
sdkObservabilityModule: SdkObservabilityModule,
workerThreadModule: WorkerThreadModule,
dataSourceModule: DataSourceModule
dataSourceModule: DataSourceModule,
payloadModule: PayloadModule
) -> SessionModule

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import io.embrace.android.embracesdk.session.lifecycle.ProcessState
import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType

internal class PayloadFactoryImpl(
private val payloadMessageCollator: PayloadMessageCollator,
private val v1payloadMessageCollator: V1PayloadMessageCollator,
@Suppress("UnusedPrivateProperty") private val v2payloadMessageCollator: V2PayloadMessageCollator,
private val configService: ConfigService
) : PayloadFactory {

Expand Down Expand Up @@ -41,7 +42,7 @@ internal class PayloadFactoryImpl(
}

override fun startSessionWithManual(timestamp: Long): Session {
return payloadMessageCollator.buildInitialSession(
return v1payloadMessageCollator.buildInitialSession(
InitialEnvelopeParams.SessionParams(
false,
LifeEventType.MANUAL,
Expand All @@ -51,7 +52,7 @@ internal class PayloadFactoryImpl(
}

override fun endSessionWithManual(timestamp: Long, initial: Session): SessionMessage {
return payloadMessageCollator.buildFinalSessionMessage(
return v1payloadMessageCollator.buildFinalSessionMessage(
FinalEnvelopeParams.SessionParams(
initial = initial,
endTime = timestamp,
Expand All @@ -62,7 +63,7 @@ internal class PayloadFactoryImpl(
}

private fun startSessionWithState(timestamp: Long, coldStart: Boolean): Session {
return payloadMessageCollator.buildInitialSession(
return v1payloadMessageCollator.buildInitialSession(
InitialEnvelopeParams.SessionParams(
coldStart,
LifeEventType.STATE,
Expand All @@ -82,7 +83,7 @@ internal class PayloadFactoryImpl(
coldStart -> timestamp
else -> timestamp + 1
}
return payloadMessageCollator.buildInitialSession(
return v1payloadMessageCollator.buildInitialSession(
InitialEnvelopeParams.BackgroundActivityParams(
coldStart = coldStart,
startType = LifeEventType.BKGND_STATE,
Expand All @@ -92,7 +93,7 @@ internal class PayloadFactoryImpl(
}

private fun endSessionWithState(initial: Session, timestamp: Long): SessionMessage {
return payloadMessageCollator.buildFinalSessionMessage(
return v1payloadMessageCollator.buildFinalSessionMessage(
FinalEnvelopeParams.SessionParams(
initial = initial,
endTime = timestamp,
Expand All @@ -109,7 +110,7 @@ internal class PayloadFactoryImpl(

// kept for backwards compat. the backend expects the start time to be 1 ms greater
// than the adjacent session, and manually adjusts.
return payloadMessageCollator.buildFinalBackgroundActivityMessage(
return v1payloadMessageCollator.buildFinalBackgroundActivityMessage(
FinalEnvelopeParams.BackgroundActivityParams(
initial = initial,
endTime = timestamp - 1,
Expand All @@ -124,7 +125,7 @@ internal class PayloadFactoryImpl(
timestamp: Long,
crashId: String
): SessionMessage {
return payloadMessageCollator.buildFinalSessionMessage(
return v1payloadMessageCollator.buildFinalSessionMessage(
FinalEnvelopeParams.SessionParams(
initial = initial,
endTime = timestamp,
Expand All @@ -143,7 +144,7 @@ internal class PayloadFactoryImpl(
if (!configService.isBackgroundActivityCaptureEnabled()) {
return null
}
return payloadMessageCollator.buildFinalBackgroundActivityMessage(
return v1payloadMessageCollator.buildFinalBackgroundActivityMessage(
FinalEnvelopeParams.BackgroundActivityParams(
initial = initial,
endTime = timestamp,
Expand All @@ -158,7 +159,7 @@ internal class PayloadFactoryImpl(
* Called when the session is persisted every 2s to cache its state.
*/
private fun snapshotSession(initial: Session, timestamp: Long): SessionMessage {
return payloadMessageCollator.buildFinalSessionMessage(
return v1payloadMessageCollator.buildFinalSessionMessage(
FinalEnvelopeParams.SessionParams(
initial = initial,
endTime = timestamp,
Expand All @@ -172,7 +173,7 @@ internal class PayloadFactoryImpl(
if (!configService.isBackgroundActivityCaptureEnabled()) {
return null
}
return payloadMessageCollator.buildFinalBackgroundActivityMessage(
return v1payloadMessageCollator.buildFinalBackgroundActivityMessage(
FinalEnvelopeParams.BackgroundActivityParams(
initial = initial,
endTime = timestamp,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.embrace.android.embracesdk.fakes

import io.embrace.android.embracesdk.capture.envelope.LogEnvelopeSource
import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource
import io.embrace.android.embracesdk.injection.PayloadModule

internal class FakePayloadModule : PayloadModule {

override val sessionEnvelopeSource: SessionEnvelopeSource = SessionEnvelopeSource(
FakeEnvelopeMetadataSource(),
FakeEnvelopeResourceSource(),
FakeSessionPayloadSource()
)

override val logEnvelopeSource: LogEnvelopeSource
get() = TODO("Not yet implemented")
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import io.embrace.android.embracesdk.injection.SessionModule
import io.embrace.android.embracesdk.session.caching.PeriodicBackgroundActivityCacher
import io.embrace.android.embracesdk.session.caching.PeriodicSessionCacher
import io.embrace.android.embracesdk.session.message.PayloadFactory
import io.embrace.android.embracesdk.session.message.PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V1PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V2PayloadMessageCollator
import io.embrace.android.embracesdk.session.orchestrator.SessionOrchestrator
import io.embrace.android.embracesdk.session.properties.SessionPropertiesService

Expand All @@ -18,7 +19,10 @@ internal class FakeSessionModule(
override val sessionOrchestrator: SessionOrchestrator = FakeSessionOrchestrator()
) : SessionModule {

override val payloadMessageCollator: PayloadMessageCollator
override val v1PayloadMessageCollator: V1PayloadMessageCollator
get() = TODO("Not yet implemented")

override val v2PayloadMessageCollator: V2PayloadMessageCollator
get() = TODO("Not yet implemented")

override val periodicSessionCacher: PeriodicSessionCacher
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import io.embrace.android.embracesdk.FakeBreadcrumbService
import io.embrace.android.embracesdk.FakeDeliveryService
import io.embrace.android.embracesdk.FakeNdkService
import io.embrace.android.embracesdk.FakeSessionPropertiesService
import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource
import io.embrace.android.embracesdk.capture.metadata.MetadataService
import io.embrace.android.embracesdk.capture.user.UserService
import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService
Expand All @@ -14,6 +15,8 @@ import io.embrace.android.embracesdk.event.LogMessageService
import io.embrace.android.embracesdk.fakeBackgroundActivity
import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeConfigService
import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource
import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource
import io.embrace.android.embracesdk.fakes.FakeEventService
import io.embrace.android.embracesdk.fakes.FakeInternalErrorService
import io.embrace.android.embracesdk.fakes.FakeLogMessageService
Expand All @@ -22,6 +25,7 @@ import io.embrace.android.embracesdk.fakes.FakePerformanceInfoService
import io.embrace.android.embracesdk.fakes.FakePreferenceService
import io.embrace.android.embracesdk.fakes.FakeProcessStateService
import io.embrace.android.embracesdk.fakes.FakeSessionIdTracker
import io.embrace.android.embracesdk.fakes.FakeSessionPayloadSource
import io.embrace.android.embracesdk.fakes.FakeStartupService
import io.embrace.android.embracesdk.fakes.FakeThermalStatusService
import io.embrace.android.embracesdk.fakes.FakeUserService
Expand All @@ -35,6 +39,7 @@ import io.embrace.android.embracesdk.logging.InternalErrorService
import io.embrace.android.embracesdk.session.lifecycle.ProcessState
import io.embrace.android.embracesdk.session.message.PayloadFactoryImpl
import io.embrace.android.embracesdk.session.message.V1PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V2PayloadMessageCollator
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
Expand Down Expand Up @@ -171,7 +176,13 @@ internal class PayloadFactoryBaTest {
FakeSessionPropertiesService(),
FakeStartupService()
)
return PayloadFactoryImpl(collator, configService).apply {
val sessionEnvelopeSource = SessionEnvelopeSource(
metadataSource = FakeEnvelopeMetadataSource(),
resourceSource = FakeEnvelopeResourceSource(),
sessionPayloadSource = FakeSessionPayloadSource()
)
val v2Collator = V2PayloadMessageCollator(collator, sessionEnvelopeSource)
return PayloadFactoryImpl(collator, v2Collator, configService).apply {
if (createInitialSession) {
startPayloadWithState(ProcessState.BACKGROUND, clock.now(), true)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package io.embrace.android.embracesdk.session

import io.embrace.android.embracesdk.FakeDeliveryService
import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource
import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeConfigService
import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource
import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource
import io.embrace.android.embracesdk.fakes.FakeProcessStateService
import io.embrace.android.embracesdk.fakes.FakeSessionPayloadSource
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
import io.embrace.android.embracesdk.internal.spans.SpanSink
import io.embrace.android.embracesdk.session.lifecycle.ProcessState
import io.embrace.android.embracesdk.session.message.PayloadFactory
import io.embrace.android.embracesdk.session.message.PayloadFactoryImpl
import io.embrace.android.embracesdk.session.message.V1PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V2PayloadMessageCollator
import io.mockk.clearAllMocks
import io.mockk.mockk
import io.mockk.mockkStatic
Expand Down Expand Up @@ -84,6 +90,14 @@ internal class PayloadFactorySessionTest {
isActivityInBackground: Boolean = true
) {
processStateService.isInBackground = isActivityInBackground
service = PayloadFactoryImpl(mockk(relaxed = true), FakeConfigService())

val sessionEnvelopeSource = SessionEnvelopeSource(
metadataSource = FakeEnvelopeMetadataSource(),
resourceSource = FakeEnvelopeResourceSource(),
sessionPayloadSource = FakeSessionPayloadSource()
)
val v1Collator = mockk<V1PayloadMessageCollator>(relaxed = true)
val v2Collator = V2PayloadMessageCollator(v1Collator, sessionEnvelopeSource)
service = PayloadFactoryImpl(v1Collator, v2Collator, FakeConfigService())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.embrace.android.embracesdk.FakeDeliveryService
import io.embrace.android.embracesdk.FakeNdkService
import io.embrace.android.embracesdk.FakeSessionPropertiesService
import io.embrace.android.embracesdk.capture.PerformanceInfoService
import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource
import io.embrace.android.embracesdk.capture.thermalstate.NoOpThermalStatusService
import io.embrace.android.embracesdk.capture.webview.WebViewService
import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService
Expand All @@ -16,6 +17,8 @@ import io.embrace.android.embracesdk.event.EventService
import io.embrace.android.embracesdk.event.LogMessageService
import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeConfigService
import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource
import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource
import io.embrace.android.embracesdk.fakes.FakeEventService
import io.embrace.android.embracesdk.fakes.FakeGatingService
import io.embrace.android.embracesdk.fakes.FakeLogMessageService
Expand All @@ -25,6 +28,7 @@ import io.embrace.android.embracesdk.fakes.FakePerformanceInfoService
import io.embrace.android.embracesdk.fakes.FakePreferenceService
import io.embrace.android.embracesdk.fakes.FakeProcessStateService
import io.embrace.android.embracesdk.fakes.FakeSessionIdTracker
import io.embrace.android.embracesdk.fakes.FakeSessionPayloadSource
import io.embrace.android.embracesdk.fakes.FakeStartupService
import io.embrace.android.embracesdk.fakes.FakeUserService
import io.embrace.android.embracesdk.fakes.FakeWebViewService
Expand All @@ -43,6 +47,7 @@ import io.embrace.android.embracesdk.session.lifecycle.ProcessState
import io.embrace.android.embracesdk.session.message.PayloadFactory
import io.embrace.android.embracesdk.session.message.PayloadFactoryImpl
import io.embrace.android.embracesdk.session.message.V1PayloadMessageCollator
import io.embrace.android.embracesdk.session.message.V2PayloadMessageCollator
import io.embrace.android.embracesdk.session.properties.EmbraceSessionProperties
import io.embrace.android.embracesdk.worker.ScheduledWorker
import io.mockk.clearAllMocks
Expand Down Expand Up @@ -153,7 +158,15 @@ internal class SessionHandlerTest {
FakeSessionPropertiesService(),
FakeStartupService()
)
payloadFactory = PayloadFactoryImpl(payloadMessageCollator, configService)
val v2Collator = V2PayloadMessageCollator(
payloadMessageCollator,
SessionEnvelopeSource(
metadataSource = FakeEnvelopeMetadataSource(),
resourceSource = FakeEnvelopeResourceSource(),
sessionPayloadSource = FakeSessionPayloadSource()
)
)
payloadFactory = PayloadFactoryImpl(payloadMessageCollator, v2Collator, configService)
}

@After
Expand Down

0 comments on commit 169a8bb

Please sign in to comment.