From 222de61e65127fc469616c0f04945a2b17aa35aa Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:12:31 +0200 Subject: [PATCH 1/8] Adding http endpoint connectivity --- android-agent/build.gradle.kts | 3 +- .../android/agent/OtelRumConfigExtensions.kt | 88 ------------------- .../connectivity/EndpointConnectivity.kt | 12 +++ .../connectivity/HttpEndpointConnectivity.kt | 32 +++++++ .../HttpEndpointConnectivityTest.kt | 27 ++++++ 5 files changed, 73 insertions(+), 89 deletions(-) delete mode 100644 android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt create mode 100644 android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/EndpointConnectivity.kt create mode 100644 android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity.kt create mode 100644 android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt diff --git a/android-agent/build.gradle.kts b/android-agent/build.gradle.kts index 25d79a3d0..a21677571 100644 --- a/android-agent/build.gradle.kts +++ b/android-agent/build.gradle.kts @@ -10,7 +10,8 @@ android { dependencies { api(project(":core")) implementation(project(":common")) - implementation(libs.opentelemetry.instrumentation.api) + implementation(libs.opentelemetry.sdk) + implementation(libs.opentelemetry.exporter.otlp) // Default instrumentations: api(project(":instrumentation:activity")) diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt deleted file mode 100644 index 7f5af9de6..000000000 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.android.agent - -import io.opentelemetry.android.config.OtelRumConfig -import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader -import io.opentelemetry.android.instrumentation.activity.ActivityLifecycleInstrumentation -import io.opentelemetry.android.instrumentation.anr.AnrInstrumentation -import io.opentelemetry.android.instrumentation.common.ScreenNameExtractor -import io.opentelemetry.android.instrumentation.crash.CrashDetails -import io.opentelemetry.android.instrumentation.crash.CrashReporterInstrumentation -import io.opentelemetry.android.instrumentation.fragment.FragmentLifecycleInstrumentation -import io.opentelemetry.android.instrumentation.network.NetworkAttributesExtractor -import io.opentelemetry.android.instrumentation.network.NetworkChangeInstrumentation -import io.opentelemetry.android.instrumentation.slowrendering.SlowRenderingInstrumentation -import io.opentelemetry.api.trace.Tracer -import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor -import java.time.Duration - -/** - * Convenience functions to allow configuring the default instrumentations through the [OtelRumConfig] object, for example: - * - * ``` - * OtelRumConfig() - * .setSessionTimeout(Duration.ofSeconds(10)) // Real OtelRumConfig function - * .setSlowRenderingDetectionPollInterval(Duration.ofSeconds(5)) // Extension function - * .disableScreenAttributes() // Real OtelRumConfig function - * ``` - */ - -fun OtelRumConfig.setActivityTracerCustomizer(customizer: (Tracer) -> Tracer): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(ActivityLifecycleInstrumentation::class.java) - ?.setTracerCustomizer(customizer) - return this -} - -fun OtelRumConfig.setActivityNameExtractor(screenNameExtractor: ScreenNameExtractor): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(ActivityLifecycleInstrumentation::class.java) - ?.setScreenNameExtractor(screenNameExtractor) - return this -} - -fun OtelRumConfig.setFragmentTracerCustomizer(customizer: (Tracer) -> Tracer): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(FragmentLifecycleInstrumentation::class.java) - ?.setTracerCustomizer(customizer) - return this -} - -fun OtelRumConfig.setFragmentNameExtractor(screenNameExtractor: ScreenNameExtractor): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(FragmentLifecycleInstrumentation::class.java) - ?.setScreenNameExtractor(screenNameExtractor) - return this -} - -fun OtelRumConfig.addAnrAttributesExtractor(extractor: AttributesExtractor, Void>): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(AnrInstrumentation::class.java) - ?.addAttributesExtractor(extractor) - return this -} - -fun OtelRumConfig.addCrashAttributesExtractor(extractor: AttributesExtractor): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(CrashReporterInstrumentation::class.java) - ?.addAttributesExtractor(extractor) - return this -} - -fun OtelRumConfig.addNetworkChangeAttributesExtractor(attributeExtractor: NetworkAttributesExtractor): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(NetworkChangeInstrumentation::class.java) - ?.addAttributesExtractor(attributeExtractor) - return this -} - -fun OtelRumConfig.setSlowRenderingDetectionPollInterval(interval: Duration): OtelRumConfig { - AndroidInstrumentationLoader - .getInstrumentation(SlowRenderingInstrumentation::class.java) - ?.setSlowRenderingDetectionPollInterval(interval) - return this -} diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/EndpointConnectivity.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/EndpointConnectivity.kt new file mode 100644 index 000000000..1dc11456b --- /dev/null +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/EndpointConnectivity.kt @@ -0,0 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.agent.connectivity + +interface EndpointConnectivity { + fun getUrl(): String + + fun getHeaders(): Map +} diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity.kt new file mode 100644 index 000000000..3b181db4d --- /dev/null +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity.kt @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.agent.connectivity + +class HttpEndpointConnectivity private constructor( + private val url: String, + private val headers: Map, +) : EndpointConnectivity { + companion object { + fun forTraces( + baseUrl: String, + headers: Map = emptyMap(), + ): HttpEndpointConnectivity = HttpEndpointConnectivity(baseUrl.trimEnd('/') + "/v1/traces", headers) + + fun forLogs( + baseUrl: String, + headers: Map = emptyMap(), + ): HttpEndpointConnectivity = HttpEndpointConnectivity(baseUrl.trimEnd('/') + "/v1/logs", headers) + + fun forMetrics( + baseUrl: String, + headers: Map = emptyMap(), + ): HttpEndpointConnectivity = HttpEndpointConnectivity(baseUrl.trimEnd('/') + "/v1/metrics", headers) + } + + override fun getUrl(): String = url + + override fun getHeaders(): Map = headers +} diff --git a/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt b/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt new file mode 100644 index 000000000..4cac79a1c --- /dev/null +++ b/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt @@ -0,0 +1,27 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.agent.connectivity + +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test + +class HttpEndpointConnectivityTest { + @Test + fun `Validate exporter endpoint urls`() { + val headers = mapOf("Authorization" to "Basic something") + val tracesConnectivity = HttpEndpointConnectivity.forTraces("http://some.endpoint", headers) + val logsConnectivity = HttpEndpointConnectivity.forLogs("http://some.endpoint/", headers) + val metricsConnectivity = + HttpEndpointConnectivity.forMetrics("http://some.endpoint", headers) + + assertThat(tracesConnectivity.getUrl()).isEqualTo("http://some.endpoint/v1/traces") + assertThat(tracesConnectivity.getHeaders()).isEqualTo(headers) + assertThat(logsConnectivity.getUrl()).isEqualTo("http://some.endpoint/v1/logs") + assertThat(logsConnectivity.getHeaders()).isEqualTo(headers) + assertThat(metricsConnectivity.getUrl()).isEqualTo("http://some.endpoint/v1/metrics") + assertThat(metricsConnectivity.getHeaders()).isEqualTo(headers) + } +} From 1e96878e48b4e0c058320c3c1cbd1a59f9fd1e87 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:14:09 +0200 Subject: [PATCH 2/8] Creating OpenTelemetryRumInitializer --- android-agent/build.gradle.kts | 1 - .../agent/OpenTelemetryRumInitializer.kt | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt diff --git a/android-agent/build.gradle.kts b/android-agent/build.gradle.kts index a21677571..9e56db14d 100644 --- a/android-agent/build.gradle.kts +++ b/android-agent/build.gradle.kts @@ -10,7 +10,6 @@ android { dependencies { api(project(":core")) implementation(project(":common")) - implementation(libs.opentelemetry.sdk) implementation(libs.opentelemetry.exporter.otlp) // Default instrumentations: diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt new file mode 100644 index 000000000..7151db128 --- /dev/null +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.agent + +import android.app.Application +import io.opentelemetry.android.OpenTelemetryRum +import io.opentelemetry.android.agent.connectivity.EndpointConnectivity +import io.opentelemetry.android.agent.connectivity.HttpEndpointConnectivity +import io.opentelemetry.android.config.OtelRumConfig + +object OpenTelemetryRumInitializer { + @JvmStatic + fun initialize( + application: Application, + endpointBaseUrl: String, + endpointHeaders: Map = emptyMap(), + spanEndpointConnectivity: EndpointConnectivity = + HttpEndpointConnectivity.forTraces( + endpointBaseUrl, + endpointHeaders, + ), + logEndpointConnectivity: EndpointConnectivity = + HttpEndpointConnectivity.forLogs( + endpointBaseUrl, + endpointHeaders, + ), + metricEndpointConnectivity: EndpointConnectivity = + HttpEndpointConnectivity.forMetrics( + endpointBaseUrl, + endpointHeaders, + ), + rumConfig: OtelRumConfig = OtelRumConfig(), + ): OpenTelemetryRum { + TODO() + } +} From 15ca08fa178a9b07fe40c5a625ced6339b762f95 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:23:27 +0200 Subject: [PATCH 3/8] Initializing OpenTelemetryRum --- .../agent/OpenTelemetryRumInitializer.kt | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt index 7151db128..78e411f53 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt @@ -10,6 +10,9 @@ import io.opentelemetry.android.OpenTelemetryRum import io.opentelemetry.android.agent.connectivity.EndpointConnectivity import io.opentelemetry.android.agent.connectivity.HttpEndpointConnectivity import io.opentelemetry.android.config.OtelRumConfig +import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter +import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter object OpenTelemetryRumInitializer { @JvmStatic @@ -33,7 +36,26 @@ object OpenTelemetryRumInitializer { endpointHeaders, ), rumConfig: OtelRumConfig = OtelRumConfig(), - ): OpenTelemetryRum { - TODO() - } + ): OpenTelemetryRum = + OpenTelemetryRum + .builder(application, rumConfig) + .addSpanExporterCustomizer { + OtlpHttpSpanExporter + .builder() + .setEndpoint(spanEndpointConnectivity.getUrl()) + .setHeaders(spanEndpointConnectivity::getHeaders) + .build() + }.addLogRecordExporterCustomizer { + OtlpHttpLogRecordExporter + .builder() + .setEndpoint(logEndpointConnectivity.getUrl()) + .setHeaders(logEndpointConnectivity::getHeaders) + .build() + }.addMetricExporterCustomizer { + OtlpHttpMetricExporter + .builder() + .setEndpoint(metricEndpointConnectivity.getUrl()) + .setHeaders(metricEndpointConnectivity::getHeaders) + .build() + }.build() } From 9cb83aab994cd766729c7318c6117cf29c72d967 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 12:25:58 +0200 Subject: [PATCH 4/8] Clean up --- .../java/io/opentelemetry/android/OpenTelemetryRumBuilder.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java index 8a1f5413b..cfcaf1279 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java @@ -570,19 +570,16 @@ private SdkLoggerProvider buildLoggerProvider( } private SpanExporter buildSpanExporter() { - // TODO: Default to otlp...but how can we make endpoint and auth mandatory? SpanExporter defaultExporter = LoggingSpanExporter.create(); return spanExporterCustomizer.apply(defaultExporter); } private MetricExporter buildMetricExporter() { - // TODO: Default to otlp...but how can we make endpoint and auth mandatory? MetricExporter defaultExporter = LoggingMetricExporter.create(); return metricExporterCustomizer.apply(defaultExporter); } private LogRecordExporter buildLogsExporter() { - // TODO: Default to otlp...but how can we make endpoint and auth mandatory? LogRecordExporter defaultExporter = SystemOutLogRecordExporter.create(); return logRecordExporterCustomizer.apply(defaultExporter); } From 18a7f7499a13312136dd12a6031e0fdfb984085d Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:25:25 +0200 Subject: [PATCH 5/8] Using initializer in demo app --- .../android/demo/OtelDemoApplication.kt | 23 ++----------------- 1 file changed, 2 insertions(+), 21 deletions(-) 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 26d1f3289..5c31a7b4a 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 @@ -9,18 +9,15 @@ import android.annotation.SuppressLint import android.app.Application import android.util.Log import io.opentelemetry.android.OpenTelemetryRum -import io.opentelemetry.android.OpenTelemetryRumBuilder +import io.opentelemetry.android.agent.OpenTelemetryRumInitializer import io.opentelemetry.android.config.OtelRumConfig import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig -import io.opentelemetry.android.instrumentation.sessions.SessionInstrumentation import io.opentelemetry.api.common.AttributeKey.stringKey import io.opentelemetry.api.common.Attributes import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder import io.opentelemetry.api.logs.LogRecordBuilder import io.opentelemetry.api.metrics.LongCounter import io.opentelemetry.api.trace.Tracer -import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter -import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter import io.opentelemetry.exporter.otlp.logs.OtlpGrpcLogRecordExporter import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter @@ -40,24 +37,8 @@ class OtelDemoApplication : Application() { .setDiskBufferingConfig(diskBufferingConfig) // 10.0.2.2 is apparently a special binding to the host running the emulator - val spansIngestUrl = "http://10.0.2.2:4318/v1/traces" - val logsIngestUrl = "http://10.0.2.2:4318/v1/logs" - val otelRumBuilder: OpenTelemetryRumBuilder = - OpenTelemetryRum.builder(this, config) - .addSpanExporterCustomizer { - OtlpHttpSpanExporter.builder() - .setEndpoint(spansIngestUrl) - .build() - } - .addLogRecordExporterCustomizer { - OtlpHttpLogRecordExporter.builder() - .setEndpoint(logsIngestUrl) - .build() - } - // TODO: This should NOT be necessary if it's in the runtime classpath... - .addInstrumentation(SessionInstrumentation()) try { - rum = otelRumBuilder.build() + rum = OpenTelemetryRumInitializer.initialize(this, "http://10.0.2.2:4318") Log.d(TAG, "RUM session started: " + rum!!.rumSessionId) } catch (e: Exception) { Log.e(TAG, "Oh no!", e) From 2ae6baca531a8d9f71f84cce73fc7682c418c052 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:34:08 +0200 Subject: [PATCH 6/8] Adding docs --- .../android/agent/OpenTelemetryRumInitializer.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt index 78e411f53..81bff83bf 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt @@ -7,6 +7,7 @@ package io.opentelemetry.android.agent import android.app.Application import io.opentelemetry.android.OpenTelemetryRum +import io.opentelemetry.android.OpenTelemetryRumBuilder import io.opentelemetry.android.agent.connectivity.EndpointConnectivity import io.opentelemetry.android.agent.connectivity.HttpEndpointConnectivity import io.opentelemetry.android.config.OtelRumConfig @@ -15,6 +16,17 @@ import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter object OpenTelemetryRumInitializer { + /** + * Opinionated [OpenTelemetryRum] initialization. + * + * @param application Your android app's application object. + * @param endpointBaseUrl The base endpoint for exporting all your signals. + * @param endpointHeaders These will be added to each signal export request. + * @param spanEndpointConnectivity Span-specific endpoint configuration. + * @param logEndpointConnectivity Log-specific endpoint configuration. + * @param metricEndpointConnectivity Metric-specific endpoint configuration. + * @param rumConfig Configuration used by [OpenTelemetryRumBuilder]. + */ @JvmStatic fun initialize( application: Application, From b9bcf82264b6fbc13675af31ff005dd83c16a949 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:35:25 +0200 Subject: [PATCH 7/8] Renaming test --- .../android/agent/connectivity/HttpEndpointConnectivityTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt b/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt index 4cac79a1c..01e6a11f0 100644 --- a/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt +++ b/android-agent/src/test/kotlin/io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivityTest.kt @@ -10,7 +10,7 @@ import org.junit.Test class HttpEndpointConnectivityTest { @Test - fun `Validate exporter endpoint urls`() { + fun `Validate exporter endpoint configuration`() { val headers = mapOf("Authorization" to "Basic something") val tracesConnectivity = HttpEndpointConnectivity.forTraces("http://some.endpoint", headers) val logsConnectivity = HttpEndpointConnectivity.forLogs("http://some.endpoint/", headers) From c18acfe316cf0642e0bc9606bd6601d1d8bec316 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Wed, 30 Apr 2025 10:39:43 +0200 Subject: [PATCH 8/8] Revert removing extensions --- android-agent/build.gradle.kts | 1 + .../android/agent/OtelRumConfigExtensions.kt | 88 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt diff --git a/android-agent/build.gradle.kts b/android-agent/build.gradle.kts index 9e56db14d..59bef257e 100644 --- a/android-agent/build.gradle.kts +++ b/android-agent/build.gradle.kts @@ -10,6 +10,7 @@ android { dependencies { api(project(":core")) implementation(project(":common")) + implementation(libs.opentelemetry.instrumentation.api) implementation(libs.opentelemetry.exporter.otlp) // Default instrumentations: diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt new file mode 100644 index 000000000..7f5af9de6 --- /dev/null +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/OtelRumConfigExtensions.kt @@ -0,0 +1,88 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.agent + +import io.opentelemetry.android.config.OtelRumConfig +import io.opentelemetry.android.instrumentation.AndroidInstrumentationLoader +import io.opentelemetry.android.instrumentation.activity.ActivityLifecycleInstrumentation +import io.opentelemetry.android.instrumentation.anr.AnrInstrumentation +import io.opentelemetry.android.instrumentation.common.ScreenNameExtractor +import io.opentelemetry.android.instrumentation.crash.CrashDetails +import io.opentelemetry.android.instrumentation.crash.CrashReporterInstrumentation +import io.opentelemetry.android.instrumentation.fragment.FragmentLifecycleInstrumentation +import io.opentelemetry.android.instrumentation.network.NetworkAttributesExtractor +import io.opentelemetry.android.instrumentation.network.NetworkChangeInstrumentation +import io.opentelemetry.android.instrumentation.slowrendering.SlowRenderingInstrumentation +import io.opentelemetry.api.trace.Tracer +import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor +import java.time.Duration + +/** + * Convenience functions to allow configuring the default instrumentations through the [OtelRumConfig] object, for example: + * + * ``` + * OtelRumConfig() + * .setSessionTimeout(Duration.ofSeconds(10)) // Real OtelRumConfig function + * .setSlowRenderingDetectionPollInterval(Duration.ofSeconds(5)) // Extension function + * .disableScreenAttributes() // Real OtelRumConfig function + * ``` + */ + +fun OtelRumConfig.setActivityTracerCustomizer(customizer: (Tracer) -> Tracer): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(ActivityLifecycleInstrumentation::class.java) + ?.setTracerCustomizer(customizer) + return this +} + +fun OtelRumConfig.setActivityNameExtractor(screenNameExtractor: ScreenNameExtractor): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(ActivityLifecycleInstrumentation::class.java) + ?.setScreenNameExtractor(screenNameExtractor) + return this +} + +fun OtelRumConfig.setFragmentTracerCustomizer(customizer: (Tracer) -> Tracer): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(FragmentLifecycleInstrumentation::class.java) + ?.setTracerCustomizer(customizer) + return this +} + +fun OtelRumConfig.setFragmentNameExtractor(screenNameExtractor: ScreenNameExtractor): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(FragmentLifecycleInstrumentation::class.java) + ?.setScreenNameExtractor(screenNameExtractor) + return this +} + +fun OtelRumConfig.addAnrAttributesExtractor(extractor: AttributesExtractor, Void>): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(AnrInstrumentation::class.java) + ?.addAttributesExtractor(extractor) + return this +} + +fun OtelRumConfig.addCrashAttributesExtractor(extractor: AttributesExtractor): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(CrashReporterInstrumentation::class.java) + ?.addAttributesExtractor(extractor) + return this +} + +fun OtelRumConfig.addNetworkChangeAttributesExtractor(attributeExtractor: NetworkAttributesExtractor): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(NetworkChangeInstrumentation::class.java) + ?.addAttributesExtractor(attributeExtractor) + return this +} + +fun OtelRumConfig.setSlowRenderingDetectionPollInterval(interval: Duration): OtelRumConfig { + AndroidInstrumentationLoader + .getInstrumentation(SlowRenderingInstrumentation::class.java) + ?.setSlowRenderingDetectionPollInterval(interval) + return this +}