From 84ff6998747339a7626293a96994be93e6aacaf2 Mon Sep 17 00:00:00 2001 From: Jamie Lynch Date: Tue, 12 Mar 2024 10:21:56 +0000 Subject: [PATCH] feat: create payload module --- .../injection/ModuleInitBootstrapper.kt | 14 +++++ .../embracesdk/injection/PayloadModule.kt | 54 +++++++++++++++++++ .../embracesdk/internal/utils/Types.kt | 11 ++++ .../fakes/FakeOpenTelemetryModule.kt | 6 +-- .../injection/ModuleInitBootstrapperTest.kt | 1 + .../injection/PayloadModuleImplTest.kt | 23 ++++++++ 6 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt create mode 100644 embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/PayloadModuleImplTest.kt diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt index a217a73fc..1d4e76daf 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt @@ -18,6 +18,7 @@ import io.embrace.android.embracesdk.internal.utils.DataSourceModuleSupplier import io.embrace.android.embracesdk.internal.utils.DeliveryModuleSupplier import io.embrace.android.embracesdk.internal.utils.EssentialServiceModuleSupplier import io.embrace.android.embracesdk.internal.utils.NativeModuleSupplier +import io.embrace.android.embracesdk.internal.utils.PayloadModuleSupplier import io.embrace.android.embracesdk.internal.utils.Provider import io.embrace.android.embracesdk.internal.utils.SdkObservabilityModuleSupplier import io.embrace.android.embracesdk.internal.utils.SessionModuleSupplier @@ -61,6 +62,7 @@ internal class ModuleInitBootstrapper( private val dataSourceModuleSupplier: DataSourceModuleSupplier = ::DataSourceModuleImpl, private val sessionModuleSupplier: SessionModuleSupplier = ::SessionModuleImpl, private val crashModuleSupplier: CrashModuleSupplier = ::CrashModuleImpl, + private val payloadModuleSupplier: PayloadModuleSupplier = ::PayloadModuleImpl, ) { lateinit var coreModule: CoreModule private set @@ -110,6 +112,9 @@ internal class ModuleInitBootstrapper( lateinit var crashModule: CrashModule private set + lateinit var payloadModule: PayloadModule + private set + private val asyncInitTask = AtomicReference?>(null) /** @@ -421,6 +426,15 @@ internal class ModuleInitBootstrapper( ) } + payloadModule = init(PayloadModule::class) { + payloadModuleSupplier( + essentialServiceModule, + nativeModule, + openTelemetryModule, + sdkObservabilityModule + ) + } + postInit(CrashModule::class) { Thread.setDefaultUncaughtExceptionHandler(crashModule.automaticVerificationExceptionHandler) serviceRegistry.registerService(crashModule.crashService) diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt new file mode 100644 index 000000000..53d98fe68 --- /dev/null +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt @@ -0,0 +1,54 @@ +package io.embrace.android.embracesdk.injection + +import io.embrace.android.embracesdk.capture.envelope.LogEnvelopeSource +import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource +import io.embrace.android.embracesdk.capture.envelope.log.LogSourceImpl +import io.embrace.android.embracesdk.capture.envelope.metadata.EnvelopeMetadataSourceImpl +import io.embrace.android.embracesdk.capture.envelope.resource.EnvelopeResourceSourceImpl +import io.embrace.android.embracesdk.capture.envelope.session.SessionPayloadSourceImpl +import io.embrace.android.embracesdk.ndk.NativeModule + +/** + * Modules containing classes that generate the payloads. + */ +internal interface PayloadModule { + val sessionEnvelopeSource: SessionEnvelopeSource + val logEnvelopeSource: LogEnvelopeSource +} + +internal class PayloadModuleImpl( + private val essentialServiceModule: EssentialServiceModule, + private val nativeModule: NativeModule, + private val otelModule: OpenTelemetryModule, + private val sdkObservabilityModule: SdkObservabilityModule +) : PayloadModule { + + private val metadataSource by singleton { + EnvelopeMetadataSourceImpl(essentialServiceModule.userService) + } + + private val resourceSource by singleton { + EnvelopeResourceSourceImpl() + } + + private val sessionPayloadSource by singleton { + SessionPayloadSourceImpl( + sdkObservabilityModule.internalErrorService, + nativeModule.nativeThreadSamplerService, + otelModule.spanSink, + otelModule.currentSessionSpan + ) + } + + private val logSource by singleton { + LogSourceImpl() + } + + override val sessionEnvelopeSource: SessionEnvelopeSource by singleton { + SessionEnvelopeSource(metadataSource, resourceSource, sessionPayloadSource) + } + + override val logEnvelopeSource: LogEnvelopeSource by singleton { + LogEnvelopeSource(metadataSource, resourceSource, logSource) + } +} diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/utils/Types.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/utils/Types.kt index cfb77d813..600c0eea4 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/utils/Types.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/utils/Types.kt @@ -15,6 +15,7 @@ import io.embrace.android.embracesdk.injection.DeliveryModule import io.embrace.android.embracesdk.injection.EssentialServiceModule import io.embrace.android.embracesdk.injection.InitModule import io.embrace.android.embracesdk.injection.OpenTelemetryModule +import io.embrace.android.embracesdk.injection.PayloadModule import io.embrace.android.embracesdk.injection.SdkObservabilityModule import io.embrace.android.embracesdk.injection.SessionModule import io.embrace.android.embracesdk.injection.StorageModule @@ -228,6 +229,16 @@ internal typealias CrashModuleSupplier = ( androidServicesModule: AndroidServicesModule ) -> CrashModule +/** + * Function that returns an instance of [PayloadModule]. Matches the signature of the constructor for [PayloadModuleImpl] + */ +internal typealias PayloadModuleSupplier = ( + essentialServiceModule: EssentialServiceModule, + nativeModule: NativeModule, + otelModule: OpenTelemetryModule, + sdkObservabilityModule: SdkObservabilityModule +) -> PayloadModule + /** * Function that returns an instance of T meant to represent a provider/supplier that does not require any input parameters */ diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt index d41d9e886..0f16632a0 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt @@ -9,19 +9,19 @@ import io.embrace.android.embracesdk.internal.spans.InternalTracer import io.embrace.android.embracesdk.internal.spans.SpanRepository import io.embrace.android.embracesdk.internal.spans.SpanService import io.embrace.android.embracesdk.internal.spans.SpanSink +import io.embrace.android.embracesdk.internal.spans.SpanSinkImpl import io.embrace.android.embracesdk.opentelemetry.OpenTelemetryConfiguration import io.opentelemetry.api.logs.Logger import io.opentelemetry.api.trace.Tracer internal class FakeOpenTelemetryModule( - override val currentSessionSpan: CurrentSessionSpan = FakeCurrentSessionSpan() + override val currentSessionSpan: CurrentSessionSpan = FakeCurrentSessionSpan(), + override val spanSink: SpanSink = SpanSinkImpl() ) : OpenTelemetryModule { override val openTelemetryConfiguration: OpenTelemetryConfiguration get() = TODO() override val spanRepository: SpanRepository get() = TODO() - override val spanSink: SpanSink - get() = TODO() override val tracer: Tracer get() = TODO() override val spanService: SpanService diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapperTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapperTest.kt index 1784f4ffd..3d6a58dbc 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapperTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapperTest.kt @@ -45,6 +45,7 @@ internal class ModuleInitBootstrapperTest { assertTrue(essentialServiceModule is EssentialServiceModuleImpl) assertTrue(dataCaptureServiceModule is DataCaptureServiceModuleImpl) assertTrue(deliveryModule is DeliveryModuleImpl) + assertTrue(payloadModule is PayloadModuleImpl) } } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/PayloadModuleImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/PayloadModuleImplTest.kt new file mode 100644 index 000000000..db24a11e1 --- /dev/null +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/PayloadModuleImplTest.kt @@ -0,0 +1,23 @@ +package io.embrace.android.embracesdk.injection + +import io.embrace.android.embracesdk.fakes.FakeOpenTelemetryModule +import io.embrace.android.embracesdk.fakes.injection.FakeEssentialServiceModule +import io.embrace.android.embracesdk.fakes.injection.FakeNativeModule +import io.embrace.android.embracesdk.fakes.injection.FakeSdkObservabilityModule +import org.junit.Assert.assertNotNull +import org.junit.Test + +internal class PayloadModuleImplTest { + + @Test + fun `module default values`() { + val module = PayloadModuleImpl( + FakeEssentialServiceModule(), + FakeNativeModule(), + FakeOpenTelemetryModule(), + FakeSdkObservabilityModule() + ) + assertNotNull(module.sessionEnvelopeSource) + assertNotNull(module.logEnvelopeSource) + } +}