diff --git a/agent-api/api/agent-api.api b/agent-api/api/agent-api.api index bb7040f21..47d4c9255 100644 --- a/agent-api/api/agent-api.api +++ b/agent-api/api/agent-api.api @@ -1,8 +1,9 @@ public abstract interface class io/opentelemetry/android/OpenTelemetryRum { public abstract fun emitEvent (Ljava/lang/String;Ljava/lang/String;Lio/opentelemetry/api/common/Attributes;)V public static synthetic fun emitEvent$default (Lio/opentelemetry/android/OpenTelemetryRum;Ljava/lang/String;Ljava/lang/String;Lio/opentelemetry/api/common/Attributes;ILjava/lang/Object;)V + public abstract fun getClock ()Lio/opentelemetry/sdk/common/Clock; public abstract fun getOpenTelemetry ()Lio/opentelemetry/api/OpenTelemetry; - public abstract fun getRumSessionId ()Ljava/lang/String; + public abstract fun getSessionProvider ()Lio/opentelemetry/android/session/SessionProvider; public abstract fun shutdown ()V } diff --git a/agent-api/build.gradle.kts b/agent-api/build.gradle.kts index 68e054bd2..c81af6fd2 100644 --- a/agent-api/build.gradle.kts +++ b/agent-api/build.gradle.kts @@ -15,5 +15,6 @@ android { dependencies { api(platform(libs.opentelemetry.platform.alpha)) - api(libs.opentelemetry.api) + api(libs.opentelemetry.sdk) + api(project(":session")) } diff --git a/agent-api/src/main/java/io/opentelemetry/android/OpenTelemetryRum.kt b/agent-api/src/main/java/io/opentelemetry/android/OpenTelemetryRum.kt index d26c80ef1..518a9ff82 100644 --- a/agent-api/src/main/java/io/opentelemetry/android/OpenTelemetryRum.kt +++ b/agent-api/src/main/java/io/opentelemetry/android/OpenTelemetryRum.kt @@ -5,8 +5,10 @@ package io.opentelemetry.android +import io.opentelemetry.android.session.SessionProvider import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.common.Attributes +import io.opentelemetry.sdk.common.Clock /** * Entrypoint for the OpenTelemetry Real User Monitoring library for Android. @@ -19,11 +21,14 @@ interface OpenTelemetryRum { val openTelemetry: OpenTelemetry /** - * Get the client session ID associated with this instance of the RUM instrumentation library. - * Note: this value will change throughout the lifetime of an application instance, so it is - * recommended that you do not cache this value, but always retrieve it from here when needed. + * Get the [SessionProvider] associated with this instance. */ - fun getRumSessionId(): String + val sessionProvider: SessionProvider + + /** + * Get the [Clock] used by this instance for time-related operations. + */ + val clock: Clock /** * Emits an event with the specified name, body, and attributes. diff --git a/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.kt b/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.kt index f202603d0..98594af04 100644 --- a/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.kt +++ b/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.kt @@ -5,17 +5,15 @@ package io.opentelemetry.android +import io.opentelemetry.android.session.SessionProvider import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.common.Attributes -import io.opentelemetry.api.trace.TraceId +import io.opentelemetry.sdk.common.Clock internal object NoopOpenTelemetryRum : OpenTelemetryRum { override val openTelemetry: OpenTelemetry = OpenTelemetry.noop() - - override fun getRumSessionId(): String { - // RUM session.id has the same format as traceId - return TraceId.getInvalid() - } + override val sessionProvider: SessionProvider = SessionProvider.getNoop() + override val clock: Clock = Clock.getDefault() override fun emitEvent( eventName: String, diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.kt b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.kt index cd77f6e04..ed0aa9f3f 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.kt +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.kt @@ -10,12 +10,14 @@ import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.common.Attributes import io.opentelemetry.api.logs.Logger import io.opentelemetry.sdk.OpenTelemetrySdk +import io.opentelemetry.sdk.common.Clock internal class OpenTelemetryRumImpl( private val openTelemetrySdk: OpenTelemetrySdk, - private val sessionProvider: SessionProvider, - private val onShutdown: Runnable, + override val sessionProvider: SessionProvider, + override val clock: Clock, ) : OpenTelemetryRum { + var onShutdown: Runnable = Runnable {} private val logger: Logger = openTelemetrySdk.logsBridge .loggerBuilder("io.opentelemetry.rum.events") @@ -23,8 +25,6 @@ internal class OpenTelemetryRumImpl( override val openTelemetry: OpenTelemetry = openTelemetrySdk - override fun getRumSessionId(): String = sessionProvider.getSessionId() - override fun emitEvent( eventName: String, body: String, diff --git a/core/src/main/java/io/opentelemetry/android/SdkPreconfiguredRumBuilder.kt b/core/src/main/java/io/opentelemetry/android/SdkPreconfiguredRumBuilder.kt index eade9dd51..bdc521225 100644 --- a/core/src/main/java/io/opentelemetry/android/SdkPreconfiguredRumBuilder.kt +++ b/core/src/main/java/io/opentelemetry/android/SdkPreconfiguredRumBuilder.kt @@ -5,13 +5,13 @@ package io.opentelemetry.android +import android.app.Application import android.content.Context import android.util.Log import io.opentelemetry.android.common.RumConstants import io.opentelemetry.android.config.OtelRumConfig import io.opentelemetry.android.instrumentation.AndroidInstrumentation import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.session.SessionProvider import io.opentelemetry.sdk.OpenTelemetrySdk import io.opentelemetry.sdk.common.Clock @@ -55,8 +55,7 @@ class SdkPreconfiguredRumBuilder internal constructor( * @return A new [io.opentelemetry.android.OpenTelemetryRum] instance. */ fun build(): OpenTelemetryRum { - val ctx = InstallationContext(context, sdk, sessionProvider, clock) - if (ctx.application == null) { + if ((context as? Application) == null) { Log.w( RumConstants.OTEL_RUM_LOG_TAG, "Cannot retrieve applicationContext. This indicates the OpenTelemetry SDK was " + @@ -67,18 +66,18 @@ class SdkPreconfiguredRumBuilder internal constructor( } val enabledInstrumentations = getEnabledInstrumentations() - val onShutdown: () -> Unit = { + val openTelemetryRum = OpenTelemetryRumImpl(sdk, sessionProvider, clock) + openTelemetryRum.onShutdown = Runnable { for (instrumentation in enabledInstrumentations) { - instrumentation.uninstall(ctx) + instrumentation.uninstall(context, openTelemetryRum) } sdk.shutdown() onShutdown.run() } - val openTelemetryRum = OpenTelemetryRumImpl(sdk, sessionProvider, onShutdown) // Install instrumentations for (instrumentation in enabledInstrumentations) { - instrumentation.install(ctx) + instrumentation.install(context, openTelemetryRum) } // Install crash flush handler after instrumentations so it wraps any diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.kt b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.kt index c81295f4b..b9204569c 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.kt +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.kt @@ -138,7 +138,7 @@ class OpenTelemetryRumBuilderTest { .await() .atMost(Duration.ofSeconds(5)) .untilAsserted { - val sessionId = openTelemetryRum.getRumSessionId() + val sessionId = openTelemetryRum.sessionProvider.getSessionId() openTelemetryRum .openTelemetry .getTracer("test") @@ -193,7 +193,7 @@ class OpenTelemetryRumBuilderTest { .hasAttributesSatisfyingExactly( OpenTelemetryAssertions.equalTo( SessionIncubatingAttributes.SESSION_ID, - openTelemetryRum.getRumSessionId(), + openTelemetryRum.sessionProvider.getSessionId(), ), OpenTelemetryAssertions.equalTo(SCREEN_NAME_KEY, CUR_SCREEN_NAME), OpenTelemetryAssertions.equalTo(AttributeKey.stringKey("mega"), "hit"), @@ -307,8 +307,8 @@ class OpenTelemetryRumBuilderTest { (builder.instrumentationLoader as AndroidInstrumentationLoaderImpl).registerForTest(classpathInstrumentation) builder.build() - verify(exactly = 1) { localInstrumentation.install(any()) } - verify(exactly = 1) { classpathInstrumentation.install(any()) } + verify(exactly = 1) { localInstrumentation.install(any(), any()) } + verify(exactly = 1) { classpathInstrumentation.install(any(), any()) } } @Test @@ -332,8 +332,8 @@ class OpenTelemetryRumBuilderTest { (builder.instrumentationLoader as AndroidInstrumentationLoaderImpl).registerForTest(classpathInstrumentation) builder.build() - verify(exactly = 1) { localInstrumentation.install(any()) } - verify(exactly = 0) { classpathInstrumentation.install(any()) } + verify(exactly = 1) { localInstrumentation.install(any(), any()) } + verify(exactly = 0) { classpathInstrumentation.install(any(), any()) } } @Test @@ -467,7 +467,7 @@ class OpenTelemetryRumBuilderTest { OpenTelemetryAssertions.equalTo(SCREEN_NAME_KEY, CUR_SCREEN_NAME), OpenTelemetryAssertions.equalTo( SessionIncubatingAttributes.SESSION_ID, - rum.getRumSessionId(), + rum.sessionProvider.getSessionId(), ), ).hasSeverity(Severity.FATAL3) } @@ -631,7 +631,7 @@ class OpenTelemetryRumBuilderTest { .hasAttributes( Attributes .builder() - .put(SessionIncubatingAttributes.SESSION_ID, rum.getRumSessionId()) + .put(SessionIncubatingAttributes.SESSION_ID, rum.sessionProvider.getSessionId()) .put("someGlobalKey", "someGlobalValue") .put("localAttrKey", "localAttrValue") .put(SCREEN_NAME_KEY, CUR_SCREEN_NAME) diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumNoopTest.kt b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumNoopTest.kt index 96214680d..cc764c453 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumNoopTest.kt +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumNoopTest.kt @@ -14,7 +14,7 @@ internal class OpenTelemetryRumNoopTest { fun testNoopOpenTelemetryRum() { val noop = RumBuilder.noop() assertEquals(OpenTelemetry.noop(), noop.openTelemetry) - assertEquals("00000000000000000000000000000000", noop.getRumSessionId()) + assertEquals("", noop.sessionProvider.getSessionId()) // assert no exceptions thrown noop.emitEvent("event") diff --git a/core/src/test/java/io/opentelemetry/android/instrumentation/AndroidInstrumentationLoaderImplTest.kt b/core/src/test/java/io/opentelemetry/android/instrumentation/AndroidInstrumentationLoaderImplTest.kt index b5c7c2181..4dc1350ed 100644 --- a/core/src/test/java/io/opentelemetry/android/instrumentation/AndroidInstrumentationLoaderImplTest.kt +++ b/core/src/test/java/io/opentelemetry/android/instrumentation/AndroidInstrumentationLoaderImplTest.kt @@ -25,7 +25,7 @@ class AndroidInstrumentationLoaderImplTest { assertThat(instrumentation).isNotNull() assertThat(checkNotNull(instrumentation).installed).isFalse() - instrumentation.install(mockk()) + instrumentation.install(mockk(), mockk(relaxed = true)) assertThat(checkNotNull(loader.getByType(TestAndroidInstrumentation::class.java)).installed).isTrue() } diff --git a/core/src/test/java/io/opentelemetry/android/instrumentation/TestAndroidInstrumentation.kt b/core/src/test/java/io/opentelemetry/android/instrumentation/TestAndroidInstrumentation.kt index 3057b4bc7..a2af64bee 100644 --- a/core/src/test/java/io/opentelemetry/android/instrumentation/TestAndroidInstrumentation.kt +++ b/core/src/test/java/io/opentelemetry/android/instrumentation/TestAndroidInstrumentation.kt @@ -5,17 +5,26 @@ package io.opentelemetry.android.instrumentation +import android.content.Context +import io.opentelemetry.android.OpenTelemetryRum + class TestAndroidInstrumentation : AndroidInstrumentation { override val name: String = "test" var installed = false private set - override fun install(ctx: InstallationContext) { + override fun install( + context: Context, + openTelemetryRum: OpenTelemetryRum, + ) { installed = true } - override fun uninstall(ctx: InstallationContext) { + override fun uninstall( + context: Context, + openTelemetryRum: OpenTelemetryRum, + ) { installed = false } } diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt index dee98f1f8..ad7992e0c 100644 --- a/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/MainActivity.kt @@ -90,7 +90,7 @@ class MainActivity : ComponentActivity() { Log.d(TAG, "Main Activity started ") } } - viewModel.sessionIdState.value = OtelDemoApplication.rum?.getRumSessionId() ?: error("Session ID is null") + viewModel.sessionIdState.value = OtelDemoApplication.rum?.sessionProvider?.getSessionId() ?: error("Session ID is null") // Request the correct phone state permission based on API level // This permission is needed for gathering certain network information like diff --git a/demo-app/src/main/java/io/opentelemetry/android/demo/OtelDemoApplication.kt b/demo-app/src/main/java/io/opentelemetry/android/demo/OtelDemoApplication.kt index 3d22f98dd..aeca878c6 100644 --- a/demo-app/src/main/java/io/opentelemetry/android/demo/OtelDemoApplication.kt +++ b/demo-app/src/main/java/io/opentelemetry/android/demo/OtelDemoApplication.kt @@ -42,7 +42,7 @@ class OtelDemoApplication : Application() { } } ) - Log.d(TAG, "RUM session started: " + rum?.getRumSessionId()) + Log.d(TAG, "RUM session started: " + rum?.sessionProvider?.getSessionId()) } catch (e: Exception) { Log.e(TAG, "Oh no!", e) } diff --git a/instrumentation/activity/api/activity.api b/instrumentation/activity/api/activity.api index c803f0193..6444ce8eb 100644 --- a/instrumentation/activity/api/activity.api +++ b/instrumentation/activity/api/activity.api @@ -1,9 +1,9 @@ public final class io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setScreenNameExtractor (Lio/opentelemetry/android/instrumentation/common/ScreenNameExtractor;)V public final fun setTracerCustomizer (Lkotlin/jvm/functions/Function1;)V - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/activity/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentation.kt b/instrumentation/activity/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentation.kt index 6f5c9482e..2197374fd 100644 --- a/instrumentation/activity/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentation.kt +++ b/instrumentation/activity/src/main/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentation.kt @@ -6,16 +6,18 @@ package io.opentelemetry.android.instrumentation.activity import android.app.Application +import android.content.Context import android.os.Build import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.instrumentation.activity.startup.AppStartupTimer import io.opentelemetry.android.instrumentation.common.Constants.INSTRUMENTATION_SCOPE import io.opentelemetry.android.instrumentation.common.DefaultScreenNameExtractor import io.opentelemetry.android.instrumentation.common.ScreenNameExtractor import io.opentelemetry.android.internal.services.Services import io.opentelemetry.android.internal.services.visiblescreen.activities.DefaultingActivityLifecycleCallbacks +import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.trace.Tracer @AutoService(AndroidInstrumentation::class) @@ -36,22 +38,22 @@ class ActivityLifecycleInstrumentation : AndroidInstrumentation { this.screenNameExtractor = screenNameExtractor } - override fun install(ctx: InstallationContext) { - startupTimer.start(ctx.openTelemetry.getTracer(INSTRUMENTATION_SCOPE), ctx.clock) - ctx.application?.let { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + startupTimer.start(openTelemetryRum.openTelemetry.getTracer(INSTRUMENTATION_SCOPE), openTelemetryRum.clock) + (context as? Application)?.let { startupLifecycle = startupTimer.createLifecycleCallback().apply { it.registerActivityLifecycleCallbacks(this) } activityLifecycle = - buildActivityLifecycleTracer(ctx).apply { + buildActivityLifecycleTracer(context, openTelemetryRum.openTelemetry).apply { it.registerActivityLifecycleCallbacks(this) } } } - override fun uninstall(ctx: InstallationContext) { - ctx.application?.let { + override fun uninstall(context: Context, openTelemetryRum: OpenTelemetryRum) { + (context as? Application)?.let { if (startupLifecycle != null) { it.unregisterActivityLifecycleCallbacks(startupLifecycle) startupLifecycle = null @@ -63,9 +65,9 @@ class ActivityLifecycleInstrumentation : AndroidInstrumentation { } } - private fun buildActivityLifecycleTracer(ctx: InstallationContext): DefaultingActivityLifecycleCallbacks { - val visibleScreenService = Services.get(ctx.context).visibleScreenTracker - val delegateTracer: Tracer = ctx.openTelemetry.getTracer(INSTRUMENTATION_SCOPE) + private fun buildActivityLifecycleTracer(context: Context, openTelemetry: OpenTelemetry): DefaultingActivityLifecycleCallbacks { + val visibleScreenService = Services.get(context).visibleScreenTracker + val delegateTracer: Tracer = openTelemetry.getTracer(INSTRUMENTATION_SCOPE) val tracers = ActivityTracerCache( tracerCustomizer.invoke(delegateTracer), diff --git a/instrumentation/activity/src/test/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentationTest.kt b/instrumentation/activity/src/test/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentationTest.kt index 2fb53b2de..54d0954f5 100644 --- a/instrumentation/activity/src/test/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentationTest.kt +++ b/instrumentation/activity/src/test/java/io/opentelemetry/android/instrumentation/activity/ActivityLifecycleInstrumentationTest.kt @@ -10,8 +10,8 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.mockk.every import io.mockk.mockk import io.mockk.verify +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.common.RumConstants -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.internal.services.Services import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker import io.opentelemetry.android.session.SessionProvider @@ -57,8 +57,11 @@ class ActivityLifecycleInstrumentationTest { ) every { startupSpanBuilder.startSpan() }.returns(startupSpan) - val ctx = InstallationContext(application, openTelemetry, sessionProvider, Clock.getDefault()) - activityLifecycleInstrumentation.install(ctx) + val openTelemetryRum = mockk() + every { openTelemetryRum.openTelemetry } returns openTelemetry + every { openTelemetryRum.sessionProvider } returns sessionProvider + every { openTelemetryRum.clock } returns Clock.getDefault() + activityLifecycleInstrumentation.install(application, openTelemetryRum) verify { tracer.spanBuilder("AppStart") diff --git a/instrumentation/android-instrumentation/api/android-instrumentation.api b/instrumentation/android-instrumentation/api/android-instrumentation.api index 35a1b3d74..318172a7b 100644 --- a/instrumentation/android-instrumentation/api/android-instrumentation.api +++ b/instrumentation/android-instrumentation/api/android-instrumentation.api @@ -1,15 +1,6 @@ public abstract interface class io/opentelemetry/android/instrumentation/AndroidInstrumentation { public abstract fun getName ()Ljava/lang/String; - public abstract fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V -} - -public final class io/opentelemetry/android/instrumentation/InstallationContext { - public fun (Landroid/content/Context;Lio/opentelemetry/api/OpenTelemetry;Lio/opentelemetry/android/session/SessionProvider;Lio/opentelemetry/sdk/common/Clock;)V - public final fun getApplication ()Landroid/app/Application; - public final fun getClock ()Lio/opentelemetry/sdk/common/Clock; - public final fun getContext ()Landroid/content/Context; - public final fun getOpenTelemetry ()Lio/opentelemetry/api/OpenTelemetry; - public final fun getSessionProvider ()Lio/opentelemetry/android/session/SessionProvider; + public abstract fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/android-instrumentation/build.gradle.kts b/instrumentation/android-instrumentation/build.gradle.kts index 2ffed325f..a0e1e4600 100644 --- a/instrumentation/android-instrumentation/build.gradle.kts +++ b/instrumentation/android-instrumentation/build.gradle.kts @@ -15,8 +15,5 @@ android { dependencies { api(platform(libs.opentelemetry.platform.alpha)) // Required for sonatype publishing - implementation(project(":services")) - implementation(project(":session")) - implementation(project(":agent-api")) - implementation(libs.opentelemetry.sdk) + api(project(":agent-api")) } diff --git a/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/AndroidInstrumentation.kt b/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/AndroidInstrumentation.kt index dcd45901f..bf50ca1a7 100644 --- a/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/AndroidInstrumentation.kt +++ b/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/AndroidInstrumentation.kt @@ -5,6 +5,9 @@ package io.opentelemetry.android.instrumentation +import android.content.Context +import io.opentelemetry.android.OpenTelemetryRum + /** * This interface defines a tool that automatically generates telemetry for a specific use-case, * without the need for end users to directly interact with the OpenTelemetry SDK to create telemetry manually. @@ -26,17 +29,25 @@ interface AndroidInstrumentation { * only be called from [OpenTelemetryRum]'s builder once the [OpenTelemetryRum] instance is initialized and ready * to use for generating telemetry. * - * @param ctx The InstallationContext under which the instrumentation is being installed. + * @param context The Android application [Context] under which the instrumentation is being installed. + * @param openTelemetryRum The [OpenTelemetryRum] instance. */ - fun install(ctx: InstallationContext) + fun install( + context: Context, + openTelemetryRum: OpenTelemetryRum, + ) /** * This method can be called to uninstall the instrumentation. Implementations should remove all * used resources and shut down cleanly. * - * @param ctx The InstallationContext under which the instrumentation had been removed. + * @param context The Android application [Context] under which the instrumentation is being installed. + * @param openTelemetryRum The [OpenTelemetryRum] instance. */ - fun uninstall(ctx: InstallationContext) {} + fun uninstall( + context: Context, + openTelemetryRum: OpenTelemetryRum, + ) {} /** * The canonical short name for this instrumentation. diff --git a/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/InstallationContext.kt b/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/InstallationContext.kt deleted file mode 100644 index ebd66d928..000000000 --- a/instrumentation/android-instrumentation/src/main/java/io/opentelemetry/android/instrumentation/InstallationContext.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation - -import android.app.Application -import android.content.Context -import io.opentelemetry.android.session.SessionProvider -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.sdk.common.Clock - -class InstallationContext( - val context: Context, - val openTelemetry: OpenTelemetry, - val sessionProvider: SessionProvider, - val clock: Clock, -) { - val application: Application? = context as? Application -} diff --git a/instrumentation/android-log/library/api/library.api b/instrumentation/android-log/library/api/library.api index 33c7edd06..58f65b8db 100644 --- a/instrumentation/android-log/library/api/library.api +++ b/instrumentation/android-log/library/api/library.api @@ -1,7 +1,7 @@ public final class io/opentelemetry/instrumentation/library/log/AndroidLogInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } public final class io/opentelemetry/instrumentation/library/log/AndroidLogSubstitutions { @@ -25,7 +25,7 @@ public final class io/opentelemetry/instrumentation/library/log/AndroidLogSubsti public final class io/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator { public static final field INSTANCE Lio/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator; - public static final fun configure (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public static final fun configure (Lio/opentelemetry/api/OpenTelemetry;)V public static final fun createLogRecordBuilder ()Lio/opentelemetry/api/logs/LogRecordBuilder; public static final fun getTypeName (Ljava/lang/Throwable;)Ljava/lang/String; public static final fun printStacktrace (Ljava/lang/Throwable;)Ljava/lang/String; diff --git a/instrumentation/android-log/library/src/main/java/io/opentelemetry/instrumentation/library/log/AndroidLogInstrumentation.kt b/instrumentation/android-log/library/src/main/java/io/opentelemetry/instrumentation/library/log/AndroidLogInstrumentation.kt index 446b4329d..13584aa25 100644 --- a/instrumentation/android-log/library/src/main/java/io/opentelemetry/instrumentation/library/log/AndroidLogInstrumentation.kt +++ b/instrumentation/android-log/library/src/main/java/io/opentelemetry/instrumentation/library/log/AndroidLogInstrumentation.kt @@ -5,15 +5,16 @@ package io.opentelemetry.instrumentation.library.log +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.instrumentation.library.log.internal.LogRecordBuilderCreator.configure @AutoService(AndroidInstrumentation::class) class AndroidLogInstrumentation : AndroidInstrumentation { - override fun install(ctx: InstallationContext) { - configure(ctx) + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + configure(openTelemetryRum.openTelemetry) } override val name: String = "android-log" diff --git a/instrumentation/android-log/library/src/main/kotlin/io/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator.kt b/instrumentation/android-log/library/src/main/kotlin/io/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator.kt index 49dfb7371..e7aa974f0 100644 --- a/instrumentation/android-log/library/src/main/kotlin/io/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator.kt +++ b/instrumentation/android-log/library/src/main/kotlin/io/opentelemetry/instrumentation/library/log/internal/LogRecordBuilderCreator.kt @@ -5,7 +5,6 @@ package io.opentelemetry.instrumentation.library.log.internal -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.logs.LogRecordBuilder @@ -18,9 +17,9 @@ object LogRecordBuilderCreator { .build() @JvmStatic - fun configure(context: InstallationContext) { + fun configure(openTelemetry: OpenTelemetry) { logger = - context.openTelemetry + openTelemetry .logsBridge .loggerBuilder("io.opentelemetry.android.log") .build() diff --git a/instrumentation/anr/api/anr.api b/instrumentation/anr/api/anr.api index e39bde471..4db89eb49 100644 --- a/instrumentation/anr/api/anr.api +++ b/instrumentation/anr/api/anr.api @@ -2,7 +2,7 @@ public final class io/opentelemetry/android/instrumentation/anr/AnrInstrumentati public fun ()V public final fun addAttributesExtractor (Lio/opentelemetry/android/instrumentation/common/EventAttributesExtractor;)Lio/opentelemetry/android/instrumentation/anr/AnrInstrumentation; public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setMainLooper (Landroid/os/Looper;)Lio/opentelemetry/android/instrumentation/anr/AnrInstrumentation; } diff --git a/instrumentation/anr/src/main/java/io/opentelemetry/android/instrumentation/anr/AnrInstrumentation.kt b/instrumentation/anr/src/main/java/io/opentelemetry/android/instrumentation/anr/AnrInstrumentation.kt index 8adcc236b..8ca97dd78 100644 --- a/instrumentation/anr/src/main/java/io/opentelemetry/android/instrumentation/anr/AnrInstrumentation.kt +++ b/instrumentation/anr/src/main/java/io/opentelemetry/android/instrumentation/anr/AnrInstrumentation.kt @@ -5,11 +5,12 @@ package io.opentelemetry.android.instrumentation.anr +import android.content.Context import android.os.Looper import androidx.annotation.VisibleForTesting import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.instrumentation.common.EventAttributesExtractor import io.opentelemetry.android.internal.services.Services.Companion.get import java.util.concurrent.Executors @@ -42,14 +43,14 @@ class AnrInstrumentation : AndroidInstrumentation { return this } - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { val anrDetector = AnrDetector( additionalExtractors, mainLooper, scheduler, - get(ctx.context).appLifecycle, - ctx.openTelemetry, + get(context).appLifecycle, + openTelemetryRum.openTelemetry, ) anrDetector.start() } diff --git a/instrumentation/compose/click/api/click.api b/instrumentation/compose/click/api/click.api index 47bcbf5f8..78844c249 100644 --- a/instrumentation/compose/click/api/click.api +++ b/instrumentation/compose/click/api/click.api @@ -1,6 +1,6 @@ public final class io/opentelemetry/instrumentation/compose/click/ComposeClickInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/compose/click/src/main/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeClickInstrumentation.kt b/instrumentation/compose/click/src/main/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeClickInstrumentation.kt index 581b2dc86..c3c8f7176 100644 --- a/instrumentation/compose/click/src/main/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeClickInstrumentation.kt +++ b/instrumentation/compose/click/src/main/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeClickInstrumentation.kt @@ -5,19 +5,21 @@ package io.opentelemetry.instrumentation.compose.click +import android.app.Application +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext @AutoService(AndroidInstrumentation::class) class ComposeClickInstrumentation : AndroidInstrumentation { override val name: String = "compose.click" - override fun install(ctx: InstallationContext) { - ctx.application?.registerActivityLifecycleCallbacks( + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + (context as? Application)?.registerActivityLifecycleCallbacks( ComposeClickActivityCallback( ComposeClickEventGenerator( - ctx.openTelemetry + openTelemetryRum.openTelemetry .logsBridge .loggerBuilder("io.opentelemetry.android.instrumentation.compose.click") .build(), diff --git a/instrumentation/compose/click/src/test/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeInstrumentationTest.kt b/instrumentation/compose/click/src/test/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeInstrumentationTest.kt index 5a27b6da5..61a8d5570 100644 --- a/instrumentation/compose/click/src/test/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeInstrumentationTest.kt +++ b/instrumentation/compose/click/src/test/kotlin/io/opentelemetry/instrumentation/compose/click/ComposeInstrumentationTest.kt @@ -39,7 +39,7 @@ import io.mockk.mockkClass import io.mockk.mockkStatic import io.mockk.slot import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.session.SessionProvider import io.opentelemetry.sdk.common.Clock import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat @@ -98,13 +98,11 @@ internal class ComposeInstrumentationTest { @Test fun capture_compose_click() { - val installationContext = - InstallationContext( - application, - openTelemetryRule.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk { + every { openTelemetry } returns openTelemetryRule.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } val callbackCapturingSlot = slot() every { window.callback } returns callback @@ -113,7 +111,7 @@ internal class ComposeInstrumentationTest { every { activity.window } returns window every { application.registerActivityLifecycleCallbacks(any()) } returns Unit - ComposeClickInstrumentation().install(installationContext) + ComposeClickInstrumentation().install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(callbackCapturingSlot)) diff --git a/instrumentation/crash/api/crash.api b/instrumentation/crash/api/crash.api index 202dbc956..feec48465 100644 --- a/instrumentation/crash/api/crash.api +++ b/instrumentation/crash/api/crash.api @@ -7,6 +7,6 @@ public final class io/opentelemetry/android/instrumentation/crash/CrashReporterI public fun ()V public final fun addAttributesExtractor (Lio/opentelemetry/android/instrumentation/common/EventAttributesExtractor;)V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/crash/src/main/java/io/opentelemetry/android/instrumentation/crash/CrashReporterInstrumentation.kt b/instrumentation/crash/src/main/java/io/opentelemetry/android/instrumentation/crash/CrashReporterInstrumentation.kt index 34d393a48..aba8597d1 100644 --- a/instrumentation/crash/src/main/java/io/opentelemetry/android/instrumentation/crash/CrashReporterInstrumentation.kt +++ b/instrumentation/crash/src/main/java/io/opentelemetry/android/instrumentation/crash/CrashReporterInstrumentation.kt @@ -5,9 +5,10 @@ package io.opentelemetry.android.instrumentation.crash +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.instrumentation.common.EventAttributesExtractor /** Entrypoint for installing the crash reporting instrumentation. */ @@ -21,10 +22,10 @@ class CrashReporterInstrumentation : AndroidInstrumentation { additionalExtractors.add(extractor) } - override fun install(ctx: InstallationContext) { - addAttributesExtractor(RuntimeDetailsExtractor.create(ctx.context)) + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + addAttributesExtractor(RuntimeDetailsExtractor.create(context)) val crashReporter = CrashReporter(additionalExtractors) - crashReporter.install(ctx.openTelemetry) + crashReporter.install(openTelemetryRum.openTelemetry) } override val name: String = "crash" diff --git a/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/CrashReportIntegrationTest.kt b/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/CrashReportIntegrationTest.kt index bccf16112..9b339f734 100644 --- a/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/CrashReportIntegrationTest.kt +++ b/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/CrashReportIntegrationTest.kt @@ -5,8 +5,11 @@ package io.opentelemetry.android.instrumentation.crash +import android.app.Application +import io.mockk.every +import io.mockk.mockk +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.common.internal.utils.threadIdCompat -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.instrumentation.common.EventAttributesExtractor import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.common.Attributes @@ -16,32 +19,36 @@ import io.opentelemetry.sdk.logs.data.LogRecordData import io.opentelemetry.sdk.testing.junit4.OpenTelemetryRule import io.opentelemetry.semconv.ExceptionAttributes import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes +import java.io.PrintWriter +import java.util.concurrent.CountDownLatch +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test -import java.io.PrintWriter -import java.util.concurrent.CountDownLatch -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit internal class CrashReportIntegrationTest { private lateinit var rule: OpenTelemetryRule - private lateinit var installationContext: InstallationContext + private lateinit var context: Application + private lateinit var openTelemetryRum: OpenTelemetryRum private lateinit var instrumentation: CrashReporterInstrumentation @Before fun setUp() { rule = OpenTelemetryRule.create() - installationContext = fakeInstallationContext(rule.openTelemetry) + context = mockk(relaxed = true) + openTelemetryRum = mockk { + every { openTelemetry } returns rule.openTelemetry + } instrumentation = CrashReporterInstrumentation() } @Test fun `test crash reporter instrumentation is installed`() { assertEquals("crash", instrumentation.name) - instrumentation.install(installationContext) + instrumentation.install(context, openTelemetryRum) val handler = Thread.getDefaultUncaughtExceptionHandler() assertTrue(handler is CrashReportingExceptionHandler) @@ -172,7 +179,10 @@ internal class CrashReportIntegrationTest { * from [FakeLogRecordExporter] */ private fun simulateUncaughtException(throwable: Throwable): LogRecordData { - instrumentation.install(fakeInstallationContext(rule.openTelemetry)) + val rum = mockk { + every { openTelemetry } returns rule.openTelemetry + } + instrumentation.install(context, rum) val handler = checkNotNull(Thread.getDefaultUncaughtExceptionHandler()) val thread = Thread.currentThread() handler.uncaughtException(thread, throwable) diff --git a/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/FakeInstallationContext.kt b/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/FakeInstallationContext.kt deleted file mode 100644 index 0b4a9094d..000000000 --- a/instrumentation/crash/src/test/java/io/opentelemetry/android/instrumentation/crash/FakeInstallationContext.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.instrumentation.crash - -import android.app.Application -import io.mockk.mockk -import io.opentelemetry.android.instrumentation.InstallationContext -import io.opentelemetry.android.session.SessionProvider -import io.opentelemetry.api.OpenTelemetry -import io.opentelemetry.sdk.common.Clock - -internal fun fakeInstallationContext(openTelemetry: OpenTelemetry): InstallationContext { - val ctx = mockk(relaxed = true) - return InstallationContext( - context = ctx, - openTelemetry = openTelemetry, - sessionProvider = SessionProvider.getNoop(), - clock = Clock.getDefault(), - ) -} diff --git a/instrumentation/fragment/api/fragment.api b/instrumentation/fragment/api/fragment.api index 2b62bbb44..ba8f4aff2 100644 --- a/instrumentation/fragment/api/fragment.api +++ b/instrumentation/fragment/api/fragment.api @@ -1,9 +1,9 @@ public final class io/opentelemetry/android/instrumentation/fragment/FragmentLifecycleInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setScreenNameExtractor (Lio/opentelemetry/android/instrumentation/common/ScreenNameExtractor;)V public final fun setTracerCustomizer (Lkotlin/jvm/functions/Function1;)V - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/fragment/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentLifecycleInstrumentation.kt b/instrumentation/fragment/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentLifecycleInstrumentation.kt index ff9896d80..0a380fa3a 100644 --- a/instrumentation/fragment/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentLifecycleInstrumentation.kt +++ b/instrumentation/fragment/src/main/java/io/opentelemetry/android/instrumentation/fragment/FragmentLifecycleInstrumentation.kt @@ -5,16 +5,19 @@ package io.opentelemetry.android.instrumentation.fragment +import android.app.Application import android.app.Application.ActivityLifecycleCallbacks +import android.content.Context import android.os.Build import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.instrumentation.common.Constants.INSTRUMENTATION_SCOPE import io.opentelemetry.android.instrumentation.common.DefaultScreenNameExtractor import io.opentelemetry.android.instrumentation.common.ScreenNameExtractor import io.opentelemetry.android.internal.services.Services import io.opentelemetry.android.internal.services.visiblescreen.fragments.RumFragmentActivityRegisterer +import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.trace.Tracer @AutoService(AndroidInstrumentation::class) @@ -33,21 +36,21 @@ class FragmentLifecycleInstrumentation : AndroidInstrumentation { override val name: String = "fragment" - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { activityLifecycleCallbacks = - buildFragmentRegisterer(ctx).apply { - ctx.application?.registerActivityLifecycleCallbacks(this) + buildFragmentRegisterer(context, openTelemetryRum.openTelemetry).apply { + (context as? Application)?.registerActivityLifecycleCallbacks(this) } } - override fun uninstall(ctx: InstallationContext) { - ctx.application?.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks) + override fun uninstall(context: Context, openTelemetryRum: OpenTelemetryRum) { + (context as? Application)?.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks) activityLifecycleCallbacks = null } - private fun buildFragmentRegisterer(ctx: InstallationContext): ActivityLifecycleCallbacks { - val visibleScreenService = Services.get(ctx.context).visibleScreenTracker - val delegateTracer: Tracer = ctx.openTelemetry.getTracer(INSTRUMENTATION_SCOPE) + private fun buildFragmentRegisterer(context: Context, openTelemetry: OpenTelemetry): ActivityLifecycleCallbacks { + val visibleScreenService = Services.get(context).visibleScreenTracker + val delegateTracer: Tracer = openTelemetry.getTracer(INSTRUMENTATION_SCOPE) val fragmentLifecycle = RumFragmentLifecycleCallbacks( tracerCustomizer.invoke(delegateTracer), diff --git a/instrumentation/httpurlconnection/library/api/library.api b/instrumentation/httpurlconnection/library/api/library.api index 384ff40c4..a898ab0f2 100644 --- a/instrumentation/httpurlconnection/library/api/library.api +++ b/instrumentation/httpurlconnection/library/api/library.api @@ -9,7 +9,7 @@ public final class io/opentelemetry/instrumentation/library/httpurlconnection/Ht public fun getName ()Ljava/lang/String; public final fun getReportIdleConnectionInterval ()J public final fun getReportIdleConnectionRunnable ()Ljava/lang/Runnable; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setCapturedRequestHeaders (Ljava/util/List;)V public final fun setCapturedResponseHeaders (Ljava/util/List;)V public final fun setConnectionInactivityTimeoutMs (J)V diff --git a/instrumentation/httpurlconnection/library/src/main/java/io/opentelemetry/instrumentation/library/httpurlconnection/HttpUrlInstrumentation.kt b/instrumentation/httpurlconnection/library/src/main/java/io/opentelemetry/instrumentation/library/httpurlconnection/HttpUrlInstrumentation.kt index 56c00b82a..124892012 100644 --- a/instrumentation/httpurlconnection/library/src/main/java/io/opentelemetry/instrumentation/library/httpurlconnection/HttpUrlInstrumentation.kt +++ b/instrumentation/httpurlconnection/library/src/main/java/io/opentelemetry/instrumentation/library/httpurlconnection/HttpUrlInstrumentation.kt @@ -5,9 +5,10 @@ package io.opentelemetry.instrumentation.library.httpurlconnection +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor import io.opentelemetry.instrumentation.api.internal.HttpConstants import io.opentelemetry.instrumentation.library.httpurlconnection.internal.HttpUrlConnectionSingletons @@ -105,8 +106,8 @@ class HttpUrlInstrumentation : AndroidInstrumentation { fun emitExperimentalHttpClientMetrics(): Boolean = emitExperimentalHttpClientMetrics - override fun install(ctx: InstallationContext) { - HttpUrlConnectionSingletons.configure(this, ctx.openTelemetry) + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + HttpUrlConnectionSingletons.configure(this, openTelemetryRum.openTelemetry) } /** diff --git a/instrumentation/network/api/network.api b/instrumentation/network/api/network.api index 52d96e57c..9b669df32 100644 --- a/instrumentation/network/api/network.api +++ b/instrumentation/network/api/network.api @@ -9,7 +9,7 @@ public final class io/opentelemetry/android/instrumentation/network/NetworkChang public fun ()V public final fun addAttributesExtractor (Lio/opentelemetry/android/instrumentation/network/NetworkAttributesExtractor;)Lio/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation; public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.kt b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.kt index 5b2ff1cec..a620a4877 100644 --- a/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.kt +++ b/instrumentation/network/src/main/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentation.kt @@ -5,10 +5,11 @@ package io.opentelemetry.android.instrumentation.network +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.internal.services.Services.Companion.get import io.opentelemetry.api.common.AttributesBuilder @@ -31,20 +32,20 @@ class NetworkChangeInstrumentation : AndroidInstrumentation { return this } - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { additionalAttributeExtractors.add(NetworkChangeAttributesExtractor()) - val services = get(ctx.context) + val services = get(context) val listener = NetworkApplicationListener(services.currentNetworkProvider) - val logger = ctx.openTelemetry.logsBridge["io.opentelemetry.network"] + val logger = openTelemetryRum.openTelemetry.logsBridge["io.opentelemetry.network"] listener.startMonitoring(logger, additionalAttributeExtractors) services.appLifecycle.registerListener(listener) networkApplicationListener = listener } - override fun uninstall(ctx: InstallationContext) { + override fun uninstall(context: Context, openTelemetryRum: OpenTelemetryRum) { networkApplicationListener?.let { listener -> listener.stopMonitoring() - val services = get(ctx.context) + val services = get(context) services.appLifecycle.unregisterListener(listener) } networkApplicationListener = null diff --git a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentationTest.kt b/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentationTest.kt index 56bf8d176..b66b93a41 100644 --- a/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentationTest.kt +++ b/instrumentation/network/src/test/java/io/opentelemetry/android/instrumentation/network/NetworkChangeInstrumentationTest.kt @@ -15,10 +15,10 @@ import io.mockk.junit5.MockKExtension import io.mockk.mockk import io.mockk.slot import io.mockk.verify +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.common.internal.features.networkattributes.data.Carrier import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork import io.opentelemetry.android.common.internal.features.networkattributes.data.NetworkState -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.internal.services.Services import io.opentelemetry.android.internal.services.applifecycle.AppLifecycle import io.opentelemetry.android.internal.services.applifecycle.ApplicationStateListener @@ -57,7 +57,8 @@ class NetworkChangeInstrumentationTest { @Test fun networkAvailable_wifi() { val networkChangeListenerSlot = slot() - NetworkChangeInstrumentation().install(createInstallationContext()) + val (context, openTelemetryRum) = createTestDependencies() + NetworkChangeInstrumentation().install(context, openTelemetryRum) verify { currentNetworkProvider.addNetworkChangeListener(capture(networkChangeListenerSlot)) @@ -80,7 +81,8 @@ class NetworkChangeInstrumentationTest { @Test fun networkAvailable_cellular() { val networkChangeListenerSlot = slot() - NetworkChangeInstrumentation().install(createInstallationContext()) + val (context, openTelemetryRum) = createTestDependencies() + NetworkChangeInstrumentation().install(context, openTelemetryRum) verify { currentNetworkProvider.addNetworkChangeListener(capture(networkChangeListenerSlot)) @@ -115,7 +117,8 @@ class NetworkChangeInstrumentationTest { @Test fun networkLost() { val networkChangeListenerSlot = slot() - NetworkChangeInstrumentation().install(createInstallationContext()) + val (context, openTelemetryRum) = createTestDependencies() + NetworkChangeInstrumentation().install(context, openTelemetryRum) verify { currentNetworkProvider.addNetworkChangeListener(capture(networkChangeListenerSlot)) @@ -139,7 +142,8 @@ class NetworkChangeInstrumentationTest { fun noEventsPlease() { val networkChangeListenerSlot = slot() val appStateListener = slot() - NetworkChangeInstrumentation().install(createInstallationContext()) + val (context, openTelemetryRum) = createTestDependencies() + NetworkChangeInstrumentation().install(context, openTelemetryRum) verify { currentNetworkProvider.addNetworkChangeListener(capture(networkChangeListenerSlot)) @@ -178,16 +182,16 @@ class NetworkChangeInstrumentationTest { fun uninstall() { val networkChangeListenerSlot = slot() val appStateListenerSlot = slot() - val ctx = createInstallationContext() + val (context, openTelemetryRum) = createTestDependencies() val instrumentation = NetworkChangeInstrumentation() - instrumentation.install(ctx) + instrumentation.install(context, openTelemetryRum) verify { currentNetworkProvider.addNetworkChangeListener(capture(networkChangeListenerSlot)) appLifecycle.registerListener(capture(appStateListenerSlot)) } - instrumentation.uninstall(ctx) + instrumentation.uninstall(context, openTelemetryRum) verify { currentNetworkProvider.removeNetworkChangeListener(networkChangeListenerSlot.captured) @@ -197,10 +201,10 @@ class NetworkChangeInstrumentationTest { @Test fun uninstallBeforeInstall() { - val ctx = createInstallationContext() + val (context, openTelemetryRum) = createTestDependencies() val instrumentation = NetworkChangeInstrumentation() - instrumentation.uninstall(ctx) + instrumentation.uninstall(context, openTelemetryRum) verify(exactly = 0) { currentNetworkProvider.removeNetworkChangeListener(any()) @@ -208,17 +212,16 @@ class NetworkChangeInstrumentationTest { } } - private fun createInstallationContext(): InstallationContext { + private fun createTestDependencies(): Pair { val app = mockk() val services = mockk() every { services.currentNetworkProvider } returns currentNetworkProvider every { services.appLifecycle } returns appLifecycle Services.set(services) - return InstallationContext( - app, - otelTesting.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk() + every { openTelemetryRum.openTelemetry } returns otelTesting.openTelemetry + every { openTelemetryRum.sessionProvider } returns mockk() + every { openTelemetryRum.clock } returns Clock.getDefault() + return Pair(app, openTelemetryRum) } } diff --git a/instrumentation/okhttp3-websocket/library/api/library.api b/instrumentation/okhttp3-websocket/library/api/library.api index 259a1f94f..2582294eb 100644 --- a/instrumentation/okhttp3-websocket/library/api/library.api +++ b/instrumentation/okhttp3-websocket/library/api/library.api @@ -1,13 +1,13 @@ public final class io/opentelemetry/instrumentation/library/okhttp/websocket/internal/OkHttpWebsocketInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } public final class io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper : okhttp3/WebSocketListener { public static final field Companion Lio/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper$Companion; public fun (Lokhttp3/WebSocketListener;)V - public static final fun configure (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public static final fun configure (Lio/opentelemetry/api/OpenTelemetry;)V public fun onClosed (Lokhttp3/WebSocket;ILjava/lang/String;)V public fun onFailure (Lokhttp3/WebSocket;Ljava/lang/Throwable;Lokhttp3/Response;)V public fun onMessage (Lokhttp3/WebSocket;Ljava/lang/String;)V @@ -16,7 +16,7 @@ public final class io/opentelemetry/instrumentation/library/okhttp/websocket/int } public final class io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper$Companion { - public final fun configure (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public final fun configure (Lio/opentelemetry/api/OpenTelemetry;)V public final fun getMESSAGE_SIZE ()Lio/opentelemetry/api/common/AttributeKey; public final fun getMESSAGE_TYPE ()Lio/opentelemetry/api/common/AttributeKey; } diff --git a/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/OkHttpWebsocketInstrumentation.kt b/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/OkHttpWebsocketInstrumentation.kt index ecb4a9937..0aa4046b3 100644 --- a/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/OkHttpWebsocketInstrumentation.kt +++ b/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/OkHttpWebsocketInstrumentation.kt @@ -5,14 +5,15 @@ package io.opentelemetry.instrumentation.library.okhttp.websocket.internal +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext @AutoService(AndroidInstrumentation::class) class OkHttpWebsocketInstrumentation : AndroidInstrumentation { - override fun install(ctx: InstallationContext) { - WebsocketListenerWrapper.configure(ctx) + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + WebsocketListenerWrapper.configure(openTelemetryRum.openTelemetry) } override val name: String = "okhttp-websocket" diff --git a/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper.kt b/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper.kt index 89ad16ae8..fdc80940a 100644 --- a/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper.kt +++ b/instrumentation/okhttp3-websocket/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapper.kt @@ -5,7 +5,6 @@ package io.opentelemetry.instrumentation.library.okhttp.websocket.internal -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.api.OpenTelemetry import io.opentelemetry.api.common.AttributeKey import io.opentelemetry.api.common.Attributes @@ -118,9 +117,9 @@ class WebsocketListenerWrapper( .build() @JvmStatic - fun configure(context: InstallationContext) { + fun configure(openTelemetry: OpenTelemetry) { logger = - context.openTelemetry.logsBridge + openTelemetry.logsBridge .loggerBuilder(SCOPE) .build() } diff --git a/instrumentation/okhttp3-websocket/library/src/test/kotlin/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapperTest.kt b/instrumentation/okhttp3-websocket/library/src/test/kotlin/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapperTest.kt index dff91217a..67279f958 100644 --- a/instrumentation/okhttp3-websocket/library/src/test/kotlin/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapperTest.kt +++ b/instrumentation/okhttp3-websocket/library/src/test/kotlin/io/opentelemetry/instrumentation/library/okhttp/websocket/internal/WebsocketListenerWrapperTest.kt @@ -8,9 +8,7 @@ package io.opentelemetry.instrumentation.library.okhttp.websocket.internal import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension -import io.mockk.mockk import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.instrumentation.library.okhttp.websocket.internal.WebsocketListenerWrapper.Companion.MESSAGE_SIZE import io.opentelemetry.instrumentation.library.okhttp.websocket.internal.WebsocketListenerWrapper.Companion.MESSAGE_TYPE import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat @@ -56,9 +54,7 @@ internal class WebsocketListenerWrapperTest { @BeforeEach fun setup() { every { webSocket.request() } returns testRequest - val installationContext = mockk() - every { installationContext.openTelemetry } returns otelTesting.openTelemetry - WebsocketListenerWrapper.configure(installationContext) + WebsocketListenerWrapper.configure(otelTesting.openTelemetry) wrapper = WebsocketListenerWrapper(delegateListener) } diff --git a/instrumentation/okhttp3/library/api/library.api b/instrumentation/okhttp3/library/api/library.api index e047f9207..d68d60ef9 100644 --- a/instrumentation/okhttp3/library/api/library.api +++ b/instrumentation/okhttp3/library/api/library.api @@ -7,7 +7,7 @@ public final class io/opentelemetry/instrumentation/library/okhttp/OkHttpInstrum public final fun getCapturedResponseHeaders ()Ljava/util/List; public final fun getKnownMethods ()Ljava/util/Set; public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setCapturedRequestHeaders (Ljava/util/List;)V public final fun setCapturedResponseHeaders (Ljava/util/List;)V public final fun setEmitExperimentalHttpClientTelemetry (Z)V diff --git a/instrumentation/okhttp3/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/OkHttpInstrumentation.kt b/instrumentation/okhttp3/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/OkHttpInstrumentation.kt index 45cf5d9fe..0987b4423 100644 --- a/instrumentation/okhttp3/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/OkHttpInstrumentation.kt +++ b/instrumentation/okhttp3/library/src/main/java/io/opentelemetry/instrumentation/library/okhttp/OkHttpInstrumentation.kt @@ -5,9 +5,10 @@ package io.opentelemetry.instrumentation.library.okhttp +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor import io.opentelemetry.instrumentation.api.internal.HttpConstants import io.opentelemetry.instrumentation.library.okhttp.internal.OkHttpSingletons @@ -103,8 +104,8 @@ class OkHttpInstrumentation : AndroidInstrumentation { fun emitExperimentalHttpClientTelemetry(): Boolean = emitExperimentalHttpClientTelemetry - override fun install(ctx: InstallationContext) { - OkHttpSingletons.configure(this, ctx.openTelemetry) + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + OkHttpSingletons.configure(this, openTelemetryRum.openTelemetry) } override val name: String = "okhttp" diff --git a/instrumentation/screen-orientation/api/screen-orientation.api b/instrumentation/screen-orientation/api/screen-orientation.api index ea369520c..5d5efbdf3 100644 --- a/instrumentation/screen-orientation/api/screen-orientation.api +++ b/instrumentation/screen-orientation/api/screen-orientation.api @@ -1,7 +1,7 @@ public final class io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/screen-orientation/src/main/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentation.kt b/instrumentation/screen-orientation/src/main/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentation.kt index 691d14b92..bce244ff9 100644 --- a/instrumentation/screen-orientation/src/main/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentation.kt +++ b/instrumentation/screen-orientation/src/main/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentation.kt @@ -5,9 +5,10 @@ package io.opentelemetry.android.instrumentation.screenorientation +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext /** * An Android instrumentation module that installs and manages [ScreenOrientationDetector]. @@ -16,20 +17,20 @@ import io.opentelemetry.android.instrumentation.InstallationContext class ScreenOrientationInstrumentation : AndroidInstrumentation { private var detector: ScreenOrientationDetector? = null - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { val logger = - ctx.openTelemetry + openTelemetryRum.openTelemetry .logsBridge .loggerBuilder("io.opentelemetry.$name") .build() - val applicationContext = ctx.context.applicationContext + val applicationContext = context.applicationContext detector = ScreenOrientationDetector(applicationContext, logger) applicationContext.registerComponentCallbacks(detector) } - override fun uninstall(ctx: InstallationContext) { + override fun uninstall(context: Context, openTelemetryRum: OpenTelemetryRum) { detector?.let { - ctx.context.applicationContext.unregisterComponentCallbacks(it) + context.applicationContext.unregisterComponentCallbacks(it) } } diff --git a/instrumentation/screen-orientation/src/test/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentationTest.kt b/instrumentation/screen-orientation/src/test/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentationTest.kt index a9d2ae14c..792f2ac94 100644 --- a/instrumentation/screen-orientation/src/test/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentationTest.kt +++ b/instrumentation/screen-orientation/src/test/java/io/opentelemetry/android/instrumentation/screenorientation/ScreenOrientationInstrumentationTest.kt @@ -5,44 +5,48 @@ package io.opentelemetry.android.instrumentation.screenorientation +import android.app.Application +import io.mockk.every import io.mockk.mockk import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext +import io.opentelemetry.android.OpenTelemetryRum import org.junit.Before import org.junit.Test class ScreenOrientationInstrumentationTest { private lateinit var sut: ScreenOrientationInstrumentation - private val installationContext = mockk(relaxed = true) + private val context = mockk(relaxed = true) + private val openTelemetryRum = mockk(relaxed = true) @Before fun setup() { sut = ScreenOrientationInstrumentation() + every { context.applicationContext } returns context } @Test fun `should register component callbacks on install`() { // when - sut.install(installationContext) + sut.install(context, openTelemetryRum) // then verify { - installationContext.context.applicationContext.registerComponentCallbacks(any()) + context.registerComponentCallbacks(any()) } } @Test fun `should unregister component callbacks on uninstall`() { // given - sut.install(installationContext) + sut.install(context, openTelemetryRum) // when - sut.uninstall(installationContext) + sut.uninstall(context, openTelemetryRum) // then verify { - installationContext.context.applicationContext.unregisterComponentCallbacks(any()) + context.unregisterComponentCallbacks(any()) } } } diff --git a/instrumentation/sessions/api/sessions.api b/instrumentation/sessions/api/sessions.api index 7b464f5c4..b8f92fd8e 100644 --- a/instrumentation/sessions/api/sessions.api +++ b/instrumentation/sessions/api/sessions.api @@ -1,6 +1,6 @@ public final class io/opentelemetry/android/instrumentation/sessions/SessionInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/sessions/src/main/kotlin/io/opentelemetry/android/instrumentation/sessions/SessionInstrumentation.kt b/instrumentation/sessions/src/main/kotlin/io/opentelemetry/android/instrumentation/sessions/SessionInstrumentation.kt index 3f3439535..76b989cf2 100644 --- a/instrumentation/sessions/src/main/kotlin/io/opentelemetry/android/instrumentation/sessions/SessionInstrumentation.kt +++ b/instrumentation/sessions/src/main/kotlin/io/opentelemetry/android/instrumentation/sessions/SessionInstrumentation.kt @@ -5,21 +5,22 @@ package io.opentelemetry.android.instrumentation.sessions +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.session.SessionPublisher @AutoService(AndroidInstrumentation::class) class SessionInstrumentation : AndroidInstrumentation { override val name: String = "session" - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { val eventLogger = - ctx.openTelemetry.logsBridge + openTelemetryRum.openTelemetry.logsBridge .loggerBuilder("otel.session") .build() - val sessionProvider = ctx.sessionProvider + val sessionProvider = openTelemetryRum.sessionProvider if (sessionProvider is SessionPublisher) { sessionProvider.addObserver(SessionIdEventSender(eventLogger)) } diff --git a/instrumentation/slowrendering/api/slowrendering.api b/instrumentation/slowrendering/api/slowrendering.api index f398c6c60..9ce47cf17 100644 --- a/instrumentation/slowrendering/api/slowrendering.api +++ b/instrumentation/slowrendering/api/slowrendering.api @@ -3,8 +3,8 @@ public final class io/opentelemetry/android/instrumentation/slowrendering/SlowRe public final fun enableDeprecatedZeroDurationSpan ()Lio/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation; public final fun enableVerboseDebugLogging ()Lio/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation; public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V public final fun setSlowRenderingDetectionPollInterval (Ljava/time/Duration;)Lio/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation; - public fun uninstall (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun uninstall (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/slowrendering/src/main/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation.kt b/instrumentation/slowrendering/src/main/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation.kt index 647ef8d5e..67fbf2424 100644 --- a/instrumentation/slowrendering/src/main/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation.kt +++ b/instrumentation/slowrendering/src/main/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentation.kt @@ -5,12 +5,14 @@ package io.opentelemetry.android.instrumentation.slowrendering +import android.app.Application +import android.content.Context import android.os.Build import android.util.Log import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.common.RumConstants import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import java.time.Duration /** @@ -64,7 +66,7 @@ class SlowRenderingInstrumentation : AndroidInstrumentation { return this } - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { Log.w( RumConstants.OTEL_RUM_LOG_TAG, @@ -80,22 +82,22 @@ class SlowRenderingInstrumentation : AndroidInstrumentation { return } - val logger = ctx.openTelemetry.logsBridge.get("app.jank") + val logger = openTelemetryRum.openTelemetry.logsBridge.get("app.jank") var jankReporter: JankReporter = EventJankReporter(logger, SLOW_THRESHOLD_MS / 1000.0, debugVerbose) jankReporter = jankReporter.combine(EventJankReporter(logger, FROZEN_THRESHOLD_MS / 1000.0, debugVerbose)) if (useDeprecatedSpan) { - val tracer = ctx.openTelemetry.getTracer("io.opentelemetry.slow-rendering") + val tracer = openTelemetryRum.openTelemetry.getTracer("io.opentelemetry.slow-rendering") jankReporter = jankReporter.combine(SpanBasedJankReporter(tracer)) } detector = SlowRenderListener(jankReporter, slowRenderingDetectionPollInterval) - ctx.application?.registerActivityLifecycleCallbacks(detector) + (context as? Application)?.registerActivityLifecycleCallbacks(detector) detector?.start() } - override fun uninstall(ctx: InstallationContext) { + override fun uninstall(context: Context, openTelemetryRum: OpenTelemetryRum) { if (detector == null) { Log.w( RumConstants.OTEL_RUM_LOG_TAG, @@ -103,7 +105,7 @@ class SlowRenderingInstrumentation : AndroidInstrumentation { ) return } - ctx.application?.unregisterActivityLifecycleCallbacks(detector) + (context as? Application)?.unregisterActivityLifecycleCallbacks(detector) detector?.shutdown() detector = null } diff --git a/instrumentation/slowrendering/src/test/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentationTest.kt b/instrumentation/slowrendering/src/test/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentationTest.kt index bbbc8479d..115fa41f7 100644 --- a/instrumentation/slowrendering/src/test/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentationTest.kt +++ b/instrumentation/slowrendering/src/test/java/io/opentelemetry/android/instrumentation/slowrendering/SlowRenderingInstrumentationTest.kt @@ -16,17 +16,17 @@ import io.mockk.just import io.mockk.mockk import io.mockk.slot import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.api.logs.Logger import io.opentelemetry.api.logs.LoggerProvider import io.opentelemetry.sdk.OpenTelemetrySdk import io.opentelemetry.sdk.common.Clock +import java.time.Duration import org.assertj.core.api.Assertions.assertThat import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.annotation.Config -import java.time.Duration @RunWith(AndroidJUnit4::class) class SlowRenderingInstrumentationTest { @@ -78,8 +78,11 @@ class SlowRenderingInstrumentationTest { @Config(sdk = [23]) @Test fun `Not installing instrumentation on devices with API level lower than 24`() { - val ctx = InstallationContext(application, openTelemetry, mockk(), Clock.getDefault()) - slowRenderingInstrumentation.install(ctx) + val openTelemetryRum = mockk() + every { openTelemetryRum.openTelemetry } returns openTelemetry + every { openTelemetryRum.sessionProvider } returns mockk() + every { openTelemetryRum.clock } returns Clock.getDefault() + slowRenderingInstrumentation.install(application, openTelemetryRum) verify { application wasNot Called @@ -95,8 +98,11 @@ class SlowRenderingInstrumentationTest { val capturedListener = slot() every { openTelemetry.getTracer(any()) }.returns(mockk()) every { application.registerActivityLifecycleCallbacks(any()) } just Runs - val ctx = InstallationContext(application, openTelemetry, mockk(), Clock.getDefault()) - slowRenderingInstrumentation.install(ctx) + val openTelemetryRum = mockk() + every { openTelemetryRum.openTelemetry } returns openTelemetry + every { openTelemetryRum.sessionProvider } returns mockk() + every { openTelemetryRum.clock } returns Clock.getDefault() + slowRenderingInstrumentation.install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(capturedListener)) } } @@ -107,9 +113,12 @@ class SlowRenderingInstrumentationTest { val capturedListener = slot() every { openTelemetry.getTracer(any()) }.returns(mockk()) every { application.registerActivityLifecycleCallbacks(any()) } just Runs - val ctx = InstallationContext(application, openTelemetry, mockk(), Clock.getDefault()) + val openTelemetryRum = mockk() + every { openTelemetryRum.openTelemetry } returns openTelemetry + every { openTelemetryRum.sessionProvider } returns mockk() + every { openTelemetryRum.clock } returns Clock.getDefault() @Suppress("DEPRECATION") - slowRenderingInstrumentation.enableDeprecatedZeroDurationSpan().install(ctx) + slowRenderingInstrumentation.enableDeprecatedZeroDurationSpan().install(application, openTelemetryRum) verify { openTelemetry.getTracer("io.opentelemetry.slow-rendering") } verify { application.registerActivityLifecycleCallbacks(capture(capturedListener)) } diff --git a/instrumentation/startup/api/startup.api b/instrumentation/startup/api/startup.api index c2fe237fa..f19a83ccc 100644 --- a/instrumentation/startup/api/startup.api +++ b/instrumentation/startup/api/startup.api @@ -15,6 +15,6 @@ public final class io/opentelemetry/android/instrumentation/startup/SdkInitializ public final class io/opentelemetry/android/instrumentation/startup/StartupInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/startup/src/main/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentation.kt b/instrumentation/startup/src/main/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentation.kt index b2b726805..8fac5d25f 100644 --- a/instrumentation/startup/src/main/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentation.kt +++ b/instrumentation/startup/src/main/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentation.kt @@ -5,19 +5,20 @@ package io.opentelemetry.android.instrumentation.startup +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext import io.opentelemetry.android.internal.initialization.InitializationEvents @AutoService(AndroidInstrumentation::class) class StartupInstrumentation : AndroidInstrumentation { override val name: String = "startup" - override fun install(ctx: InstallationContext) { + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { val events = InitializationEvents.get() if (events is SdkInitializationEvents) { - events.finish(ctx.openTelemetry) + events.finish(openTelemetryRum.openTelemetry) } } } diff --git a/instrumentation/startup/src/test/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentationTest.kt b/instrumentation/startup/src/test/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentationTest.kt index 24cbf9cec..4c457405f 100644 --- a/instrumentation/startup/src/test/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentationTest.kt +++ b/instrumentation/startup/src/test/java/io/opentelemetry/android/instrumentation/startup/StartupInstrumentationTest.kt @@ -12,7 +12,7 @@ import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.internal.initialization.InitializationEvents import io.opentelemetry.sdk.common.Clock import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension @@ -46,7 +46,7 @@ class StartupInstrumentationTest { every { sdkInitializationEvents.finish(any()) } just Runs InitializationEvents.set(sdkInitializationEvents) - instrumentation.install(makeContext()) + instrumentation.install(makeContext(), makeOpenTelemetryRum()) verify { sdkInitializationEvents.finish(otelTesting.openTelemetry) @@ -58,16 +58,17 @@ class StartupInstrumentationTest { val initializationEvents = mockk() InitializationEvents.set(initializationEvents) - instrumentation.install(makeContext()) + instrumentation.install(makeContext(), makeOpenTelemetryRum()) verify { initializationEvents wasNot Called } } - private fun makeContext(): InstallationContext = - InstallationContext( - mockk(), - otelTesting.openTelemetry, - mockk(), - Clock.getDefault(), - ) + private fun makeContext(): Application = mockk() + + private fun makeOpenTelemetryRum(): OpenTelemetryRum = + mockk { + every { openTelemetry } returns otelTesting.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } } diff --git a/instrumentation/view-click/api/view-click.api b/instrumentation/view-click/api/view-click.api index 9ad8619b6..c31368ec2 100644 --- a/instrumentation/view-click/api/view-click.api +++ b/instrumentation/view-click/api/view-click.api @@ -1,6 +1,6 @@ public final class io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation : io/opentelemetry/android/instrumentation/AndroidInstrumentation { public fun ()V public fun getName ()Ljava/lang/String; - public fun install (Lio/opentelemetry/android/instrumentation/InstallationContext;)V + public fun install (Landroid/content/Context;Lio/opentelemetry/android/OpenTelemetryRum;)V } diff --git a/instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation.kt b/instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation.kt index ef1e9b785..8ff2bbef8 100644 --- a/instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation.kt +++ b/instrumentation/view-click/src/main/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentation.kt @@ -5,19 +5,21 @@ package io.opentelemetry.android.instrumentation.view.click +import android.app.Application +import android.content.Context import com.google.auto.service.AutoService +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.AndroidInstrumentation -import io.opentelemetry.android.instrumentation.InstallationContext @AutoService(AndroidInstrumentation::class) class ViewClickInstrumentation : AndroidInstrumentation { override val name: String = "view.click" - override fun install(ctx: InstallationContext) { - ctx.application?.registerActivityLifecycleCallbacks( + override fun install(context: Context, openTelemetryRum: OpenTelemetryRum) { + (context as? Application)?.registerActivityLifecycleCallbacks( ViewClickActivityCallback( ViewClickEventGenerator( - ctx.openTelemetry + openTelemetryRum.openTelemetry .logsBridge .loggerBuilder("io.opentelemetry.android.instrumentation.view.click") .build(), diff --git a/instrumentation/view-click/src/test/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentationTest.kt b/instrumentation/view-click/src/test/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentationTest.kt index 8f097d3d0..67f14b22d 100644 --- a/instrumentation/view-click/src/test/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentationTest.kt +++ b/instrumentation/view-click/src/test/kotlin/io/opentelemetry/android/instrumentation/view/click/ViewClickInstrumentationTest.kt @@ -22,7 +22,7 @@ import io.mockk.mockk import io.mockk.mockkClass import io.mockk.slot import io.mockk.verify -import io.opentelemetry.android.instrumentation.InstallationContext +import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.instrumentation.view.click.internal.APP_SCREEN_CLICK_EVENT_NAME import io.opentelemetry.android.instrumentation.view.click.internal.VIEW_CLICK_EVENT_NAME import io.opentelemetry.android.session.SessionProvider @@ -64,13 +64,11 @@ class ViewClickInstrumentationTest { @Test fun capture_view_click() { - val installationContext = - InstallationContext( - application, - openTelemetryRule.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk { + every { openTelemetry } returns openTelemetryRule.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } val callbackCapturingSlot = slot() every { window.callback } returns callback @@ -79,7 +77,7 @@ class ViewClickInstrumentationTest { every { activity.window } returns window every { application.registerActivityLifecycleCallbacks(any()) } returns Unit - ViewClickInstrumentation().install(installationContext) + ViewClickInstrumentation().install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(callbackCapturingSlot)) @@ -127,13 +125,11 @@ class ViewClickInstrumentationTest { @Test fun capture_view_click_in_viewGroup() { - val installationContext = - InstallationContext( - application, - openTelemetryRule.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk { + every { openTelemetry } returns openTelemetryRule.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } val callbackCapturingSlot = slot() every { window.callback } returns callback @@ -142,7 +138,7 @@ class ViewClickInstrumentationTest { every { activity.window } returns window every { application.registerActivityLifecycleCallbacks(any()) } returns Unit - ViewClickInstrumentation().install(installationContext) + ViewClickInstrumentation().install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(callbackCapturingSlot)) } @@ -195,13 +191,11 @@ class ViewClickInstrumentationTest { @Test fun not_captured_view_click_in_viewGroup() { - val installationContext = - InstallationContext( - application, - openTelemetryRule.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk { + every { openTelemetry } returns openTelemetryRule.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } val callbackCapturingSlot = slot() every { window.callback } returns callback @@ -210,7 +204,7 @@ class ViewClickInstrumentationTest { every { activity.window } returns window every { application.registerActivityLifecycleCallbacks(any()) } returns Unit - ViewClickInstrumentation().install(installationContext) + ViewClickInstrumentation().install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(callbackCapturingSlot)) } @@ -253,13 +247,11 @@ class ViewClickInstrumentationTest { @Test fun not_captured_view_click_for_down_event() { - val installationContext = - InstallationContext( - application, - openTelemetryRule.openTelemetry, - mockk(), - Clock.getDefault(), - ) + val openTelemetryRum = mockk { + every { openTelemetry } returns openTelemetryRule.openTelemetry + every { sessionProvider } returns mockk() + every { clock } returns Clock.getDefault() + } val callbackCapturingSlot = slot() every { window.callback } returns callback @@ -268,7 +260,7 @@ class ViewClickInstrumentationTest { every { activity.window } returns window every { application.registerActivityLifecycleCallbacks(any()) } returns Unit - ViewClickInstrumentation().install(installationContext) + ViewClickInstrumentation().install(application, openTelemetryRum) verify { application.registerActivityLifecycleCallbacks(capture(callbackCapturingSlot)) } diff --git a/session/build.gradle.kts b/session/build.gradle.kts index dfed3ca63..5908eabf2 100644 --- a/session/build.gradle.kts +++ b/session/build.gradle.kts @@ -15,6 +15,5 @@ android { dependencies { api(platform(libs.opentelemetry.platform.alpha)) // Required for sonatype publishing - implementation(project(":agent-api")) implementation(libs.opentelemetry.sdk) }