Skip to content

Commit b3bb024

Browse files
Merge pull request #2330 from embrace-io/otel-sdk-wrapper
Move otel out of core module
2 parents 901da15 + 2317ef5 commit b3bb024

File tree

14 files changed

+66
-104
lines changed

14 files changed

+66
-104
lines changed

embrace-android-core/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ dependencies {
3636

3737
compileOnly(platform(libs.opentelemetry.bom))
3838
compileOnly(libs.opentelemetry.api)
39-
compileOnly(libs.opentelemetry.sdk)
4039
compileOnly(libs.opentelemetry.semconv)
4140
compileOnly(libs.opentelemetry.semconv.incubating)
4241
implementation(libs.lifecycle.runtime)

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/EssentialServiceModuleImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class EssentialServiceModuleImpl(
8282

8383
override val logWriter: LogWriter by singleton {
8484
LogWriterImpl(
85-
logger = openTelemetryModule.logger,
85+
logger = openTelemetryModule.otelSdkWrapper.logger,
8686
sessionIdTracker = sessionIdTracker,
8787
processStateService = processStateService,
8888
clock = initModule.clock,

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/OpenTelemetryModule.kt

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,18 @@ import io.embrace.android.embracesdk.internal.clock.nanosToMillis
55
import io.embrace.android.embracesdk.internal.config.behavior.SensitiveKeysBehavior
66
import io.embrace.android.embracesdk.internal.otel.config.OtelSdkConfig
77
import io.embrace.android.embracesdk.internal.otel.logs.LogSink
8+
import io.embrace.android.embracesdk.internal.otel.sdk.OtelSdkWrapper
89
import io.embrace.android.embracesdk.internal.otel.spans.SpanRepository
910
import io.embrace.android.embracesdk.internal.otel.spans.SpanService
1011
import io.embrace.android.embracesdk.internal.otel.spans.SpanSink
1112
import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpan
1213
import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
1314
import io.embrace.android.embracesdk.internal.spans.InternalTracer
1415
import io.embrace.opentelemetry.kotlin.Clock
15-
import io.embrace.opentelemetry.kotlin.ExperimentalApi
16-
import io.embrace.opentelemetry.kotlin.OpenTelemetry
17-
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaOpenTelemetry
18-
import io.embrace.opentelemetry.kotlin.logging.Logger
19-
import io.embrace.opentelemetry.kotlin.tracing.Tracer
2016

2117
/**
2218
* Module that instantiates various OpenTelemetry related components
2319
*/
24-
@OptIn(ExperimentalApi::class)
2520
interface OpenTelemetryModule {
2621

2722
/**
@@ -39,11 +34,6 @@ interface OpenTelemetryModule {
3934
*/
4035
val spanSink: SpanSink
4136

42-
/**
43-
* An instance of the OpenTelemetry component obtained from the wrapped SDK to create spans
44-
*/
45-
val sdkTracer: Tracer
46-
4737
/**
4838
* Component that manages and provides access to the current session span
4939
*/
@@ -64,27 +54,15 @@ interface OpenTelemetryModule {
6454
*/
6555
val internalTracer: InternalTracer
6656

67-
/**
68-
* An instance of the OpenTelemetry component obtained from the wrapped SDK to create log records
69-
*/
70-
val logger: Logger
71-
7257
/**
7358
* Provides storage for completed logs that have not been forwarded yet to the delivery service
7459
*/
7560
val logSink: LogSink
7661

7762
/**
78-
* Provides an [OpenTelemetry] instance that can be used by instrumentation libraries to record telemetry as if it were using the
79-
* Embrace APIs. Currently, only the APIs related [Tracer] have operational implementations. Every other method will return no-op
80-
* implementations that records no data.
81-
*/
82-
val openTelemetryJava: OtelJavaOpenTelemetry
83-
84-
/**
85-
* Provides an OpenTelemetry instance that provides a Kotlin API.
63+
* Provides a wrapper around commonly used OTel APIs in the SDK.
8664
*/
87-
val openTelemetryKotlin: OpenTelemetry
65+
val otelSdkWrapper: OtelSdkWrapper
8866

8967
/**
9068
* OpenTelemetry SDK compatible clock based on the internal Embrace clock instance

embrace-android-core/src/main/kotlin/io/embrace/android/embracesdk/internal/injection/OpenTelemetryModuleImpl.kt

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import io.embrace.android.embracesdk.internal.config.behavior.REDACTED_LABEL
55
import io.embrace.android.embracesdk.internal.config.behavior.SensitiveKeysBehavior
66
import io.embrace.android.embracesdk.internal.otel.config.OtelSdkConfig
77
import io.embrace.android.embracesdk.internal.otel.impl.EmbClock
8-
import io.embrace.android.embracesdk.internal.otel.impl.EmbOtelJavaOpenTelemetry
9-
import io.embrace.android.embracesdk.internal.otel.impl.EmbOtelJavaTracerProvider
108
import io.embrace.android.embracesdk.internal.otel.logs.LogSink
119
import io.embrace.android.embracesdk.internal.otel.logs.LogSinkImpl
1210
import io.embrace.android.embracesdk.internal.otel.sdk.DataValidator
@@ -24,11 +22,6 @@ import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
2422
import io.embrace.android.embracesdk.internal.spans.InternalTracer
2523
import io.embrace.android.embracesdk.internal.utils.EmbTrace
2624
import io.embrace.opentelemetry.kotlin.ExperimentalApi
27-
import io.embrace.opentelemetry.kotlin.OpenTelemetry
28-
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaOpenTelemetry
29-
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaTracerProvider
30-
import io.embrace.opentelemetry.kotlin.logging.Logger
31-
import io.embrace.opentelemetry.kotlin.tracing.Tracer
3225

3326
@OptIn(ExperimentalApi::class)
3427
internal class OpenTelemetryModuleImpl(
@@ -63,12 +56,13 @@ internal class OpenTelemetryModuleImpl(
6356
)
6457
}
6558

66-
private val otelSdkWrapper: OtelSdkWrapper by lazy {
59+
override val otelSdkWrapper: OtelSdkWrapper by lazy {
6760
EmbTrace.trace("otel-sdk-wrapper-init") {
6861
try {
6962
OtelSdkWrapper(
7063
otelClock = openTelemetryClock,
71-
configuration = otelSdkConfig
64+
configuration = otelSdkConfig,
65+
spanService = spanService
7266
)
7367
} catch (exc: NoClassDefFoundError) {
7468
throw LinkageError(
@@ -81,10 +75,6 @@ internal class OpenTelemetryModuleImpl(
8175
}
8276
}
8377

84-
override val sdkTracer: Tracer by lazy {
85-
otelSdkWrapper.sdkTracer
86-
}
87-
8878
private var sensitiveKeysBehavior: SensitiveKeysBehavior? = null
8979

9080
override fun applyConfiguration(sensitiveKeysBehavior: SensitiveKeysBehavior, bypassValidation: Boolean) {
@@ -100,7 +90,7 @@ internal class OpenTelemetryModuleImpl(
10090

10191
private val embraceSpanFactory: EmbraceSpanFactory by singleton {
10292
EmbraceSpanFactoryImpl(
103-
tracer = sdkTracer,
93+
tracer = otelSdkWrapper.sdkTracer,
10494
openTelemetryClock = openTelemetryClock,
10595
spanRepository = spanRepository,
10696
dataValidator = dataValidator,
@@ -144,36 +134,10 @@ internal class OpenTelemetryModuleImpl(
144134
)
145135
}
146136

147-
override val logger: Logger by lazy {
148-
EmbTrace.trace("otel-logger-init") {
149-
otelSdkWrapper.kotlinApi.loggerProvider.getLogger(
150-
name = otelSdkConfig.sdkName
151-
)
152-
}
153-
}
154-
155137
override val logSink: LogSink by lazy {
156138
LogSinkImpl()
157139
}
158140

159-
override val openTelemetryJava: OtelJavaOpenTelemetry by lazy {
160-
EmbOtelJavaOpenTelemetry(
161-
traceProviderSupplier = { externalTracerProvider }
162-
)
163-
}
164-
165-
override val openTelemetryKotlin: OpenTelemetry by lazy {
166-
otelSdkWrapper.kotlinApi
167-
}
168-
169-
private val externalTracerProvider: OtelJavaTracerProvider by lazy {
170-
EmbOtelJavaTracerProvider(
171-
sdkTracerProvider = otelSdkWrapper.kotlinApi.tracerProvider,
172-
spanService = spanService,
173-
clock = openTelemetryClock,
174-
)
175-
}
176-
177141
fun redactionFunction(key: String, value: String): String {
178142
return if (sensitiveKeysBehavior?.isSensitiveKey(key) == true) {
179143
REDACTED_LABEL
Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,4 @@
11
package io.embrace.android.embracesdk.internal.injection
22

3-
import android.content.Context
4-
import io.embrace.android.embracesdk.internal.logging.EmbLogger
5-
6-
/**
7-
* Function that returns an instance of [OpenTelemetryModule]. Matches the signature of the constructor for [OpenTelemetryModuleImpl]
8-
*/
9-
typealias OpenTelemetryModuleSupplier = (
10-
context: Context,
11-
logger: EmbLogger,
12-
) -> OpenTelemetryModule
13-
143
fun createOpenTelemetryModule(initModule: InitModule): OpenTelemetryModule =
154
OpenTelemetryModuleImpl(initModule)
Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
11
package io.embrace.android.embracesdk.internal.injection
22

3-
import io.embrace.android.embracesdk.internal.otel.impl.EmbOtelJavaOpenTelemetry
43
import io.embrace.android.embracesdk.internal.otel.logs.LogSinkImpl
54
import io.embrace.android.embracesdk.internal.otel.spans.EmbraceSpanService
65
import io.embrace.android.embracesdk.internal.otel.spans.SpanSinkImpl
76
import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpanImpl
8-
import io.embrace.opentelemetry.kotlin.ExperimentalApi
9-
import org.junit.Assert.assertNotNull
107
import org.junit.Assert.assertTrue
118
import org.junit.Test
129

1310
internal class OpenTelemetryModuleImplTest {
14-
@OptIn(ExperimentalApi::class)
1511
@Test
1612
fun testInitModuleImplDefaults() {
1713
val openTelemetryModule: OpenTelemetryModule = OpenTelemetryModuleImpl(InitModuleImpl())
1814
assertTrue(openTelemetryModule.spanSink is SpanSinkImpl)
1915
assertTrue(openTelemetryModule.spanService is EmbraceSpanService)
2016
assertTrue(openTelemetryModule.currentSessionSpan is CurrentSessionSpanImpl)
2117
assertTrue(openTelemetryModule.logSink is LogSinkImpl)
22-
assertTrue(openTelemetryModule.openTelemetryJava is EmbOtelJavaOpenTelemetry)
23-
assertNotNull(openTelemetryModule.logger)
24-
assertNotNull(openTelemetryModule.sdkTracer)
25-
assertNotNull(openTelemetryModule.openTelemetryKotlin)
2618
}
2719
}

embrace-android-core/src/test/java/io/embrace/android/embracesdk/internal/spans/CurrentSessionSpanImplTests.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ internal class CurrentSessionSpanImplTests {
6464
telemetryService = initModule.telemetryService
6565
openTelemetryClock = initModule.openTelemetryModule.openTelemetryClock
6666
currentSessionSpan = initModule.openTelemetryModule.currentSessionSpan as CurrentSessionSpanImpl
67-
tracer = initModule.openTelemetryModule.sdkTracer
67+
tracer = initModule.openTelemetryModule.otelSdkWrapper.sdkTracer
6868
spanService = initModule.openTelemetryModule.spanService
6969
spanService.initializeService(clock.now())
7070
}

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/sdk/OtelSdkWrapper.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ import io.embrace.android.embracesdk.internal.otel.config.OtelSdkConfig
66
import io.embrace.android.embracesdk.internal.otel.config.getMaxTotalAttributeCount
77
import io.embrace.android.embracesdk.internal.otel.config.getMaxTotalEventCount
88
import io.embrace.android.embracesdk.internal.otel.config.getMaxTotalLinkCount
9+
import io.embrace.android.embracesdk.internal.otel.impl.EmbOtelJavaOpenTelemetry
10+
import io.embrace.android.embracesdk.internal.otel.impl.EmbOtelJavaTracerProvider
911
import io.embrace.android.embracesdk.internal.otel.logs.DefaultLogRecordProcessor
1012
import io.embrace.android.embracesdk.internal.otel.spans.DefaultSpanProcessor
13+
import io.embrace.android.embracesdk.internal.otel.spans.SpanService
1114
import io.embrace.android.embracesdk.internal.utils.EmbTrace
1215
import io.embrace.opentelemetry.kotlin.Clock
1316
import io.embrace.opentelemetry.kotlin.ExperimentalApi
1417
import io.embrace.opentelemetry.kotlin.OpenTelemetry
1518
import io.embrace.opentelemetry.kotlin.OpenTelemetryInstance
19+
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaOpenTelemetry
20+
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaTracerProvider
1621
import io.embrace.opentelemetry.kotlin.kotlinApi
22+
import io.embrace.opentelemetry.kotlin.logging.Logger
1723
import io.embrace.opentelemetry.kotlin.tracing.Tracer
1824

1925
/**
@@ -25,6 +31,7 @@ import io.embrace.opentelemetry.kotlin.tracing.Tracer
2531
class OtelSdkWrapper(
2632
otelClock: Clock,
2733
configuration: OtelSdkConfig,
34+
spanService: SpanService,
2835
limits: OtelLimitsConfig = InstrumentedConfigImpl.otelLimits,
2936
) {
3037
init {
@@ -41,6 +48,15 @@ class OtelSdkWrapper(
4148
}
4249
}
4350

51+
val logger: Logger by lazy {
52+
EmbTrace.trace("otel-logger-init") {
53+
kotlinApi.loggerProvider.getLogger(
54+
name = configuration.sdkName,
55+
version = configuration.sdkVersion,
56+
)
57+
}
58+
}
59+
4460
val kotlinApi: OpenTelemetry by lazy {
4561
OpenTelemetryInstance.kotlinApi(
4662
loggerProvider = {
@@ -67,4 +83,18 @@ class OtelSdkWrapper(
6783
clock = otelClock
6884
)
6985
}
86+
87+
val openTelemetryJava: OtelJavaOpenTelemetry by lazy {
88+
EmbOtelJavaOpenTelemetry(
89+
traceProviderSupplier = { externalTracerProvider }
90+
)
91+
}
92+
93+
private val externalTracerProvider: OtelJavaTracerProvider by lazy {
94+
EmbOtelJavaTracerProvider(
95+
sdkTracerProvider = kotlinApi.tracerProvider,
96+
spanService = spanService,
97+
clock = otelClock,
98+
)
99+
}
70100
}

embrace-android-otel/src/test/kotlin/io/embrace/android/embracesdk/internal/otel/sdk/OpenTelemetrySdkTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io.embrace.android.embracesdk.fakes.FakeClock
55
import io.embrace.android.embracesdk.fakes.FakeOtelJavaLogRecordExporter
66
import io.embrace.android.embracesdk.fakes.FakeOtelJavaSpanExporter
77
import io.embrace.android.embracesdk.fakes.FakeOtelKotlinClock
8+
import io.embrace.android.embracesdk.fakes.FakeSpanService
89
import io.embrace.android.embracesdk.internal.SystemInfo
910
import io.embrace.android.embracesdk.internal.otel.config.OtelSdkConfig
1011
import io.embrace.android.embracesdk.internal.otel.logs.LogSink
@@ -47,7 +48,8 @@ internal class OpenTelemetrySdkTest {
4748

4849
sdk = OtelSdkWrapper(
4950
otelClock = FakeOtelKotlinClock(FakeClock()),
50-
configuration = configuration
51+
configuration = configuration,
52+
spanService = FakeSpanService()
5153
)
5254
}
5355

embrace-android-otel/src/test/kotlin/io/embrace/android/embracesdk/internal/otel/spans/EmbraceSpanServiceTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.embrace.android.embracesdk.arch.assertIsTypePerformance
44
import io.embrace.android.embracesdk.fakes.FakeClock
55
import io.embrace.android.embracesdk.fakes.FakeEmbraceSpanFactory
66
import io.embrace.android.embracesdk.fakes.FakeOtelKotlinClock
7+
import io.embrace.android.embracesdk.fakes.FakeSpanService
78
import io.embrace.android.embracesdk.internal.SystemInfo
89
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
910
import io.embrace.android.embracesdk.internal.otel.config.OtelSdkConfig
@@ -51,6 +52,7 @@ internal class EmbraceSpanServiceTest {
5152
val otelSdkWrapper = OtelSdkWrapper(
5253
otelClock = fakeClock,
5354
configuration = otelSdkConfig,
55+
spanService = FakeSpanService()
5456
)
5557
val dataValidator = DataValidator()
5658

0 commit comments

Comments
 (0)