diff --git a/android-agent/api/android-agent.api b/android-agent/api/android-agent.api index e4b958e30..e2271a041 100644 --- a/android-agent/api/android-agent.api +++ b/android-agent/api/android-agent.api @@ -3,31 +3,10 @@ public abstract interface annotation class io/opentelemetry/android/Incubating : public final class io/opentelemetry/android/agent/OpenTelemetryRumInitializer { public static final field INSTANCE Lio/opentelemetry/android/agent/OpenTelemetryRumInitializer; - public static final fun initialize (Landroid/app/Application;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum; - public static final fun initialize (Landroid/content/Context;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum; - public static synthetic fun initialize$default (Landroid/app/Application;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum; - public static synthetic fun initialize$default (Landroid/content/Context;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum; -} - -public abstract interface class io/opentelemetry/android/agent/connectivity/EndpointConnectivity { - public abstract fun getHeaders ()Ljava/util/Map; - public abstract fun getUrl ()Ljava/lang/String; -} - -public final class io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity : io/opentelemetry/android/agent/connectivity/EndpointConnectivity { - public static final field Companion Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity$Companion; - public synthetic fun (Ljava/lang/String;Ljava/util/Map;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getHeaders ()Ljava/util/Map; - public fun getUrl ()Ljava/lang/String; -} - -public final class io/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity$Companion { - public final fun forLogs (Ljava/lang/String;Ljava/util/Map;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; - public static synthetic fun forLogs$default (Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity$Companion;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; - public final fun forMetrics (Ljava/lang/String;Ljava/util/Map;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; - public static synthetic fun forMetrics$default (Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity$Companion;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; - public final fun forTraces (Ljava/lang/String;Ljava/util/Map;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; - public static synthetic fun forTraces$default (Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity$Companion;Ljava/lang/String;Ljava/util/Map;ILjava/lang/Object;)Lio/opentelemetry/android/agent/connectivity/HttpEndpointConnectivity; + public static final fun initialize (Landroid/app/Application;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum; + public static final fun initialize (Landroid/content/Context;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum; + public static synthetic fun initialize$default (Landroid/app/Application;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum; + public static synthetic fun initialize$default (Landroid/content/Context;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum; } public final class io/opentelemetry/android/agent/dsl/DiskBufferingConfigurationSpec : io/opentelemetry/android/agent/dsl/instrumentation/CanBeEnabledAndDisabled { @@ -52,14 +31,14 @@ public final class io/opentelemetry/android/agent/dsl/HttpExportConfiguration { } public final class io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration { - public fun ()V + public final fun diskBuffering (Lkotlin/jvm/functions/Function1;)V + public final fun globalAttributes (Lkotlin/jvm/functions/Function0;)V public final fun httpExport (Lkotlin/jvm/functions/Function1;)V public final fun instrumentations (Lkotlin/jvm/functions/Function1;)V public final fun session (Lkotlin/jvm/functions/Function1;)V } public final class io/opentelemetry/android/agent/dsl/SessionConfiguration { - public synthetic fun (JJILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getBackgroundInactivityTimeout-UwyO8pc ()J public final fun getMaxLifetime-UwyO8pc ()J public final fun setBackgroundInactivityTimeout-LRDsOJo (J)V @@ -108,16 +87,3 @@ public final class io/opentelemetry/android/agent/dsl/instrumentation/SlowRender public fun enabled (Z)V } -public final class io/opentelemetry/android/agent/session/SessionConfig { - public static final field Companion Lio/opentelemetry/android/agent/session/SessionConfig$Companion; - public synthetic fun (JJILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (JJLkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getBackgroundInactivityTimeout-UwyO8pc ()J - public final fun getMaxLifetime-UwyO8pc ()J - public static final fun withDefaults ()Lio/opentelemetry/android/agent/session/SessionConfig; -} - -public final class io/opentelemetry/android/agent/session/SessionConfig$Companion { - public final fun withDefaults ()Lio/opentelemetry/android/agent/session/SessionConfig; -} - 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 d41518ff5..5147b57b4 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 @@ -9,16 +9,12 @@ import android.app.Application import android.content.Context import io.opentelemetry.android.Incubating import io.opentelemetry.android.OpenTelemetryRum -import io.opentelemetry.android.agent.dsl.DiskBufferingConfigurationSpec import io.opentelemetry.android.agent.dsl.OpenTelemetryConfiguration import io.opentelemetry.android.agent.session.SessionConfig import io.opentelemetry.android.agent.session.SessionIdTimeoutHandler import io.opentelemetry.android.agent.session.SessionManager -import io.opentelemetry.android.config.OtelRumConfig -import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig import io.opentelemetry.android.internal.services.Services import io.opentelemetry.android.session.SessionProvider -import io.opentelemetry.api.common.Attributes import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter @@ -29,22 +25,16 @@ object OpenTelemetryRumInitializer { * Opinionated [OpenTelemetryRum] initialization. * * @param application Your android app's application object. - * @param globalAttributes Configures the set of global attributes to emit with every span and event. - * @param diskBuffering Configures the disk buffering feature. * @param configuration Type-safe config DSL that controls how OpenTelemetry * should behave. */ @JvmStatic fun initialize( application: Application, - globalAttributes: (() -> Attributes)? = null, - diskBuffering: (DiskBufferingConfigurationSpec.() -> Unit)? = null, configuration: (OpenTelemetryConfiguration.() -> Unit) = {}, ): OpenTelemetryRum = initialize( context = application, - globalAttributes = globalAttributes, - diskBuffering = diskBuffering, configuration = configuration, ) @@ -55,30 +45,17 @@ object OpenTelemetryRumInitializer { * subclass or an appropriate context that allows retrieving the application context. If you * supply an inappropriate context (e.g. from attachBaseContext) then instrumentation relying * on activity lifecycle callbacks will not function correctly. - * @param globalAttributes Configures the set of global attributes to emit with every span and event. - * @param diskBuffering Configures the disk buffering feature. * @param configuration Type-safe config DSL that controls how OpenTelemetry * should behave. */ @JvmStatic fun initialize( context: Context, - globalAttributes: (() -> Attributes)? = null, - diskBuffering: (DiskBufferingConfigurationSpec.() -> Unit)? = null, configuration: (OpenTelemetryConfiguration.() -> Unit) = {}, ): OpenTelemetryRum { - val rumConfig = OtelRumConfig() - val cfg = OpenTelemetryConfiguration(rumConfig) + val cfg = OpenTelemetryConfiguration() configuration(cfg) - val diskBufferingConfigurationSpec = DiskBufferingConfigurationSpec() - diskBuffering?.invoke(diskBufferingConfigurationSpec) - rumConfig.setDiskBufferingConfig(DiskBufferingConfig.create(enabled = diskBufferingConfigurationSpec.enabled)) - - globalAttributes?.let { - rumConfig.setGlobalAttributes(it::invoke) - } - val sessionConfig = SessionConfig( cfg.sessionConfig.backgroundInactivityTimeout, @@ -95,7 +72,7 @@ object OpenTelemetryRumInitializer { } return OpenTelemetryRum - .builder(ctx, rumConfig) + .builder(ctx, cfg.rumConfig) .setSessionProvider(createSessionProvider(ctx, sessionConfig)) .addSpanExporterCustomizer { OtlpHttpSpanExporter 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 index 1dc11456b..f7d5057ff 100644 --- 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 @@ -5,7 +5,7 @@ package io.opentelemetry.android.agent.connectivity -interface EndpointConnectivity { +internal 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 index 3b181db4d..ba389bf57 100644 --- 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 @@ -5,7 +5,7 @@ package io.opentelemetry.android.agent.connectivity -class HttpEndpointConnectivity private constructor( +internal class HttpEndpointConnectivity private constructor( private val url: String, private val headers: Map, ) : EndpointConnectivity { diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/HttpExportConfiguration.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/HttpExportConfiguration.kt index 39a97ff65..96bb1e62c 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/HttpExportConfiguration.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/HttpExportConfiguration.kt @@ -13,6 +13,12 @@ class HttpExportConfiguration internal constructor() { * Global URL for HTTP export requests. */ var baseUrl: String = "" + set(value) { + field = value + spansConfig.url = HttpEndpointConnectivity.forTraces(value).getUrl() + logsConfig.url = HttpEndpointConnectivity.forLogs(value).getUrl() + metricsConfig.url = HttpEndpointConnectivity.forMetrics(value).getUrl() + } /** * Global headers that should be attached to any HTTP export requests. diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration.kt index 35c327610..0fd50ebb5 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration.kt @@ -8,24 +8,20 @@ package io.opentelemetry.android.agent.dsl import io.opentelemetry.android.Incubating import io.opentelemetry.android.agent.dsl.instrumentation.InstrumentationConfiguration import io.opentelemetry.android.config.OtelRumConfig +import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig +import io.opentelemetry.api.common.Attributes /** * Type-safe config DSL that controls how OpenTelemetry should behave. */ @OptIn(Incubating::class) @OpenTelemetryDslMarker -class OpenTelemetryConfiguration internal constructor( - internal val rumConfig: OtelRumConfig = OtelRumConfig(), -) { - internal val exportConfig: HttpExportConfiguration = HttpExportConfiguration() - - internal val sessionConfig: SessionConfiguration = SessionConfiguration() - - /** - * Configures individual instrumentations. - */ - internal val instrumentations: InstrumentationConfiguration = - InstrumentationConfiguration(rumConfig) +class OpenTelemetryConfiguration internal constructor() { + internal val rumConfig: OtelRumConfig = OtelRumConfig() + internal val exportConfig = HttpExportConfiguration() + internal val sessionConfig = SessionConfiguration() + internal val diskBufferingConfig = DiskBufferingConfigurationSpec() + internal val instrumentations = InstrumentationConfiguration(rumConfig) /** * Configures how OpenTelemetry should export telemetry over HTTP. @@ -47,4 +43,19 @@ class OpenTelemetryConfiguration internal constructor( fun session(action: SessionConfiguration.() -> Unit) { sessionConfig.action() } + + /** + * Configures attributes that are used globally. + */ + fun globalAttributes(action: () -> Attributes) { + rumConfig.setGlobalAttributes(action()) + } + + /** + * Configures disk buffering behavior of exported telemetry. + */ + fun diskBuffering(action: DiskBufferingConfigurationSpec.() -> Unit) { + diskBufferingConfig.action() + rumConfig.setDiskBufferingConfig(DiskBufferingConfig.create(enabled = diskBufferingConfig.enabled)) + } } diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/SessionConfiguration.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/SessionConfiguration.kt index 25995c9f6..009f24fe6 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/SessionConfiguration.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/SessionConfiguration.kt @@ -10,7 +10,7 @@ import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes @OpenTelemetryDslMarker -class SessionConfiguration internal constructor( - var backgroundInactivityTimeout: Duration = 15.minutes, - var maxLifetime: Duration = 4.hours, -) +class SessionConfiguration internal constructor() { + var backgroundInactivityTimeout: Duration = 15.minutes + var maxLifetime: Duration = 4.hours +} diff --git a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionConfig.kt b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionConfig.kt index 12c913400..d3ba8839b 100644 --- a/android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionConfig.kt +++ b/android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionConfig.kt @@ -5,13 +5,11 @@ package io.opentelemetry.android.agent.session -import io.opentelemetry.android.Incubating import kotlin.time.Duration import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes -@Incubating -class SessionConfig( +internal class SessionConfig( val backgroundInactivityTimeout: Duration = 15.minutes, val maxLifetime: Duration = 4.hours, ) { 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 07e9f19c8..b6d881785 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 @@ -35,11 +35,13 @@ class OtelDemoApplication : Application() { try { rum = OpenTelemetryRumInitializer.initialize( application = this, - globalAttributes = { Attributes.of(stringKey("toolkit"), "jetpack compose") }, configuration = { httpExport { baseUrl = "http://10.0.2.2:4318" } + globalAttributes { + Attributes.of(stringKey("toolkit"), "jetpack compose") + } } ) Log.d(TAG, "RUM session started: " + rum?.getRumSessionId())