Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extra OTel components into OTel module and delay SDK init until SDK starts up #380

Merged
merged 1 commit into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ import io.embrace.android.embracesdk.fakes.injection.FakeDeliveryModule
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
import io.embrace.android.embracesdk.injection.AndroidServicesModule
import io.embrace.android.embracesdk.injection.AndroidServicesModuleImpl
import io.embrace.android.embracesdk.injection.ModuleInitBootstrapper
import io.embrace.android.embracesdk.injection.CoreModule
import io.embrace.android.embracesdk.injection.DataCaptureServiceModule
import io.embrace.android.embracesdk.injection.DataCaptureServiceModuleImpl
import io.embrace.android.embracesdk.injection.DeliveryModule
import io.embrace.android.embracesdk.injection.EssentialServiceModule
import io.embrace.android.embracesdk.injection.EssentialServiceModuleImpl
import io.embrace.android.embracesdk.injection.InitModule
import io.embrace.android.embracesdk.injection.ModuleInitBootstrapper
import io.embrace.android.embracesdk.injection.OpenTelemetryModule
import io.embrace.android.embracesdk.injection.StorageModule
import io.embrace.android.embracesdk.injection.StorageModuleImpl
import io.embrace.android.embracesdk.injection.SystemServiceModule
Expand Down Expand Up @@ -100,13 +101,14 @@ internal class IntegrationTestRule(
val embraceImpl = EmbraceImpl(
ModuleInitBootstrapper(
initModule = initModule,
openTelemetryModule = initModule.openTelemetryModule,
coreModuleSupplier = { _, _ -> fakeCoreModule },
workerThreadModuleSupplier = { workerThreadModule },
systemServiceModuleSupplier = { _, _ -> systemServiceModule },
androidServicesModuleSupplier = { _, _, _ -> androidServicesModule },
storageModuleSupplier = { _, _, _ -> storageModule },
essentialServiceModuleSupplier = { _, _, _, _, _, _, _, _, _ -> essentialServiceModule },
dataCaptureServiceModuleSupplier = { _, _, _, _, _, _ -> dataCaptureServiceModule },
dataCaptureServiceModuleSupplier = { _, _, _, _, _, _, _ -> dataCaptureServiceModule },
deliveryModuleSupplier = { _, _, _, _ -> fakeDeliveryModule }
)
)
Expand All @@ -133,7 +135,8 @@ internal class IntegrationTestRule(
val fakeClock: FakeClock = FakeClock(currentTime = currentTimeMs),
val enableIntegrationTesting: Boolean = false,
val appFramework: Embrace.AppFramework = Embrace.AppFramework.NATIVE,
val initModule: InitModule = FakeInitModule(clock = fakeClock),
val initModule: FakeInitModule = FakeInitModule(clock = fakeClock),
val openTelemetryModule: OpenTelemetryModule = initModule.openTelemetryModule,
val fakeCoreModule: FakeCoreModule = FakeCoreModule(),
val workerThreadModule: WorkerThreadModule = WorkerThreadModuleImpl(initModule),
val fakeConfigService: FakeConfigService = FakeConfigService(
Expand Down Expand Up @@ -187,6 +190,7 @@ internal class IntegrationTestRule(
val dataCaptureServiceModule: DataCaptureServiceModule =
DataCaptureServiceModuleImpl(
initModule = initModule,
openTelemetryModule = initModule.openTelemetryModule,
coreModule = fakeCoreModule,
systemServiceModule = systemServiceModule,
essentialServiceModule = essentialServiceModule,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ internal class TracingApiTest {
val backgroundActivitySpansCount = getSdkInitSpanFromBackgroundActivity().size
assertTrue(
returnIfConditionMet(desiredValueSupplier = { true }, waitTimeMs = 1000) {
checkNotNull(harness.initModule.spansSink.completedSpans()).size == (5 - backgroundActivitySpansCount)
checkNotNull(harness.openTelemetryModule.spansSink.completedSpans()).size == (5 - backgroundActivitySpansCount)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import io.embrace.android.embracesdk.injection.EssentialServiceModule;
import io.embrace.android.embracesdk.injection.InitModule;
import io.embrace.android.embracesdk.injection.ModuleInitBootstrapper;
import io.embrace.android.embracesdk.injection.OpenTelemetryModule;
import io.embrace.android.embracesdk.injection.SdkObservabilityModule;
import io.embrace.android.embracesdk.injection.SdkObservabilityModuleImpl;
import io.embrace.android.embracesdk.injection.SessionModule;
Expand Down Expand Up @@ -106,7 +107,7 @@ final class EmbraceImpl {
final EmbraceTracer tracer;

@NonNull
final Lazy<EmbraceInternalInterface> uninitializedSdkInternalInterface;
private final Lazy<EmbraceInternalInterface> uninitializedSdkInternalInterface;

/**
* Whether the Embrace SDK has been started yet.
Expand Down Expand Up @@ -242,10 +243,10 @@ final class EmbraceImpl {
moduleInitBootstrapper = bs;
initModule = moduleInitBootstrapper.getInitModule();
sdkClock = initModule.getClock();
tracer = initModule.getEmbraceTracer();
tracer = moduleInitBootstrapper.getOpenTelemetryModule().getEmbraceTracer();
uninitializedSdkInternalInterface =
LazyKt.lazy(
() -> new UninitializedSdkInternalInterfaceImpl(initModule.getInternalTracer())
() -> new UninitializedSdkInternalInterfaceImpl(moduleInitBootstrapper.getOpenTelemetryModule().getInternalTracer())
);
}

Expand Down Expand Up @@ -299,14 +300,16 @@ private void startImpl(@NonNull Context context,

final CoreModule coreModule = moduleInitBootstrapper.getCoreModule();
serviceRegistry = coreModule.getServiceRegistry();
serviceRegistry.registerService(initModule.getSpansService());
application = coreModule.getApplication();
appFramework = coreModule.getAppFramework();

final OpenTelemetryModule openTelemetryModule = moduleInitBootstrapper.getOpenTelemetryModule();
serviceRegistry.registerService(openTelemetryModule.getSpansService());

workerThreadModule = moduleInitBootstrapper.getWorkerThreadModule();
final Future<?> spansInitTask =
workerThreadModule.backgroundWorker(WorkerName.BACKGROUND_REGISTRATION).submit(TaskPriority.CRITICAL, () -> {
initModule.getSpansService().initializeService(TimeUnit.MILLISECONDS.toNanos(startTime));
openTelemetryModule.getSpansService().initializeService(TimeUnit.MILLISECONDS.toNanos(startTime));
return null;
});

Expand Down Expand Up @@ -434,6 +437,7 @@ private void startImpl(@NonNull Context context,

final DataContainerModule dataContainerModule = new DataContainerModuleImpl(
initModule,
openTelemetryModule,
coreModule,
workerThreadModule,
systemServiceModule,
Expand Down Expand Up @@ -478,6 +482,7 @@ private void startImpl(@NonNull Context context,

final SessionModule sessionModule = new SessionModuleImpl(
initModule,
openTelemetryModule,
androidServicesModule,
essentialServiceModule,
nativeModule,
Expand Down Expand Up @@ -529,6 +534,7 @@ private void startImpl(@NonNull Context context,
// initialize internal interfaces
final InternalInterfaceModuleImpl internalInterfaceModule = new InternalInterfaceModuleImpl(
initModule,
openTelemetryModule,
coreModule,
androidServicesModule,
essentialServiceModule,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.embrace.android.embracesdk.injection.CoreModule
import io.embrace.android.embracesdk.injection.CrashModule
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.singleton
import io.embrace.android.embracesdk.internal.EmbraceInternalInterface

Expand All @@ -17,6 +18,7 @@ internal interface InternalInterfaceModule {

internal class InternalInterfaceModuleImpl(
initModule: InitModule,
openTelemetryModule: OpenTelemetryModule,
coreModule: CoreModule,
androidServicesModule: AndroidServicesModule,
essentialServiceModule: EssentialServiceModule,
Expand All @@ -25,7 +27,7 @@ internal class InternalInterfaceModuleImpl(
) : InternalInterfaceModule {

override val embraceInternalInterface: EmbraceInternalInterface by singleton {
EmbraceInternalInterfaceImpl(embrace, initModule, essentialServiceModule.configService, initModule.internalTracer)
EmbraceInternalInterfaceImpl(embrace, initModule, essentialServiceModule.configService, openTelemetryModule.internalTracer)
}

override val reactNativeInternalInterface: ReactNativeInternalInterface by singleton {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ internal interface DataCaptureServiceModule {

internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
initModule: InitModule,
openTelemetryModule: OpenTelemetryModule,
coreModule: CoreModule,
systemServiceModule: SystemServiceModule,
essentialServiceModule: EssentialServiceModule,
Expand Down Expand Up @@ -152,6 +153,6 @@ internal class DataCaptureServiceModuleImpl @JvmOverloads constructor(
}

override val startupService: StartupService by singleton {
StartupServiceImpl(initModule.spansService)
StartupServiceImpl(openTelemetryModule.spansService)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ internal interface DataContainerModule {

internal class DataContainerModuleImpl(
initModule: InitModule,
openTelemetryModule: OpenTelemetryModule,
coreModule: CoreModule,
workerThreadModule: WorkerThreadModule,
systemServiceModule: SystemServiceModule,
Expand Down Expand Up @@ -85,7 +86,7 @@ internal class DataContainerModuleImpl(
coreModule.logger,
workerThreadModule,
initModule.clock,
initModule.spansService
openTelemetryModule.spansService
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ internal interface DeliveryModule {

internal class DeliveryModuleImpl(
coreModule: CoreModule,
workerThreadModule: WorkerThreadModule,
storageModule: StorageModule,
essentialServiceModule: EssentialServiceModule,
workerThreadModule: WorkerThreadModule
) : DeliveryModule {

override val deliveryService: DeliveryService by singleton {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,8 @@ package io.embrace.android.embracesdk.injection
import io.embrace.android.embracesdk.internal.OpenTelemetryClock
import io.embrace.android.embracesdk.internal.clock.NormalizedIntervalClock
import io.embrace.android.embracesdk.internal.clock.SystemClock
import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpan
import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpanImpl
import io.embrace.android.embracesdk.internal.spans.EmbraceSpanExporter
import io.embrace.android.embracesdk.internal.spans.EmbraceSpanProcessor
import io.embrace.android.embracesdk.internal.spans.EmbraceSpansService
import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
import io.embrace.android.embracesdk.internal.spans.InternalTracer
import io.embrace.android.embracesdk.internal.spans.SpansRepository
import io.embrace.android.embracesdk.internal.spans.SpansService
import io.embrace.android.embracesdk.internal.spans.SpansSink
import io.embrace.android.embracesdk.internal.spans.SpansSinkImpl
import io.embrace.android.embracesdk.opentelemetry.OpenTelemetrySdk
import io.embrace.android.embracesdk.telemetry.EmbraceTelemetryService
import io.embrace.android.embracesdk.telemetry.TelemetryService
import io.opentelemetry.api.trace.Tracer

/**
* A module of components and services required at [EmbraceImpl] instantiation time, i.e. before the SDK evens starts
Expand All @@ -29,100 +16,23 @@ internal interface InitModule {
val clock: io.embrace.android.embracesdk.internal.clock.Clock

/**
* Service to track usage of public APIs and other internal metrics
*/
val telemetryService: TelemetryService

/**
* Caches [EmbraceSpan] instances that are in progress or completed in the current session
*/
val spansRepository: SpansRepository

/**
* Provides storage for completed spans that have not been sent off-device
*/
val spansSink: SpansSink

/**
* An instance of the OpenTelemetry component obtained from the wrapped SDK to create spans
*/
val tracer: Tracer

/**
* Component that manages and provides access to the current session span
*/
val currentSessionSpan: CurrentSessionSpan

/**
* Service to record spans
*/
val spansService: SpansService

/**
* Implementation of public tracing API
* OpenTelemetry SDK compatible clock based on [clock]
*/
val embraceTracer: EmbraceTracer
val openTelemetryClock: io.opentelemetry.sdk.common.Clock

/**
* Implementation of internal tracing API
* Service to track usage of public APIs and other internal metrics
*/
val internalTracer: InternalTracer
val telemetryService: TelemetryService
}

internal class InitModuleImpl(
override val clock: io.embrace.android.embracesdk.internal.clock.Clock =
NormalizedIntervalClock(systemClock = SystemClock()),
openTelemetryClock: io.opentelemetry.sdk.common.Clock = OpenTelemetryClock(clock)
override val openTelemetryClock: io.opentelemetry.sdk.common.Clock = OpenTelemetryClock(embraceClock = clock)
) : InitModule {

override val telemetryService: TelemetryService by singleton {
EmbraceTelemetryService()
}

override val spansRepository: SpansRepository by singleton {
SpansRepository()
}

override val spansSink: SpansSink by singleton {
SpansSinkImpl()
}

private val openTelemetrySdk: OpenTelemetrySdk by singleton {
OpenTelemetrySdk(
openTelemetryClock = openTelemetryClock,
spanProcessor = EmbraceSpanProcessor(EmbraceSpanExporter(spansSink))
)
}

override val tracer: Tracer by singleton {
openTelemetrySdk.getOpenTelemetryTracer()
}

override val currentSessionSpan: CurrentSessionSpan by singleton {
CurrentSessionSpanImpl(
clock = openTelemetryClock,
telemetryService = telemetryService,
spansRepository = spansRepository,
spansSink = spansSink,
tracer = tracer
)
}

override val spansService: SpansService by singleton {
EmbraceSpansService(
spansRepository = spansRepository,
currentSessionSpan = currentSessionSpan,
tracer = tracer,
)
}

override val embraceTracer: EmbraceTracer by singleton {
EmbraceTracer(
spansService = spansService
)
}

override val internalTracer: InternalTracer by singleton {
InternalTracer(clock = clock, spansRepository = spansRepository, embraceTracer = embraceTracer)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import java.util.concurrent.atomic.AtomicBoolean
*/
internal class ModuleInitBootstrapper(
val initModule: InitModule = InitModuleImpl(),
val openTelemetryModule: OpenTelemetryModule = OpenTelemetryModuleImpl(initModule),
private val coreModuleSupplier: CoreModuleSupplier = ::CoreModuleImpl,
private val systemServiceModuleSupplier: SystemServiceModuleSupplier = ::SystemServiceModuleImpl,
private val androidServicesModuleSupplier: AndroidServicesModuleSupplier = ::AndroidServicesModuleImpl,
Expand Down Expand Up @@ -68,7 +69,7 @@ internal class ModuleInitBootstrapper(
workerThreadModule = workerThreadModuleSupplier(initModule)
systemServiceModule = systemServiceModuleSupplier(coreModule, versionChecker)
androidServicesModule = androidServicesModuleSupplier(initModule, coreModule, workerThreadModule)
storageModule = storageModuleSupplier(workerThreadModule, initModule, coreModule)
storageModule = storageModuleSupplier(initModule, coreModule, workerThreadModule)
essentialServiceModule =
essentialServiceModuleSupplier(
initModule,
Expand All @@ -84,13 +85,14 @@ internal class ModuleInitBootstrapper(
dataCaptureServiceModule =
dataCaptureServiceModuleSupplier(
initModule,
openTelemetryModule,
coreModule,
systemServiceModule,
essentialServiceModule,
workerThreadModule,
versionChecker
)
deliveryModule = deliveryModuleSupplier(coreModule, storageModule, essentialServiceModule, workerThreadModule)
deliveryModule = deliveryModuleSupplier(coreModule, workerThreadModule, storageModule, essentialServiceModule)
initialized.set(true)
true
} else {
Expand All @@ -101,10 +103,10 @@ internal class ModuleInitBootstrapper(
}

internal typealias CoreModuleSupplier = Function2<Context, AppFramework, CoreModule>
internal typealias WorkerThreadModuleSupplier = Function1<InitModule, WorkerThreadModule>
internal typealias SystemServiceModuleSupplier = Function2<CoreModule, VersionChecker, SystemServiceModule>
internal typealias AndroidServicesModuleSupplier = Function3<InitModule, CoreModule, WorkerThreadModule, AndroidServicesModule>
internal typealias WorkerThreadModuleSupplier = Function1<InitModule, WorkerThreadModule>
internal typealias StorageModuleSupplier = Function3<WorkerThreadModule, InitModule, CoreModule, StorageModule>
internal typealias StorageModuleSupplier = Function3<InitModule, CoreModule, WorkerThreadModule, StorageModule>
internal typealias EssentialServiceModuleSupplier =
Function9<
InitModule,
Expand All @@ -119,8 +121,9 @@ internal typealias EssentialServiceModuleSupplier =
EssentialServiceModule
>

internal typealias DataCaptureServiceModuleSupplier = Function6<
internal typealias DataCaptureServiceModuleSupplier = Function7<
InitModule,
OpenTelemetryModule,
CoreModule,
SystemServiceModule,
EssentialServiceModule,
Expand All @@ -129,4 +132,4 @@ internal typealias DataCaptureServiceModuleSupplier = Function6<
DataCaptureServiceModule
>

internal typealias DeliveryModuleSupplier = Function4<CoreModule, StorageModule, EssentialServiceModule, WorkerThreadModule, DeliveryModule>
internal typealias DeliveryModuleSupplier = Function4<CoreModule, WorkerThreadModule, StorageModule, EssentialServiceModule, DeliveryModule>
Loading
Loading