diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java index 7aa4c9821..ce28dbb1e 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java @@ -545,6 +545,13 @@ private SdkTracerProvider buildTracerProvider( customizer : tracerProviderCustomizers) { tracerProviderBuilder = customizer.apply(tracerProviderBuilder, application); } + + if (config.getSessionConfig().getRatio() != null) { + tracerProviderBuilder.setSampler( + new SessionIdRatioBasedSampler( + config.getSessionConfig().getRatio(), sessionProvider)); + } + return tracerProviderBuilder.build(); } diff --git a/core/src/main/java/io/opentelemetry/android/config/SessionConfig.kt b/core/src/main/java/io/opentelemetry/android/config/SessionConfig.kt index e00763726..49425418c 100644 --- a/core/src/main/java/io/opentelemetry/android/config/SessionConfig.kt +++ b/core/src/main/java/io/opentelemetry/android/config/SessionConfig.kt @@ -12,9 +12,20 @@ import kotlin.time.Duration.Companion.minutes data class SessionConfig( val backgroundInactivityTimeout: Duration = 15.minutes, val maxLifetime: Duration = 4.hours, + val ratio: Double? = null, ) { + constructor( + backgroundInactivityTimeout: Int = 15, + maxLifetime: Int = 4, + ratio: Double? = null, + ) : this( + backgroundInactivityTimeout = backgroundInactivityTimeout.minutes, + maxLifetime = maxLifetime.hours, + ratio = ratio, + ) + companion object { @JvmStatic - fun withDefaults(): SessionConfig = SessionConfig() + fun withDefaults(): SessionConfig = SessionConfig(15.minutes, 4.hours) } } diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java index 1e07e9a74..0556f2da7 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java @@ -28,6 +28,7 @@ import androidx.annotation.NonNull; import androidx.test.ext.junit.runners.AndroidJUnit4; import io.opentelemetry.android.config.OtelRumConfig; +import io.opentelemetry.android.config.SessionConfig; import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig; import io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter; import io.opentelemetry.android.features.diskbuffering.scheduler.ExportScheduleHandler; @@ -530,6 +531,25 @@ public void verifyGlobalAttrsForLogs() { .build()); } + @Test + public void testSamplerWithSessionConfigRatio() { + SessionConfig sessionConfig = new SessionConfig(0, 0, 0.0); + OtelRumConfig otelRumConfig = buildConfig().setSessionConfig(sessionConfig); + + OpenTelemetryRum rum = + OpenTelemetryRum.builder(application, otelRumConfig) + .addTracerProviderCustomizer( + (tracerProviderBuilder, app) -> + tracerProviderBuilder.addSpanProcessor( + SimpleSpanProcessor.create(spanExporter))) + .build(); + + rum.getOpenTelemetry().getTracer("test").spanBuilder("test span").startSpan().end(); + + await().atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> assertThat(spanExporter.getFinishedSpanItems()).hasSize(0)); + } + /** * @noinspection KotlinInternalInJava */