Skip to content

Commit 1a5bded

Browse files
authored
Instrumentation api ehnancement (#1645)
* AndroidInstrumentation changes * Clean up * Clean up session id getter * Enhancing rum init * Rebase from main
1 parent 143163e commit 1a5bded

59 files changed

Lines changed: 306 additions & 304 deletions

File tree

Some content is hidden

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

agent-api/api/agent-api.api

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
public abstract interface class io/opentelemetry/android/OpenTelemetryRum {
22
public abstract fun emitEvent (Ljava/lang/String;Ljava/lang/String;Lio/opentelemetry/api/common/Attributes;)V
33
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
4+
public abstract fun getClock ()Lio/opentelemetry/sdk/common/Clock;
45
public abstract fun getOpenTelemetry ()Lio/opentelemetry/api/OpenTelemetry;
5-
public abstract fun getRumSessionId ()Ljava/lang/String;
6+
public abstract fun getSessionProvider ()Lio/opentelemetry/android/session/SessionProvider;
67
public abstract fun shutdown ()V
78
}
89

agent-api/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ android {
1515

1616
dependencies {
1717
api(platform(libs.opentelemetry.platform.alpha))
18-
api(libs.opentelemetry.api)
18+
api(libs.opentelemetry.sdk)
19+
api(project(":session"))
1920
}

agent-api/src/main/java/io/opentelemetry/android/OpenTelemetryRum.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
package io.opentelemetry.android
77

8+
import io.opentelemetry.android.session.SessionProvider
89
import io.opentelemetry.api.OpenTelemetry
910
import io.opentelemetry.api.common.Attributes
11+
import io.opentelemetry.sdk.common.Clock
1012

1113
/**
1214
* Entrypoint for the OpenTelemetry Real User Monitoring library for Android.
@@ -19,11 +21,14 @@ interface OpenTelemetryRum {
1921
val openTelemetry: OpenTelemetry
2022

2123
/**
22-
* Get the client session ID associated with this instance of the RUM instrumentation library.
23-
* Note: this value will change throughout the lifetime of an application instance, so it is
24-
* recommended that you do not cache this value, but always retrieve it from here when needed.
24+
* Get the [SessionProvider] associated with this instance.
2525
*/
26-
fun getRumSessionId(): String
26+
val sessionProvider: SessionProvider
27+
28+
/**
29+
* Get the [Clock] used by this instance for time-related operations.
30+
*/
31+
val clock: Clock
2732

2833
/**
2934
* Emits an event with the specified name, body, and attributes.

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@
55

66
package io.opentelemetry.android
77

8+
import io.opentelemetry.android.session.SessionProvider
89
import io.opentelemetry.api.OpenTelemetry
910
import io.opentelemetry.api.common.Attributes
10-
import io.opentelemetry.api.trace.TraceId
11+
import io.opentelemetry.sdk.common.Clock
1112

1213
internal object NoopOpenTelemetryRum : OpenTelemetryRum {
1314
override val openTelemetry: OpenTelemetry = OpenTelemetry.noop()
14-
15-
override fun getRumSessionId(): String {
16-
// RUM session.id has the same format as traceId
17-
return TraceId.getInvalid()
18-
}
15+
override val sessionProvider: SessionProvider = SessionProvider.getNoop()
16+
override val clock: Clock = Clock.getDefault()
1917

2018
override fun emitEvent(
2119
eventName: String,

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@ import io.opentelemetry.api.OpenTelemetry
1010
import io.opentelemetry.api.common.Attributes
1111
import io.opentelemetry.api.logs.Logger
1212
import io.opentelemetry.sdk.OpenTelemetrySdk
13+
import io.opentelemetry.sdk.common.Clock
1314

1415
internal class OpenTelemetryRumImpl(
1516
private val openTelemetrySdk: OpenTelemetrySdk,
16-
private val sessionProvider: SessionProvider,
17-
private val onShutdown: Runnable,
17+
override val sessionProvider: SessionProvider,
18+
override val clock: Clock,
1819
) : OpenTelemetryRum {
20+
var onShutdown: Runnable = Runnable {}
1921
private val logger: Logger =
2022
openTelemetrySdk.logsBridge
2123
.loggerBuilder("io.opentelemetry.rum.events")
2224
.build()
2325

2426
override val openTelemetry: OpenTelemetry = openTelemetrySdk
2527

26-
override fun getRumSessionId(): String = sessionProvider.getSessionId()
27-
2828
override fun emitEvent(
2929
eventName: String,
3030
body: String,

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
package io.opentelemetry.android
77

8+
import android.app.Application
89
import android.content.Context
910
import android.util.Log
1011
import io.opentelemetry.android.common.RumConstants
1112
import io.opentelemetry.android.config.OtelRumConfig
1213
import io.opentelemetry.android.instrumentation.AndroidInstrumentation
1314
import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader
14-
import io.opentelemetry.android.instrumentation.InstallationContext
1515
import io.opentelemetry.android.session.SessionProvider
1616
import io.opentelemetry.sdk.OpenTelemetrySdk
1717
import io.opentelemetry.sdk.common.Clock
@@ -55,8 +55,7 @@ class SdkPreconfiguredRumBuilder internal constructor(
5555
* @return A new [io.opentelemetry.android.OpenTelemetryRum] instance.
5656
*/
5757
fun build(): OpenTelemetryRum {
58-
val ctx = InstallationContext(context, sdk, sessionProvider, clock)
59-
if (ctx.application == null) {
58+
if ((context as? Application) == null) {
6059
Log.w(
6160
RumConstants.OTEL_RUM_LOG_TAG,
6261
"Cannot retrieve applicationContext. This indicates the OpenTelemetry SDK was " +
@@ -67,18 +66,18 @@ class SdkPreconfiguredRumBuilder internal constructor(
6766
}
6867

6968
val enabledInstrumentations = getEnabledInstrumentations()
70-
val onShutdown: () -> Unit = {
69+
val openTelemetryRum = OpenTelemetryRumImpl(sdk, sessionProvider, clock)
70+
openTelemetryRum.onShutdown = Runnable {
7171
for (instrumentation in enabledInstrumentations) {
72-
instrumentation.uninstall(ctx)
72+
instrumentation.uninstall(context, openTelemetryRum)
7373
}
7474
sdk.shutdown()
7575
onShutdown.run()
7676
}
77-
val openTelemetryRum = OpenTelemetryRumImpl(sdk, sessionProvider, onShutdown)
7877

7978
// Install instrumentations
8079
for (instrumentation in enabledInstrumentations) {
81-
instrumentation.install(ctx)
80+
instrumentation.install(context, openTelemetryRum)
8281
}
8382

8483
// Install crash flush handler after instrumentations so it wraps any

core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class OpenTelemetryRumBuilderTest {
138138
.await()
139139
.atMost(Duration.ofSeconds(5))
140140
.untilAsserted {
141-
val sessionId = openTelemetryRum.getRumSessionId()
141+
val sessionId = openTelemetryRum.sessionProvider.getSessionId()
142142
openTelemetryRum
143143
.openTelemetry
144144
.getTracer("test")
@@ -193,7 +193,7 @@ class OpenTelemetryRumBuilderTest {
193193
.hasAttributesSatisfyingExactly(
194194
OpenTelemetryAssertions.equalTo(
195195
SessionIncubatingAttributes.SESSION_ID,
196-
openTelemetryRum.getRumSessionId(),
196+
openTelemetryRum.sessionProvider.getSessionId(),
197197
),
198198
OpenTelemetryAssertions.equalTo(SCREEN_NAME_KEY, CUR_SCREEN_NAME),
199199
OpenTelemetryAssertions.equalTo(AttributeKey.stringKey("mega"), "hit"),
@@ -307,8 +307,8 @@ class OpenTelemetryRumBuilderTest {
307307
(builder.instrumentationLoader as AndroidInstrumentationLoaderImpl).registerForTest(classpathInstrumentation)
308308
builder.build()
309309

310-
verify(exactly = 1) { localInstrumentation.install(any()) }
311-
verify(exactly = 1) { classpathInstrumentation.install(any()) }
310+
verify(exactly = 1) { localInstrumentation.install(any(), any()) }
311+
verify(exactly = 1) { classpathInstrumentation.install(any(), any()) }
312312
}
313313

314314
@Test
@@ -332,8 +332,8 @@ class OpenTelemetryRumBuilderTest {
332332
(builder.instrumentationLoader as AndroidInstrumentationLoaderImpl).registerForTest(classpathInstrumentation)
333333
builder.build()
334334

335-
verify(exactly = 1) { localInstrumentation.install(any()) }
336-
verify(exactly = 0) { classpathInstrumentation.install(any()) }
335+
verify(exactly = 1) { localInstrumentation.install(any(), any()) }
336+
verify(exactly = 0) { classpathInstrumentation.install(any(), any()) }
337337
}
338338

339339
@Test
@@ -467,7 +467,7 @@ class OpenTelemetryRumBuilderTest {
467467
OpenTelemetryAssertions.equalTo(SCREEN_NAME_KEY, CUR_SCREEN_NAME),
468468
OpenTelemetryAssertions.equalTo(
469469
SessionIncubatingAttributes.SESSION_ID,
470-
rum.getRumSessionId(),
470+
rum.sessionProvider.getSessionId(),
471471
),
472472
).hasSeverity(Severity.FATAL3)
473473
}
@@ -631,7 +631,7 @@ class OpenTelemetryRumBuilderTest {
631631
.hasAttributes(
632632
Attributes
633633
.builder()
634-
.put(SessionIncubatingAttributes.SESSION_ID, rum.getRumSessionId())
634+
.put(SessionIncubatingAttributes.SESSION_ID, rum.sessionProvider.getSessionId())
635635
.put("someGlobalKey", "someGlobalValue")
636636
.put("localAttrKey", "localAttrValue")
637637
.put(SCREEN_NAME_KEY, CUR_SCREEN_NAME)

core/src/test/java/io/opentelemetry/android/OpenTelemetryRumNoopTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal class OpenTelemetryRumNoopTest {
1414
fun testNoopOpenTelemetryRum() {
1515
val noop = RumBuilder.noop()
1616
assertEquals(OpenTelemetry.noop(), noop.openTelemetry)
17-
assertEquals("00000000000000000000000000000000", noop.getRumSessionId())
17+
assertEquals("", noop.sessionProvider.getSessionId())
1818

1919
// assert no exceptions thrown
2020
noop.emitEvent("event")

core/src/test/java/io/opentelemetry/android/instrumentation/AndroidInstrumentationLoaderImplTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class AndroidInstrumentationLoaderImplTest {
2525
assertThat(instrumentation).isNotNull()
2626
assertThat(checkNotNull(instrumentation).installed).isFalse()
2727

28-
instrumentation.install(mockk())
28+
instrumentation.install(mockk(), mockk(relaxed = true))
2929

3030
assertThat(checkNotNull(loader.getByType(TestAndroidInstrumentation::class.java)).installed).isTrue()
3131
}

core/src/test/java/io/opentelemetry/android/instrumentation/TestAndroidInstrumentation.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,26 @@
55

66
package io.opentelemetry.android.instrumentation
77

8+
import android.content.Context
9+
import io.opentelemetry.android.OpenTelemetryRum
10+
811
class TestAndroidInstrumentation : AndroidInstrumentation {
912
override val name: String = "test"
1013

1114
var installed = false
1215
private set
1316

14-
override fun install(ctx: InstallationContext) {
17+
override fun install(
18+
context: Context,
19+
openTelemetryRum: OpenTelemetryRum,
20+
) {
1521
installed = true
1622
}
1723

18-
override fun uninstall(ctx: InstallationContext) {
24+
override fun uninstall(
25+
context: Context,
26+
openTelemetryRum: OpenTelemetryRum,
27+
) {
1928
installed = false
2029
}
2130
}

0 commit comments

Comments
 (0)