Skip to content

Commit 7238ac4

Browse files
authored
Instrumentation context change (#763)
* Adding publish conventions * Rename .java to .kt * Rename .java to .kt * Renaming services * Making services testable * Removing Service interface * Adding tests * Updating rum builder tests * Removing Services from InstallationContext * Fix tests * Fix tests * Using services in instrumentations * Adding comment
1 parent c935de1 commit 7238ac4

File tree

56 files changed

+607
-710
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+607
-710
lines changed

core/src/main/java/io/opentelemetry/android/OpenTelemetryRum.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import android.app.Application;
99
import io.opentelemetry.android.config.OtelRumConfig;
10-
import io.opentelemetry.android.internal.services.ServiceManager;
10+
import io.opentelemetry.android.internal.services.Services;
1111
import io.opentelemetry.api.OpenTelemetry;
1212
import io.opentelemetry.sdk.OpenTelemetrySdk;
1313
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
@@ -61,16 +61,14 @@ static OpenTelemetryRumBuilder builder(Application application, OtelRumConfig co
6161
* @param openTelemetrySdk The {@link OpenTelemetrySdk} that the user has already created.
6262
* @param discoverInstrumentations TRUE to look for instrumentations in the classpath and
6363
* applying them automatically.
64-
* @param serviceManager The ServiceManager instance
6564
*/
6665
static SdkPreconfiguredRumBuilder builder(
6766
Application application,
6867
OpenTelemetrySdk openTelemetrySdk,
69-
boolean discoverInstrumentations,
70-
ServiceManager serviceManager) {
68+
boolean discoverInstrumentations) {
7169

7270
return new SdkPreconfiguredRumBuilder(
73-
application, openTelemetrySdk, discoverInstrumentations, serviceManager);
71+
application, openTelemetrySdk, discoverInstrumentations, Services.get(application));
7472
}
7573

7674
/** Returns a no-op implementation of {@link OpenTelemetryRum}. */

core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java

+24-36
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@
3131
import io.opentelemetry.android.internal.processors.SessionIdLogRecordAppender;
3232
import io.opentelemetry.android.internal.services.CacheStorage;
3333
import io.opentelemetry.android.internal.services.Preferences;
34-
import io.opentelemetry.android.internal.services.ServiceManager;
35-
import io.opentelemetry.android.internal.services.ServiceManagerImpl;
36-
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService;
34+
import io.opentelemetry.android.internal.services.Services;
35+
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWork;
3736
import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler;
3837
import io.opentelemetry.android.internal.session.SessionManagerImpl;
3938
import io.opentelemetry.android.session.SessionManager;
@@ -101,8 +100,6 @@ public final class OpenTelemetryRumBuilder {
101100

102101
private boolean isBuilt = false;
103102

104-
@Nullable private ServiceManager serviceManager;
105-
106103
@Nullable private ExportScheduleHandler exportScheduleHandler;
107104
@Nullable private SessionManager sessionManager;
108105

@@ -297,8 +294,9 @@ public OpenTelemetryRum build() {
297294
throw new IllegalStateException("You cannot call build multiple times");
298295
}
299296
isBuilt = true;
297+
Services services = Services.get(application);
300298
InitializationEvents initializationEvents = InitializationEvents.get();
301-
applyConfiguration(initializationEvents);
299+
applyConfiguration(services, initializationEvents);
302300

303301
BufferDelegatingLogExporter bufferDelegatingLogExporter = new BufferDelegatingLogExporter();
304302

@@ -317,7 +315,10 @@ public OpenTelemetryRum build() {
317315
sessionManager, application, bufferDelegatingSpanExporter))
318316
.setLoggerProvider(
319317
buildLoggerProvider(
320-
sessionManager, application, bufferDelegatingLogExporter))
318+
services,
319+
sessionManager,
320+
application,
321+
bufferDelegatingLogExporter))
321322
.setMeterProvider(buildMeterProvider(application))
322323
.setPropagators(buildFinalPropagators())
323324
.build();
@@ -331,13 +332,14 @@ public OpenTelemetryRum build() {
331332
timeoutHandler,
332333
sessionManager,
333334
config.shouldDiscoverInstrumentations(),
334-
getServiceManager());
335+
services);
335336

336337
// AsyncTask is deprecated but the thread pool is still used all over the Android SDK
337338
// and it provides a way to get a background thread without having to create a new one.
338339
android.os.AsyncTask.THREAD_POOL_EXECUTOR.execute(
339340
() ->
340341
initializeExporters(
342+
services,
341343
initializationEvents,
342344
bufferDelegatingSpanExporter,
343345
bufferDelegatingLogExporter));
@@ -348,6 +350,7 @@ public OpenTelemetryRum build() {
348350
}
349351

350352
private void initializeExporters(
353+
Services services,
351354
InitializationEvents initializationEvents,
352355
BufferDelegatingSpanExporter bufferDelegatingSpanExporter,
353356
BufferDelegatingLogExporter bufferedDelegatingLogExporter) {
@@ -358,7 +361,7 @@ private void initializeExporters(
358361
SignalFromDiskExporter signalFromDiskExporter = null;
359362
if (diskBufferingConfig.getEnabled()) {
360363
try {
361-
StorageConfiguration storageConfiguration = createStorageConfiguration();
364+
StorageConfiguration storageConfiguration = createStorageConfiguration(services);
362365
final SpanExporter originalSpanExporter = spanExporter;
363366
spanExporter =
364367
SpanToDiskExporter.create(originalSpanExporter, storageConfiguration);
@@ -379,23 +382,7 @@ private void initializeExporters(
379382
initializationEvents.spanExporterInitialized(spanExporter);
380383
bufferedDelegatingLogExporter.setDelegate(logsExporter);
381384
bufferDelegatingSpanExporter.setDelegate(spanExporter);
382-
scheduleDiskTelemetryReader(signalFromDiskExporter);
383-
}
384-
385-
@NonNull
386-
private ServiceManager getServiceManager() {
387-
if (serviceManager == null) {
388-
serviceManager = ServiceManagerImpl.Companion.create(application);
389-
}
390-
// This can never be null since we never write `null` to it
391-
return requireNonNull(serviceManager);
392-
}
393-
394-
public OpenTelemetryRumBuilder setServiceManager(@NonNull ServiceManager serviceManager) {
395-
requireNonNull(serviceManager, "serviceManager cannot be null");
396-
checkNotBuilt();
397-
this.serviceManager = serviceManager;
398-
return this;
385+
scheduleDiskTelemetryReader(services, signalFromDiskExporter);
399386
}
400387

401388
@VisibleForTesting
@@ -416,9 +403,9 @@ public OpenTelemetryRumBuilder setExportScheduleHandler(
416403
return this;
417404
}
418405

419-
private StorageConfiguration createStorageConfiguration() throws IOException {
420-
Preferences preferences = getServiceManager().getPreferences();
421-
CacheStorage storage = getServiceManager().getCacheStorage();
406+
private StorageConfiguration createStorageConfiguration(Services services) throws IOException {
407+
Preferences preferences = services.getPreferences();
408+
CacheStorage storage = services.getCacheStorage();
422409
DiskBufferingConfig config = this.config.getDiskBufferingConfig();
423410
DiskManager diskManager = new DiskManager(storage, preferences, config);
424411
return StorageConfiguration.builder()
@@ -434,12 +421,12 @@ private StorageConfiguration createStorageConfiguration() throws IOException {
434421
.build();
435422
}
436423

437-
private void scheduleDiskTelemetryReader(@Nullable SignalFromDiskExporter signalExporter) {
424+
private void scheduleDiskTelemetryReader(
425+
Services services, @Nullable SignalFromDiskExporter signalExporter) {
438426
if (exportScheduleHandler == null) {
439-
ServiceManager serviceManager = getServiceManager();
440427
// TODO: Is it safe to get the work service yet here? If so, we can
441428
// avoid all this lazy supplier stuff....
442-
Function0<PeriodicWorkService> getWorkService = serviceManager::getPeriodicWorkService;
429+
Function0<PeriodicWork> getWorkService = services::getPeriodicWork;
443430
exportScheduleHandler =
444431
new DefaultExportScheduleHandler(
445432
new DefaultExportScheduler(getWorkService), getWorkService);
@@ -475,7 +462,7 @@ public OpenTelemetryRumBuilder addOtelSdkReadyListener(Consumer<OpenTelemetrySdk
475462
}
476463

477464
/** Leverage the configuration to wire up various instrumentation components. */
478-
private void applyConfiguration(InitializationEvents initializationEvents) {
465+
private void applyConfiguration(Services services, InitializationEvents initializationEvents) {
479466
if (config.shouldGenerateSdkInitializationEvents()) {
480467
initializationEvents.recordConfiguration(config);
481468
}
@@ -498,7 +485,7 @@ private void applyConfiguration(InitializationEvents initializationEvents) {
498485
(tracerProviderBuilder, app) -> {
499486
SpanProcessor networkAttributesSpanAppender =
500487
NetworkAttributesSpanAppender.create(
501-
getServiceManager().getCurrentNetworkProvider());
488+
services.getCurrentNetworkProvider());
502489
return tracerProviderBuilder.addSpanProcessor(
503490
networkAttributesSpanAppender);
504491
});
@@ -511,7 +498,7 @@ private void applyConfiguration(InitializationEvents initializationEvents) {
511498
(tracerProviderBuilder, app) -> {
512499
SpanProcessor screenAttributesAppender =
513500
new ScreenAttributesSpanProcessor(
514-
getServiceManager().getVisibleScreenService());
501+
services.getVisibleScreenTracker());
515502
return tracerProviderBuilder.addSpanProcessor(screenAttributesAppender);
516503
});
517504
}
@@ -535,6 +522,7 @@ private SdkTracerProvider buildTracerProvider(
535522
}
536523

537524
private SdkLoggerProvider buildLoggerProvider(
525+
Services services,
538526
SessionProvider sessionProvider,
539527
Application application,
540528
LogRecordExporter logsExporter) {
@@ -544,7 +532,7 @@ private SdkLoggerProvider buildLoggerProvider(
544532
.addLogRecordProcessor(new SessionIdLogRecordAppender(sessionProvider))
545533
.addLogRecordProcessor(
546534
new ScreenAttributesLogRecordProcessor(
547-
getServiceManager().getVisibleScreenService()))
535+
services.getVisibleScreenTracker()))
548536
.addLogRecordProcessor(
549537
new GlobalAttributesLogRecordAppender(
550538
config.getGlobalAttributesSupplier()));

core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@
77

88
import static io.opentelemetry.android.common.RumConstants.SCREEN_NAME_KEY;
99

10-
import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenService;
10+
import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker;
1111
import io.opentelemetry.context.Context;
1212
import io.opentelemetry.sdk.trace.ReadWriteSpan;
1313
import io.opentelemetry.sdk.trace.ReadableSpan;
1414
import io.opentelemetry.sdk.trace.SpanProcessor;
1515

1616
public final class ScreenAttributesSpanProcessor implements SpanProcessor {
1717

18-
private final VisibleScreenService visibleScreenService;
18+
private final VisibleScreenTracker visibleScreenTracker;
1919

20-
public ScreenAttributesSpanProcessor(VisibleScreenService visibleScreenService) {
21-
this.visibleScreenService = visibleScreenService;
20+
public ScreenAttributesSpanProcessor(VisibleScreenTracker visibleScreenTracker) {
21+
this.visibleScreenTracker = visibleScreenTracker;
2222
}
2323

2424
@Override
2525
public void onStart(Context parentContext, ReadWriteSpan span) {
26-
String currentScreen = visibleScreenService.getCurrentlyVisibleScreen();
26+
String currentScreen = visibleScreenTracker.getCurrentlyVisibleScreen();
2727
span.setAttribute(SCREEN_NAME_KEY, currentScreen);
2828
}
2929

core/src/main/java/io/opentelemetry/android/SdkPreconfiguredRumBuilder.kt

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import android.app.Application
99
import io.opentelemetry.android.instrumentation.AndroidInstrumentation
1010
import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader
1111
import io.opentelemetry.android.instrumentation.InstallationContext
12-
import io.opentelemetry.android.internal.services.ServiceManager
12+
import io.opentelemetry.android.internal.services.Services
1313
import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler
1414
import io.opentelemetry.android.internal.session.SessionManagerImpl
1515
import io.opentelemetry.android.session.SessionManager
@@ -23,10 +23,10 @@ class SdkPreconfiguredRumBuilder
2323
private val timeoutHandler: SessionIdTimeoutHandler = SessionIdTimeoutHandler(),
2424
private val sessionManager: SessionManager = SessionManagerImpl(timeoutHandler = timeoutHandler),
2525
private val discoverInstrumentations: Boolean,
26-
private val serviceManager: ServiceManager,
26+
private val services: Services,
2727
) {
2828
private val instrumentations = mutableListOf<AndroidInstrumentation>()
29-
private val appLifecycleService by lazy { serviceManager.getAppLifecycleService() }
29+
private val appLifecycleService by lazy { services.appLifecycle }
3030

3131
/**
3232
* Adds an instrumentation to be applied as a part of the [build] method call.
@@ -48,15 +48,14 @@ class SdkPreconfiguredRumBuilder
4848
* @return A new [OpenTelemetryRum] instance.
4949
*/
5050
fun build(): OpenTelemetryRum {
51-
serviceManager.start()
5251
// the app state listeners need to be run in the first ActivityLifecycleCallbacks since they
5352
// might turn off/on additional telemetry depending on whether the app is active or not
5453
appLifecycleService.registerListener(timeoutHandler)
5554

5655
val openTelemetryRum = OpenTelemetryRumImpl(sdk, sessionManager)
5756

5857
// Install instrumentations
59-
val ctx = InstallationContext(application, openTelemetryRum.openTelemetry, sessionManager, serviceManager)
58+
val ctx = InstallationContext(application, openTelemetryRum.openTelemetry, sessionManager)
6059
for (instrumentation in getInstrumentations()) {
6160
instrumentation.install(ctx)
6261
}

core/src/main/java/io/opentelemetry/android/features/diskbuffering/scheduler/DefaultExportScheduleHandler.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55

66
package io.opentelemetry.android.features.diskbuffering.scheduler
77

8-
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService
8+
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWork
99
import java.util.concurrent.atomic.AtomicBoolean
1010

1111
class DefaultExportScheduleHandler(
1212
private val exportScheduler: DefaultExportScheduler,
13-
private val periodicWorkServiceProvider: () -> PeriodicWorkService,
13+
private val periodicWorkProvider: () -> PeriodicWork,
1414
) : ExportScheduleHandler {
15-
private val periodicWorkService by lazy { periodicWorkServiceProvider() }
15+
private val periodicWorkService by lazy { periodicWorkProvider() }
1616
private val enabled = AtomicBoolean(false)
1717

1818
override fun enable() {

core/src/main/java/io/opentelemetry/android/features/diskbuffering/scheduler/DefaultExportScheduler.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import android.util.Log
99
import io.opentelemetry.android.common.RumConstants.OTEL_RUM_LOG_TAG
1010
import io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter
1111
import io.opentelemetry.android.internal.services.periodicwork.PeriodicRunnable
12-
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWorkService
12+
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWork
1313
import java.io.IOException
1414
import java.util.concurrent.TimeUnit
1515

1616
class DefaultExportScheduler(
17-
periodicWorkServiceProvider: () -> PeriodicWorkService,
18-
) : PeriodicRunnable(periodicWorkServiceProvider) {
17+
periodicWorkProvider: () -> PeriodicWork,
18+
) : PeriodicRunnable(periodicWorkProvider) {
1919
companion object {
2020
private val DELAY_BEFORE_NEXT_EXPORT_IN_MILLIS = TimeUnit.SECONDS.toMillis(10)
2121
}

core/src/main/java/io/opentelemetry/android/internal/processors/ScreenAttributesLogRecordProcessor.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66
package io.opentelemetry.android.internal.processors
77

88
import io.opentelemetry.android.common.RumConstants
9-
import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenService
9+
import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker
1010
import io.opentelemetry.context.Context
1111
import io.opentelemetry.sdk.logs.LogRecordProcessor
1212
import io.opentelemetry.sdk.logs.ReadWriteLogRecord
1313

1414
class ScreenAttributesLogRecordProcessor(
15-
val visibleScreenService: VisibleScreenService,
15+
val visibleScreenTracker: VisibleScreenTracker,
1616
) : LogRecordProcessor {
1717
override fun onEmit(
1818
context: Context,
1919
logRecord: ReadWriteLogRecord,
2020
) {
21-
val currentScreen = visibleScreenService.currentlyVisibleScreen
21+
val currentScreen = visibleScreenTracker.currentlyVisibleScreen
2222
logRecord.setAttribute(RumConstants.SCREEN_NAME_KEY, currentScreen)
2323
}
2424
}

0 commit comments

Comments
 (0)