Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions android-agent/api/android-agent.api
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ 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;Ljava/lang/String;Ljava/util/Map;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/agent/session/SessionConfig;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum;
public static final fun initialize (Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/agent/session/SessionConfig;Lkotlin/jvm/functions/Function1;)Lio/opentelemetry/android/OpenTelemetryRum;
public static synthetic fun initialize$default (Landroid/app/Application;Ljava/lang/String;Ljava/util/Map;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/agent/session/SessionConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum;
public static synthetic fun initialize$default (Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/agent/connectivity/EndpointConnectivity;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/agent/session/SessionConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/opentelemetry/android/OpenTelemetryRum;
}

public final class io/opentelemetry/android/agent/OpenTelemetryRumInitializer$ActivityLifecycleConfiguration : io/opentelemetry/android/agent/OpenTelemetryRumInitializer$CanBeEnabledAndDisabled, io/opentelemetry/android/agent/OpenTelemetryRumInitializer$ScreenLifecycleConfigurable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package io.opentelemetry.android.agent

import android.app.Application
import android.content.Context
import io.opentelemetry.android.Incubating
import io.opentelemetry.android.OpenTelemetryRum
import io.opentelemetry.android.OpenTelemetryRumBuilder
Expand Down Expand Up @@ -41,7 +42,7 @@ object OpenTelemetryRumInitializer {
/**
* Opinionated [OpenTelemetryRum] initialization.
*
* @param application Your android app's application object.
* @param application A reference to your app's Application subclass.
* @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.
Expand Down Expand Up @@ -75,13 +76,76 @@ object OpenTelemetryRumInitializer {
rumConfig: OtelRumConfig = OtelRumConfig(),
sessionConfig: SessionConfig = SessionConfig.withDefaults(),
instrumentations: (InstrumentationConfiguration.() -> Unit)? = null,
): OpenTelemetryRum =
initialize(
context = application,
endpointBaseUrl = endpointBaseUrl,
endpointHeaders = endpointHeaders,
spanEndpointConnectivity = spanEndpointConnectivity,
logEndpointConnectivity = logEndpointConnectivity,
metricEndpointConnectivity = metricEndpointConnectivity,
rumConfig = rumConfig,
sessionConfig = sessionConfig,
instrumentations = instrumentations,
)

/**
* Opinionated [OpenTelemetryRum] initialization.
*
* @param context Your android app's application context. This should be from your Application
* 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 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].
* @param sessionConfig The session configuration, which includes inactivity timeout and maximum lifetime durations.
* @param instrumentations Configurations for all the default instrumentations.
*/
@Suppress("LongParameterList")
@JvmStatic
fun initialize(
context: Context,
endpointBaseUrl: String,
endpointHeaders: Map<String, String> = emptyMap(),
spanEndpointConnectivity: EndpointConnectivity =
HttpEndpointConnectivity.forTraces(
endpointBaseUrl,
endpointHeaders,
),
logEndpointConnectivity: EndpointConnectivity =
HttpEndpointConnectivity.forLogs(
endpointBaseUrl,
endpointHeaders,
),
metricEndpointConnectivity: EndpointConnectivity =
HttpEndpointConnectivity.forMetrics(
endpointBaseUrl,
endpointHeaders,
),
rumConfig: OtelRumConfig = OtelRumConfig(),
sessionConfig: SessionConfig = SessionConfig.withDefaults(),
instrumentations: (InstrumentationConfiguration.() -> Unit)? = null,
): OpenTelemetryRum {
instrumentations?.let { configure ->
InstrumentationConfiguration(rumConfig).configure()
}

// ensure we're using the Application Context to prevent potential leaks.
// if context.applicationContext is null (e.g. called from within attachBaseContext),
// fallback to the supplied context.
val ctx =
when (context) {
is Application -> context
else -> context.applicationContext ?: context
}

return OpenTelemetryRum
.builder(application, rumConfig)
.setSessionProvider(createSessionProvider(application, sessionConfig))
.builder(ctx, rumConfig)
.setSessionProvider(createSessionProvider(ctx, sessionConfig))
.addSpanExporterCustomizer {
OtlpHttpSpanExporter
.builder()
Expand All @@ -104,11 +168,11 @@ object OpenTelemetryRumInitializer {
}

private fun createSessionProvider(
application: Application,
context: Context,
sessionConfig: SessionConfig,
): SessionProvider {
val timeoutHandler = SessionIdTimeoutHandler(sessionConfig)
Services.get(application).appLifecycle.registerListener(timeoutHandler)
Services.get(context).appLifecycle.registerListener(timeoutHandler)
return SessionManager.create(timeoutHandler, sessionConfig)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import io.opentelemetry.android.Incubating
import io.opentelemetry.android.agent.session.SessionIdTimeoutHandler
import io.opentelemetry.android.internal.services.Services
import io.opentelemetry.android.internal.services.applifecycle.AppLifecycle
Expand All @@ -18,6 +19,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RuntimeEnvironment

@OptIn(Incubating::class)
@RunWith(AndroidJUnit4::class)
class OpenTelemetryRumInitializerTest {
private lateinit var appLifecycle: AppLifecycle
Expand All @@ -32,8 +34,22 @@ class OpenTelemetryRumInitializerTest {
createAndSetServiceManager()

OpenTelemetryRumInitializer.initialize(
RuntimeEnvironment.getApplication(),
"http://127.0.0.1:4318",
application = RuntimeEnvironment.getApplication(),
endpointBaseUrl = "http://127.0.0.1:4318",
)

verify {
appLifecycle.registerListener(any<SessionIdTimeoutHandler>())
}
}

@Test
fun `Verify timeoutHandler initialization 2`() {
createAndSetServiceManager()

OpenTelemetryRumInitializer.initialize(
context = RuntimeEnvironment.getApplication(),
endpointBaseUrl = "http://127.0.0.1:4318",
)

verify {
Expand Down
10 changes: 5 additions & 5 deletions core/api/core.api
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
public final class io/opentelemetry/android/AndroidResource {
public static final field INSTANCE Lio/opentelemetry/android/AndroidResource;
public static final fun createDefault (Landroid/app/Application;)Lio/opentelemetry/sdk/resources/Resource;
public static final fun createDefault (Landroid/content/Context;)Lio/opentelemetry/sdk/resources/Resource;
}

public final class io/opentelemetry/android/BuildConfig {
Expand All @@ -12,9 +12,9 @@ public final class io/opentelemetry/android/BuildConfig {
}

public abstract interface class io/opentelemetry/android/OpenTelemetryRum {
public static fun builder (Landroid/app/Application;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public static fun builder (Landroid/app/Application;Lio/opentelemetry/android/config/OtelRumConfig;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public static fun builder (Landroid/app/Application;Lio/opentelemetry/sdk/OpenTelemetrySdk;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/session/SessionProvider;)Lio/opentelemetry/android/SdkPreconfiguredRumBuilder;
public static fun builder (Landroid/content/Context;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public static fun builder (Landroid/content/Context;Lio/opentelemetry/android/config/OtelRumConfig;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public static fun builder (Landroid/content/Context;Lio/opentelemetry/sdk/OpenTelemetrySdk;Lio/opentelemetry/android/config/OtelRumConfig;Lio/opentelemetry/android/session/SessionProvider;)Lio/opentelemetry/android/SdkPreconfiguredRumBuilder;
public fun emitEvent (Ljava/lang/String;)V
public fun emitEvent (Ljava/lang/String;Lio/opentelemetry/api/common/Attributes;)V
public fun emitEvent (Ljava/lang/String;Ljava/lang/String;)V
Expand All @@ -36,7 +36,7 @@ public final class io/opentelemetry/android/OpenTelemetryRumBuilder {
public fun addSpanExporterCustomizer (Ljava/util/function/Function;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public fun addTracerProviderCustomizer (Ljava/util/function/BiFunction;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public fun build ()Lio/opentelemetry/android/OpenTelemetryRum;
public static fun create (Landroid/app/Application;Lio/opentelemetry/android/config/OtelRumConfig;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public static fun create (Landroid/content/Context;Lio/opentelemetry/android/config/OtelRumConfig;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public fun mergeResource (Lio/opentelemetry/sdk/resources/Resource;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public fun setExportScheduleHandler (Lio/opentelemetry/android/features/diskbuffering/scheduler/ExportScheduleHandler;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
public fun setResource (Lio/opentelemetry/sdk/resources/Resource;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
Expand Down
23 changes: 10 additions & 13 deletions core/src/main/java/io/opentelemetry/android/AndroidResource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

package io.opentelemetry.android

import android.app.Application
import android.content.Context
import android.os.Build
import io.opentelemetry.android.common.RumConstants.RUM_SDK_VERSION
import io.opentelemetry.sdk.resources.Resource
Expand All @@ -23,11 +23,11 @@ private const val DEFAULT_APP_NAME = "unknown_service:android"

object AndroidResource {
@JvmStatic
fun createDefault(application: Application): Resource {
val appName = readAppName(application)
fun createDefault(context: Context): Resource {
val appName = readAppName(context)
val resourceBuilder =
Resource.getDefault().toBuilder().put(SERVICE_NAME, appName)
val appVersion = readAppVersion(application)
val appVersion = readAppVersion(context)
appVersion?.let { resourceBuilder.put(SERVICE_VERSION, it) }

return resourceBuilder
Expand All @@ -42,24 +42,21 @@ object AndroidResource {
.build()
}

private fun readAppName(application: Application): String =
private fun readAppName(context: Context): String =
try {
val stringId =
application.applicationContext.applicationInfo.labelRes
application.applicationContext.getString(stringId)
val stringId = context.applicationContext.applicationInfo.labelRes
context.applicationContext.getString(stringId)
} catch (_: Exception) {
DEFAULT_APP_NAME
}

private fun readAppVersion(application: Application): String? {
val ctx = application.applicationContext
return try {
val packageInfo = ctx.packageManager.getPackageInfo(ctx.packageName, 0)
private fun readAppVersion(context: Context): String? =
try {
val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
packageInfo.versionName
} catch (_: Exception) {
null
}
}

private val oSDescription: String
get() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

package io.opentelemetry.android;

import android.app.Application;
import android.content.Context;
import io.opentelemetry.android.config.OtelRumConfig;
import io.opentelemetry.android.session.SessionProvider;
import io.opentelemetry.api.OpenTelemetry;
Expand All @@ -26,10 +26,10 @@ public interface OpenTelemetryRum {
* {@link OtelRumConfig} instance. If you would like to "bring your own" SDK, call the
* two-argument version that takes the SDK as a parameter.
*
* @param application The {@link Application} that is being instrumented.
* @param context The {@link Context} of the application that is being instrumented.
*/
static OpenTelemetryRumBuilder builder(Application application) {
return builder(application, new OtelRumConfig());
static OpenTelemetryRumBuilder builder(Context context) {
return builder(context, new OtelRumConfig());
}

/**
Expand All @@ -39,8 +39,8 @@ static OpenTelemetryRumBuilder builder(Application application) {
* you. If you would like to "bring your own" SDK, call the two-argument version that takes the
* SDK as a parameter.
*/
static OpenTelemetryRumBuilder builder(Application application, OtelRumConfig config) {
return OpenTelemetryRumBuilder.create(application, config);
static OpenTelemetryRumBuilder builder(Context context, OtelRumConfig config) {
return OpenTelemetryRumBuilder.create(context, config);
}

/**
Expand All @@ -53,18 +53,17 @@ static OpenTelemetryRumBuilder builder(Application application, OtelRumConfig co
* the {@link SdkTracerProvider}, {@link SdkMeterProvider}, and {@link SdkLoggerProvider} are
* configured correctly for your target RUM provider.
*
* @param application The {@link Application} that is being instrumented.
* @param context The {@link Context} of the application that is being instrumented.
* @param openTelemetrySdk The {@link OpenTelemetrySdk} that the user has already created.
* @param config The {@link OtelRumConfig} instance.
* @param sessionProvider The {@link SessionProvider} instance.
*/
static SdkPreconfiguredRumBuilder builder(
Application application,
Context context,
OpenTelemetrySdk openTelemetrySdk,
OtelRumConfig config,
SessionProvider sessionProvider) {
return new SdkPreconfiguredRumBuilder(
application, openTelemetrySdk, sessionProvider, config);
return new SdkPreconfiguredRumBuilder(context, openTelemetrySdk, sessionProvider, config);
}

/** Returns a no-op implementation of {@link OpenTelemetryRum}. */
Expand Down
Loading