Skip to content

Commit d29c7f6

Browse files
committed
feat: add ability to override clock
1 parent 73b6d7f commit d29c7f6

26 files changed

Lines changed: 140 additions & 75 deletions

File tree

android-agent/api/android-agent.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ public final class io/opentelemetry/android/agent/dsl/HttpExportConfiguration {
4242
public final class io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration {
4343
public fun <init> ()V
4444
public final fun diskBuffering (Lkotlin/jvm/functions/Function1;)V
45+
public final fun getClock ()Lio/opentelemetry/sdk/common/Clock;
4546
public final fun globalAttributes (Lkotlin/jvm/functions/Function0;)V
4647
public final fun httpExport (Lkotlin/jvm/functions/Function1;)V
4748
public final fun instrumentations (Lkotlin/jvm/functions/Function1;)V
4849
public final fun session (Lkotlin/jvm/functions/Function1;)V
50+
public final fun setClock (Lio/opentelemetry/sdk/common/Clock;)V
4951
}
5052

5153
public final class io/opentelemetry/android/agent/dsl/SessionConfiguration {

android-agent/src/main/kotlin/io/opentelemetry/android/agent/OpenTelemetryRumInitializer.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.opentelemetry.android.session.SessionProvider
2020
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter
2121
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter
2222
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter
23+
import io.opentelemetry.sdk.common.Clock
2324

2425
@OptIn(Incubating::class)
2526
object OpenTelemetryRumInitializer {
@@ -61,7 +62,8 @@ object OpenTelemetryRumInitializer {
6162
val metricsEndpoint = cfg.exportConfig.metricsEndpoint()
6263
return RumBuilder
6364
.builder(ctx, cfg.rumConfig)
64-
.setSessionProvider(createSessionProvider(ctx, sessionConfig))
65+
.setSessionProvider(createSessionProvider(ctx, sessionConfig, cfg.clock))
66+
.setClock(cfg.clock)
6567
.addSpanExporterCustomizer {
6668
OtlpHttpSpanExporter
6769
.builder()
@@ -95,9 +97,10 @@ object OpenTelemetryRumInitializer {
9597
private fun createSessionProvider(
9698
context: Context,
9799
sessionConfig: SessionConfig,
100+
clock: Clock,
98101
): SessionProvider {
99-
val timeoutHandler = SessionIdTimeoutHandler(sessionConfig)
102+
val timeoutHandler = SessionIdTimeoutHandler(sessionConfig, clock)
100103
Services.get(context).appLifecycle.registerListener(timeoutHandler)
101-
return SessionManager.create(timeoutHandler, sessionConfig)
104+
return SessionManager.create(timeoutHandler, sessionConfig, clock)
102105
}
103106
}

android-agent/src/main/kotlin/io/opentelemetry/android/agent/dsl/OpenTelemetryConfiguration.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import io.opentelemetry.android.agent.dsl.instrumentation.InstrumentationConfigu
1010
import io.opentelemetry.android.config.OtelRumConfig
1111
import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig
1212
import io.opentelemetry.api.common.Attributes
13+
import io.opentelemetry.sdk.common.Clock
1314

1415
/**
1516
* Type-safe config DSL that controls how OpenTelemetry should behave.
@@ -28,6 +29,11 @@ class OpenTelemetryConfiguration internal constructor(
2829
diskBuffering {}
2930
}
3031

32+
/**
33+
* Configures the [Clock] used for capturing telemetry.
34+
*/
35+
var clock: Clock = Clock.getDefault()
36+
3137
/**
3238
* Configures how OpenTelemetry should export telemetry over HTTP.
3339
*/

android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionIdTimeoutHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ internal class SessionIdTimeoutHandler(
3636

3737
// for testing
3838
@OptIn(Incubating::class)
39-
internal constructor(sessionConfig: SessionConfig) : this(
40-
Clock.getDefault(),
39+
internal constructor(sessionConfig: SessionConfig, clock: Clock) : this(
40+
clock,
4141
sessionConfig.backgroundInactivityTimeout,
4242
)
4343

android-agent/src/main/kotlin/io/opentelemetry/android/agent/session/SessionManager.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import kotlin.random.Random
1717
import kotlin.time.Duration
1818

1919
internal class SessionManager(
20-
private val clock: Clock = Clock.getDefault(),
20+
private val clock: Clock,
2121
private val sessionStorage: SessionStorage = InMemorySessionStorage(),
2222
private val timeoutHandler: SessionIdTimeoutHandler,
2323
private val idGenerator: SessionIdGenerator = DefaultSessionIdGenerator(Random.Default),
@@ -85,10 +85,12 @@ internal class SessionManager(
8585
fun create(
8686
timeoutHandler: SessionIdTimeoutHandler,
8787
sessionConfig: SessionConfig,
88+
clock: Clock,
8889
): SessionManager =
8990
SessionManager(
9091
timeoutHandler = timeoutHandler,
9192
maxSessionLifetime = sessionConfig.maxLifetime,
93+
clock = clock,
9294
)
9395
}
9496
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android.agent.dsl
7+
8+
import io.opentelemetry.sdk.common.Clock
9+
import org.junit.Assert.assertSame
10+
import org.junit.Test
11+
12+
class ClockConfigTest {
13+
@Test
14+
fun testDefaults() {
15+
val otelConfig = OpenTelemetryConfiguration()
16+
assertSame(Clock.getDefault(), otelConfig.clock)
17+
}
18+
19+
@Test
20+
fun testOverride() {
21+
val fakeClock =
22+
object : Clock {
23+
override fun now(): Long = 0
24+
25+
override fun nanoTime(): Long = 0
26+
}
27+
val otelConfig =
28+
OpenTelemetryConfiguration().apply {
29+
clock = fakeClock
30+
}
31+
assertSame(fakeClock, otelConfig.clock)
32+
}
33+
}

android-agent/src/test/kotlin/io/opentelemetry/android/agent/session/SessionManagerTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.mockk.verify
1616
import io.mockk.verifyOrder
1717
import io.opentelemetry.android.session.Session
1818
import io.opentelemetry.android.session.SessionObserver
19+
import io.opentelemetry.sdk.common.Clock
1920
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat
2021
import io.opentelemetry.sdk.testing.time.TestClock
2122
import org.junit.jupiter.api.BeforeEach
@@ -160,6 +161,7 @@ internal class SessionManagerTest {
160161
SessionManager(
161162
timeoutHandler = timeoutHandler,
162163
maxSessionLifetime = MAX_SESSION_LIFETIME.hours,
164+
clock = Clock.getDefault(),
163165
)
164166

165167
// When - access session ID twice, should be same

core/api/core.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class io/opentelemetry/android/OpenTelemetryRumBuilder {
2424
public final fun addTracerProviderCustomizer (Ljava/util/function/BiFunction;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
2525
public final fun build ()Lio/opentelemetry/android/OpenTelemetryRum;
2626
public final fun mergeResource (Lio/opentelemetry/sdk/resources/Resource;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
27+
public final fun setClock (Lio/opentelemetry/sdk/common/Clock;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
2728
public final fun setExportScheduleHandler (Lio/opentelemetry/android/features/diskbuffering/scheduler/ExportScheduleHandler;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
2829
public final fun setResource (Lio/opentelemetry/sdk/resources/Resource;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;
2930
public final fun setSessionProvider (Lio/opentelemetry/android/session/SessionProvider;)Lio/opentelemetry/android/OpenTelemetryRumBuilder;

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

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import io.opentelemetry.exporter.logging.LoggingMetricExporter
4747
import io.opentelemetry.exporter.logging.LoggingSpanExporter
4848
import io.opentelemetry.exporter.logging.SystemOutLogRecordExporter
4949
import io.opentelemetry.sdk.OpenTelemetrySdk
50+
import io.opentelemetry.sdk.common.Clock
5051
import io.opentelemetry.sdk.logs.LogRecordProcessor
5152
import io.opentelemetry.sdk.logs.SdkLoggerProvider
5253
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder
@@ -91,6 +92,7 @@ class OpenTelemetryRumBuilder internal constructor(
9192
): OpenTelemetryRumBuilder = OpenTelemetryRumBuilder(context, config)
9293
}
9394

95+
private var clock: Clock = Clock.getDefault()
9496
private val tracerProviderCustomizers: MutableList<BiFunction<SdkTracerProviderBuilder, Context, SdkTracerProviderBuilder>> =
9597
mutableListOf()
9698
private val meterProviderCustomizers: MutableList<BiFunction<SdkMeterProviderBuilder, Context, SdkMeterProviderBuilder>> =
@@ -281,6 +283,14 @@ class OpenTelemetryRumBuilder internal constructor(
281283
return this
282284
}
283285

286+
/**
287+
* Sets a custom [Clock] implementation.
288+
*/
289+
fun setClock(clock: Clock): OpenTelemetryRumBuilder {
290+
this.clock = clock
291+
return this
292+
}
293+
284294
/**
285295
* Creates a new instance of [OpenTelemetryRum] with the settings of this [OpenTelemetryRum].
286296
*
@@ -306,15 +316,21 @@ class OpenTelemetryRumBuilder internal constructor(
306316
sessionProvider,
307317
context,
308318
bufferDelegatingSpanExporter,
319+
clock,
309320
),
310321
).setLoggerProvider(
311322
buildLoggerProvider(
312323
sessionProvider,
313324
context,
314325
bufferDelegatingLogExporter,
326+
clock,
315327
),
316328
).setMeterProvider(
317-
buildMeterProvider(context, bufferDelegatingMetricExporter),
329+
buildMeterProvider(
330+
context,
331+
bufferDelegatingMetricExporter,
332+
clock,
333+
),
318334
).setPropagators(buildFinalPropagators())
319335
.build()
320336

@@ -325,7 +341,7 @@ class OpenTelemetryRumBuilder internal constructor(
325341
)
326342

327343
val delegate =
328-
SdkPreconfiguredRumBuilder(context, sdk, sessionProvider, config)
344+
SdkPreconfiguredRumBuilder(context, sdk, sessionProvider, config, clock)
329345
.setShutdownHook {
330346
exportScheduleHandler?.disable()
331347
services.close()
@@ -501,11 +517,13 @@ class OpenTelemetryRumBuilder internal constructor(
501517
sessionProvider: SessionProvider,
502518
context: Context,
503519
spanExporter: SpanExporter,
520+
clock: Clock,
504521
): SdkTracerProvider {
505522
var tracerProviderBuilder =
506523
SdkTracerProvider
507524
.builder()
508525
.setResource(resource)
526+
.setClock(clock)
509527
.addSpanProcessor(SessionIdSpanAppender(sessionProvider))
510528

511529
val batchSpanProcessor = BatchSpanProcessor.builder(spanExporter).build()
@@ -521,11 +539,13 @@ class OpenTelemetryRumBuilder internal constructor(
521539
sessionProvider: SessionProvider,
522540
context: Context,
523541
logsExporter: LogRecordExporter,
542+
clock: Clock,
524543
): SdkLoggerProvider {
525544
var loggerProviderBuilder =
526545
SdkLoggerProvider
527546
.builder()
528547
.setResource(resource)
548+
.setClock(clock)
529549
.addLogRecordProcessor(SessionIdLogRecordAppender(sessionProvider))
530550
.addLogRecordProcessor(
531551
GlobalAttributesLogRecordAppender(
@@ -559,10 +579,15 @@ class OpenTelemetryRumBuilder internal constructor(
559579
private fun buildMeterProvider(
560580
context: Context,
561581
metricExporter: MetricExporter,
582+
clock: Clock,
562583
): SdkMeterProvider {
563584
val reader: MetricReader = PeriodicMetricReader.create(metricExporter)
564585
var meterProviderBuilder =
565-
SdkMeterProvider.builder().registerMetricReader(reader).setResource(resource)
586+
SdkMeterProvider
587+
.builder()
588+
.registerMetricReader(reader)
589+
.setResource(resource)
590+
.setClock(clock)
566591
for (customizer in meterProviderCustomizers) {
567592
meterProviderBuilder = customizer.apply(meterProviderBuilder, context)
568593
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.content.Context
99
import io.opentelemetry.android.config.OtelRumConfig
1010
import io.opentelemetry.android.session.SessionProvider
1111
import io.opentelemetry.sdk.OpenTelemetrySdk
12+
import io.opentelemetry.sdk.common.Clock
1213

1314
object RumBuilder {
1415
/**
@@ -55,6 +56,7 @@ object RumBuilder {
5556
openTelemetrySdk,
5657
sessionProvider,
5758
config,
59+
Clock.getDefault(),
5860
)
5961

6062
/**

0 commit comments

Comments
 (0)