Skip to content

Commit eddcca9

Browse files
committed
wip: alter span implementation
1 parent a0bebc5 commit eddcca9

File tree

26 files changed

+186
-95
lines changed

26 files changed

+186
-95
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
1111
import io.embrace.android.embracesdk.internal.spans.InternalTracer
1212
import io.embrace.opentelemetry.kotlin.ExperimentalApi
1313
import io.embrace.opentelemetry.kotlin.logging.Logger
14+
import io.embrace.opentelemetry.kotlin.tracing.Tracer
1415
import io.opentelemetry.api.OpenTelemetry
15-
import io.opentelemetry.api.trace.Tracer
1616
import io.opentelemetry.api.trace.TracerProvider
1717

1818
/**

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import io.embrace.android.embracesdk.internal.spans.InternalTracer
2525
import io.embrace.android.embracesdk.internal.utils.EmbTrace
2626
import io.embrace.opentelemetry.kotlin.ExperimentalApi
2727
import io.embrace.opentelemetry.kotlin.logging.Logger
28+
import io.embrace.opentelemetry.kotlin.tracing.Tracer
2829
import io.opentelemetry.api.OpenTelemetry
29-
import io.opentelemetry.api.trace.Tracer
3030
import io.opentelemetry.api.trace.TracerProvider
3131
import io.opentelemetry.sdk.common.Clock
3232

@@ -76,7 +76,12 @@ internal class OpenTelemetryModuleImpl(
7676
}
7777

7878
override val sdkTracer: Tracer by lazy {
79-
otelSdkWrapper.sdkTracer
79+
EmbTrace.trace("otel-tracer-init") {
80+
otelSdkWrapper.kotlinApi.tracerProvider.getTracer(
81+
name = otelSdkConfig.sdkName,
82+
version = otelSdkConfig.sdkVersion,
83+
)
84+
}
8085
}
8186

8287
private var sensitiveKeysBehavior: SensitiveKeysBehavior? = null
@@ -158,7 +163,7 @@ internal class OpenTelemetryModuleImpl(
158163

159164
override val externalTracerProvider: TracerProvider by lazy {
160165
EmbTracerProvider(
161-
sdkTracerProvider = otelSdkWrapper.sdkTracerProvider,
166+
sdkTracerProvider = otelSdkWrapper.kotlinApi.tracerProvider,
162167
spanService = spanService,
163168
clock = openTelemetryClock,
164169
)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpanImpl.Compa
3131
import io.embrace.android.embracesdk.internal.telemetry.TelemetryService
3232
import io.embrace.android.embracesdk.spans.EmbraceSpan
3333
import io.embrace.android.embracesdk.spans.ErrorCode
34-
import io.opentelemetry.api.trace.Tracer
34+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
3535
import io.opentelemetry.sdk.common.Clock
3636
import org.junit.Assert.assertEquals
3737
import org.junit.Assert.assertFalse
@@ -42,14 +42,15 @@ import org.junit.Assert.assertTrue
4242
import org.junit.Before
4343
import org.junit.Test
4444

45+
@OptIn(ExperimentalApi::class)
4546
internal class CurrentSessionSpanImplTests {
4647
private lateinit var spanRepository: SpanRepository
4748
private lateinit var spanSink: SpanSink
4849
private lateinit var telemetryService: TelemetryService
4950
private lateinit var openTelemetryClock: Clock
5051
private lateinit var currentSessionSpan: CurrentSessionSpanImpl
5152
private lateinit var spanService: SpanService
52-
private lateinit var tracer: Tracer
53+
private lateinit var tracer: io.embrace.opentelemetry.kotlin.tracing.Tracer
5354
private val clock = FakeClock(1000L)
5455

5556
@Before

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/impl/EmbSpanBuilder.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.embrace.android.embracesdk.internal.otel.impl
22

33
import io.embrace.android.embracesdk.internal.otel.spans.OtelSpanCreator
44
import io.embrace.android.embracesdk.internal.otel.spans.SpanService
5+
import io.embrace.android.embracesdk.internal.otel.toOtelKotlin
56
import io.opentelemetry.api.common.AttributeKey
67
import io.opentelemetry.api.common.Attributes
78
import io.opentelemetry.api.trace.Span
@@ -49,7 +50,7 @@ class EmbSpanBuilder(
4950
setAttribute(key.key, value.toString())
5051

5152
override fun setSpanKind(spanKind: SpanKind): SpanBuilder {
52-
otelSpanStartArgs.spanKind = spanKind
53+
otelSpanStartArgs.spanKind = spanKind.toOtelKotlin()
5354
return this
5455
}
5556

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/impl/EmbTracer.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import io.embrace.android.embracesdk.internal.otel.schema.EmbType
44
import io.embrace.android.embracesdk.internal.otel.sdk.otelSpanCreator
55
import io.embrace.android.embracesdk.internal.otel.spans.SpanService
66
import io.embrace.android.embracesdk.internal.otel.spans.getEmbraceSpan
7+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
78
import io.opentelemetry.api.trace.SpanBuilder
89
import io.opentelemetry.api.trace.Tracer
910
import io.opentelemetry.context.Context
1011
import io.opentelemetry.sdk.common.Clock
1112

13+
@OptIn(ExperimentalApi::class)
1214
class EmbTracer(
13-
private val sdkTracer: Tracer,
15+
private val sdkTracer: io.embrace.opentelemetry.kotlin.tracing.Tracer,
1416
private val spanService: SpanService,
1517
private val clock: Clock,
1618
) : Tracer {

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/impl/EmbTracerProvider.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ package io.embrace.android.embracesdk.internal.otel.impl
22

33
import io.embrace.android.embracesdk.internal.otel.sdk.TracerKey
44
import io.embrace.android.embracesdk.internal.otel.spans.SpanService
5+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
56
import io.opentelemetry.api.trace.Tracer
67
import io.opentelemetry.api.trace.TracerBuilder
78
import io.opentelemetry.api.trace.TracerProvider
89
import io.opentelemetry.sdk.common.Clock
910
import java.util.concurrent.ConcurrentHashMap
1011

12+
@OptIn(ExperimentalApi::class)
1113
class EmbTracerProvider(
12-
private val sdkTracerProvider: TracerProvider,
14+
private val sdkTracerProvider: io.embrace.opentelemetry.kotlin.tracing.TracerProvider,
1315
private val spanService: SpanService,
1416
private val clock: Clock,
1517
) : TracerProvider {
@@ -45,14 +47,11 @@ class EmbTracerProvider(
4547
return tracer
4648
}
4749

48-
private fun buildSdkTracer(key: TracerKey): Tracer {
49-
val builder = sdkTracerProvider.tracerBuilder(key.instrumentationScopeName)
50-
key.instrumentationScopeVersion?.apply {
51-
builder.setInstrumentationVersion(this)
52-
}
53-
key.schemaUrl?.apply {
54-
builder.setSchemaUrl(this)
55-
}
56-
return builder.build()
50+
private fun buildSdkTracer(key: TracerKey): io.embrace.opentelemetry.kotlin.tracing.Tracer {
51+
return sdkTracerProvider.getTracer(
52+
name = key.instrumentationScopeName,
53+
version = key.instrumentationScopeVersion,
54+
schemaUrl = key.schemaUrl
55+
)
5756
}
5857
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import io.embrace.android.embracesdk.internal.otel.spans.OtelSpanCreator
55
import io.embrace.android.embracesdk.internal.otel.spans.OtelSpanStartArgs
66
import io.embrace.android.embracesdk.spans.AutoTerminationMode
77
import io.embrace.android.embracesdk.spans.EmbraceSpan
8-
import io.opentelemetry.api.trace.Tracer
8+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
9+
import io.embrace.opentelemetry.kotlin.tracing.Tracer
910

1011
/**
1112
* Creates a new [OtelSpanCreator] that marks the resulting span as private if [internal] is true
1213
*/
14+
@OptIn(ExperimentalApi::class)
1315
fun Tracer.otelSpanCreator(
1416
name: String,
1517
type: EmbType,

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/spans/EmbraceSpanFactoryImpl.kt

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,24 @@ import io.embrace.android.embracesdk.internal.otel.sdk.hasEmbraceAttribute
1616
import io.embrace.android.embracesdk.internal.otel.sdk.id.OtelIds
1717
import io.embrace.android.embracesdk.internal.otel.sdk.otelSpanCreator
1818
import io.embrace.android.embracesdk.internal.otel.sdk.setEmbraceAttribute
19+
import io.embrace.android.embracesdk.internal.otel.sdk.toStringMap
1920
import io.embrace.android.embracesdk.internal.otel.toEmbracePayload
20-
import io.embrace.android.embracesdk.internal.otel.toOtelJava
21+
import io.embrace.android.embracesdk.internal.otel.wrapper.KotlinSpanContextWrapper
2122
import io.embrace.android.embracesdk.internal.payload.Attribute
2223
import io.embrace.android.embracesdk.internal.utils.EmbTrace
2324
import io.embrace.android.embracesdk.internal.utils.truncatedStacktraceText
2425
import io.embrace.android.embracesdk.spans.AutoTerminationMode
2526
import io.embrace.android.embracesdk.spans.EmbraceSpan
2627
import io.embrace.android.embracesdk.spans.EmbraceSpanEvent
2728
import io.embrace.android.embracesdk.spans.ErrorCode
29+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
2830
import io.embrace.opentelemetry.kotlin.StatusCode
31+
import io.embrace.opentelemetry.kotlin.k2j.tracing.SpanAdapter
32+
import io.embrace.opentelemetry.kotlin.k2j.tracing.SpanContextAdapter
33+
import io.embrace.opentelemetry.kotlin.tracing.Span
34+
import io.embrace.opentelemetry.kotlin.tracing.Tracer
2935
import io.opentelemetry.api.common.Attributes
30-
import io.opentelemetry.api.trace.Span
3136
import io.opentelemetry.api.trace.SpanContext
32-
import io.opentelemetry.api.trace.Tracer
3337
import io.opentelemetry.context.Context
3438
import io.opentelemetry.sdk.common.Clock
3539
import io.opentelemetry.semconv.ExceptionAttributes
@@ -40,6 +44,7 @@ import java.util.concurrent.TimeUnit
4044
import java.util.concurrent.atomic.AtomicInteger
4145
import java.util.concurrent.atomic.AtomicReference
4246

47+
@OptIn(ExperimentalApi::class)
4348
class EmbraceSpanFactoryImpl(
4449
private val tracer: Tracer,
4550
private val openTelemetryClock: Clock,
@@ -83,6 +88,7 @@ class EmbraceSpanFactoryImpl(
8388
}
8489
}
8590

91+
@OptIn(ExperimentalApi::class)
8692
private class EmbraceSpanImpl(
8793
private val otelSpanCreator: OtelSpanCreator,
8894
private val openTelemetryClock: Clock,
@@ -126,7 +132,7 @@ private class EmbraceSpanImpl(
126132
override val parent: EmbraceSpan? = otelSpanCreator.spanStartArgs.parentContext.getEmbraceSpan()
127133

128134
override val spanContext: SpanContext?
129-
get() = startedSpan.get()?.spanContext
135+
get() = startedSpan.get()?.spanContext?.let(::KotlinSpanContextWrapper)
130136

131137
override val traceId: String?
132138
get() = spanContext?.traceId
@@ -135,7 +141,7 @@ private class EmbraceSpanImpl(
135141
get() = spanContext?.spanId
136142

137143
override val isRecording: Boolean
138-
get() = startedSpan.get()?.isRecording == true
144+
get() = startedSpan.get()?.isRecording() == true
139145

140146
override fun start(startTimeMs: Long?): Boolean {
141147
EmbTrace.trace("span-start") {
@@ -151,15 +157,15 @@ private class EmbraceSpanImpl(
151157
val newSpan = EmbTrace.trace("otel-span-start") {
152158
otelSpanCreator.startSpan(attemptedStartTimeMs)
153159
}
154-
if (newSpan.isRecording) {
160+
if (newSpan.isRecording()) {
155161
startedSpan.set(newSpan)
156162
} else {
157163
return false
158164
}
159165

160166
spanRepository.trackStartedSpan(this)
161167
updatedName?.let { newName ->
162-
newSpan.updateName(newName)
168+
newSpan.name = newName
163169
}
164170
spanStartTimeMs = attemptedStartTimeMs
165171
spanRepository.notifySpanUpdate()
@@ -196,7 +202,7 @@ private class EmbraceSpanImpl(
196202
}
197203

198204
EmbTrace.trace("otel-span-end") {
199-
spanToStop.end(attemptedEndTimeMs, TimeUnit.MILLISECONDS)
205+
spanToStop.end(TimeUnit.MILLISECONDS.toNanos(attemptedEndTimeMs))
200206
}
201207

202208
successful = !isRecording
@@ -272,7 +278,7 @@ private class EmbraceSpanImpl(
272278
startedSpan.get()?.let { sdkSpan ->
273279
synchronized(startedSpan) {
274280
status = statusCode.toEmbracePayload()
275-
sdkSpan.setStatus(statusCode.toOtelJava(), description)
281+
sdkSpan.status = statusCode
276282
spanRepository.notifySpanUpdate()
277283
}
278284
}
@@ -301,7 +307,7 @@ private class EmbraceSpanImpl(
301307
synchronized(startedSpan) {
302308
if (!spanStarted() || isRecording) {
303309
updatedName = newName
304-
startedSpan.get()?.updateName(newName)
310+
startedSpan.get()?.name = newName
305311
spanRepository.notifySpanUpdate()
306312
return true
307313
}
@@ -322,7 +328,11 @@ private class EmbraceSpanImpl(
322328
}
323329

324330
override fun asNewContext(): Context? = startedSpan.get()?.run {
325-
otelSpanCreator.spanStartArgs.parentContext.with(this)
331+
if (this is SpanAdapter) {
332+
otelSpanCreator.spanStartArgs.parentContext.with(this.impl)
333+
} else {
334+
null
335+
}
326336
}
327337

328338
override fun snapshot(): io.embrace.android.embracesdk.internal.payload.Span? {
@@ -405,10 +415,10 @@ private class EmbraceSpanImpl(
405415

406416
private fun populateAttributes(spanToStop: Span) {
407417
systemAttributes.forEach { systemAttribute ->
408-
spanToStop.setAttribute(systemAttribute.key, systemAttribute.value)
418+
spanToStop.setStringAttribute(systemAttribute.key, systemAttribute.value)
409419
}
410420
customAttributes.redactIfSensitive().forEach { attribute ->
411-
spanToStop.setAttribute(attribute.key, attribute.value)
421+
spanToStop.setStringAttribute(attribute.key, attribute.value)
412422
}
413423
}
414424

@@ -423,14 +433,17 @@ private class EmbraceSpanImpl(
423433
}
424434

425435
spanToStop.addEvent(
426-
event.name,
427-
eventAttributes,
428-
event.timestampNanos,
429-
TimeUnit.NANOSECONDS
430-
)
436+
name = event.name,
437+
timestamp = event.timestampNanos
438+
) {
439+
eventAttributes.toStringMap().forEach { entry ->
440+
setStringAttribute(entry.key, entry.value)
441+
}
442+
}
431443
}
432444
}
433445

446+
@Suppress("UNUSED_PARAMETER", "UNUSED_VARIABLE")
434447
private fun populateLinks(spanToStop: Span) {
435448
val redactedCustomLinks = customLinks.map { it.copy(attributes = it.attributes.redactIfSensitive()) }
436449

@@ -440,7 +453,11 @@ private class EmbraceSpanImpl(
440453
} else {
441454
Attributes.empty()
442455
}
443-
spanToStop.addLink(it.spanContext, linkAttributes)
456+
spanToStop.addLink(SpanContextAdapter(it.spanContext)) {
457+
linkAttributes.toStringMap().forEach { entry ->
458+
setStringAttribute(entry.key, entry.value)
459+
}
460+
}
444461
}
445462
}
446463
}
Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
package io.embrace.android.embracesdk.internal.otel.spans
22

3-
import io.opentelemetry.api.trace.Span
4-
import io.opentelemetry.api.trace.Tracer
5-
import io.opentelemetry.context.Context
3+
import io.embrace.android.embracesdk.internal.otel.wrapper.KotlinContextWrapper
4+
import io.embrace.opentelemetry.kotlin.ExperimentalApi
5+
import io.embrace.opentelemetry.kotlin.k2j.tracing.SpanContextAdapter
6+
import io.embrace.opentelemetry.kotlin.tracing.Span
7+
import io.embrace.opentelemetry.kotlin.tracing.SpanKind
8+
import io.embrace.opentelemetry.kotlin.tracing.Tracer
69
import java.util.concurrent.TimeUnit
710

11+
@OptIn(ExperimentalApi::class)
812
class OtelSpanCreator(
913
val spanStartArgs: OtelSpanStartArgs,
1014
private val tracer: Tracer,
1115
) {
1216

1317
internal fun startSpan(startTimeMs: Long): Span {
1418
with(spanStartArgs) {
15-
val builder = tracer.spanBuilder(spanName)
16-
if (parentContext == Context.root()) {
17-
builder.setNoParent()
18-
} else {
19-
builder.setParent(parentContext)
20-
}
21-
22-
spanKind?.let(builder::setSpanKind)
23-
builder.setStartTimestamp(startTimeMs, TimeUnit.MILLISECONDS)
24-
return builder.startSpan()
19+
return tracer.createSpan(
20+
name = spanName,
21+
parent = spanStartArgs.parentContext.getEmbraceSpan()?.spanContext?.let(::SpanContextAdapter),
22+
spanKind = spanKind ?: SpanKind.INTERNAL,
23+
startTimestamp = TimeUnit.MILLISECONDS.toNanos(startTimeMs),
24+
context = KotlinContextWrapper(spanStartArgs.parentContext),
25+
)
2526
}
2627
}
2728
}

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/spans/OtelSpanStartArgs.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import io.embrace.android.embracesdk.internal.otel.schema.PrivateSpan
66
import io.embrace.android.embracesdk.internal.otel.sdk.toEmbraceObjectName
77
import io.embrace.android.embracesdk.spans.AutoTerminationMode
88
import io.embrace.android.embracesdk.spans.EmbraceSpan
9-
import io.opentelemetry.api.trace.SpanKind
9+
import io.embrace.opentelemetry.kotlin.tracing.SpanKind
1010
import io.opentelemetry.context.Context
1111

1212
/**

0 commit comments

Comments
 (0)