diff --git a/instrumentation/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/instrumentation/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java index a18d68605..009d799fe 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java @@ -17,9 +17,11 @@ import io.opentelemetry.android.instrumentation.network.NetworkAttributesSpanAppender; import io.opentelemetry.android.instrumentation.network.NetworkChangeMonitor; import io.opentelemetry.android.instrumentation.startup.InitializationEvents; +import io.opentelemetry.android.instrumentation.startup.InitializationListener; import io.opentelemetry.android.instrumentation.startup.SdkInitializationEvents; import io.opentelemetry.android.internal.features.persistence.DiskManager; import io.opentelemetry.android.internal.features.persistence.SimpleTemporaryFileProvider; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.ContextPropagators; @@ -249,6 +251,7 @@ public SessionId getSessionId() { * @return A new {@link OpenTelemetryRum} instance. */ public OpenTelemetryRum build() { + notifyInitializationStart(); applyConfiguration(); @@ -263,9 +266,23 @@ public OpenTelemetryRum build() { SdkPreconfiguredRumBuilder delegate = new SdkPreconfiguredRumBuilder(application, sdk, sessionId); instrumentationInstallers.forEach(delegate::addInstrumentation); + + notifyInitializationEnd(sdk); return delegate.build(); } + private void notifyInitializationStart() { + for (InitializationListener listener : config.getInitializationListeners()) { + listener.onStart(); + } + } + + private void notifyInitializationEnd(OpenTelemetry openTelemetry) { + for (InitializationListener listener : config.getInitializationListeners()) { + listener.onEnd(openTelemetry); + } + } + /** Leverage the configuration to wire up various instrumentation components. */ private void applyConfiguration() { if (config.shouldGenerateSdkInitializationEvents()) { diff --git a/instrumentation/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java b/instrumentation/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java index 7051c79db..f438ce7d7 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/config/OtelRumConfig.java @@ -7,7 +7,12 @@ import io.opentelemetry.android.ScreenAttributesSpanProcessor; import io.opentelemetry.android.instrumentation.network.CurrentNetworkProvider; +import io.opentelemetry.android.instrumentation.startup.InitializationListener; import io.opentelemetry.api.common.Attributes; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.function.Supplier; /** @@ -23,7 +28,9 @@ public class OtelRumConfig { private boolean includeScreenAttributes = true; private DiskBufferingConfiguration diskBufferingConfiguration = DiskBufferingConfiguration.builder().build(); + private boolean networkChangeMonitoringEnabled = true; + private final Set initializationListeners = new HashSet<>(); /** * Configures the set of global attributes to emit with every span and event. Any existing @@ -119,4 +126,17 @@ public void disableNetworkChangeMonitoring() { public boolean isNetworkChangeMonitoringEnabled() { return this.networkChangeMonitoringEnabled; } + + /** Adds a new initialization listener. It will be called during the RUM initialization. */ + public void addInitializationListener(InitializationListener listener) { + initializationListeners.add(listener); + } + + /** + * Provides an unmodifiable list of initialization listeners. This is mean to be called during + * RUM initialization. + */ + public Collection getInitializationListeners() { + return Collections.unmodifiableCollection(initializationListeners); + } } diff --git a/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/InitializationListener.kt b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/InitializationListener.kt new file mode 100644 index 000000000..413d3284d --- /dev/null +++ b/instrumentation/src/main/java/io/opentelemetry/android/instrumentation/startup/InitializationListener.kt @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.instrumentation.startup + +import io.opentelemetry.api.OpenTelemetry + +/** + * Provides callbacks to know the sate of the initialization. + */ +interface InitializationListener { + /** + * Called when the RUM initialization starts. + */ + fun onStart() + + /** + * Called when the RUM initialization ends. + * @param openTelemetry - The initialized OpenTelemetry instance. + */ + fun onEnd(openTelemetry: OpenTelemetry) +}