Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import io.embrace.android.embracesdk.internal.payload.Span
import io.embrace.opentelemetry.kotlin.StatusCode
import io.embrace.opentelemetry.kotlin.tracing.SpanKind
import io.opentelemetry.api.common.AttributeKey

internal fun StatusCode.toOtelJava(): io.opentelemetry.api.trace.StatusCode = when (this) {
Expand All @@ -16,6 +17,14 @@
io.opentelemetry.api.trace.StatusCode.ERROR -> StatusCode.Error(null)
}

fun io.opentelemetry.api.trace.SpanKind.toOtelKotlin(): SpanKind = when (this) {
io.opentelemetry.api.trace.SpanKind.SERVER -> SpanKind.SERVER
io.opentelemetry.api.trace.SpanKind.CLIENT -> SpanKind.CLIENT
io.opentelemetry.api.trace.SpanKind.PRODUCER -> SpanKind.PRODUCER
io.opentelemetry.api.trace.SpanKind.CONSUMER -> SpanKind.CONSUMER
io.opentelemetry.api.trace.SpanKind.INTERNAL -> SpanKind.INTERNAL

Check warning on line 25 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/KotlinApiConversions.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/KotlinApiConversions.kt#L21-L25

Added lines #L21 - L25 were not covered by tests
}

fun StatusCode.toEmbracePayload(): Span.Status = when (this) {
is StatusCode.Error -> io.embrace.android.embracesdk.internal.payload.Span.Status.ERROR
StatusCode.Ok -> io.embrace.android.embracesdk.internal.payload.Span.Status.OK
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import io.embrace.android.embracesdk.internal.otel.toOtelKotlin
import io.embrace.android.embracesdk.internal.payload.Link
import io.embrace.android.embracesdk.internal.utils.isBlankish
import io.embrace.opentelemetry.kotlin.ExperimentalApi
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
import io.opentelemetry.api.common.AttributesBuilder
Expand Down Expand Up @@ -79,6 +80,10 @@
fun Span.setEmbraceAttribute(embraceAttribute: EmbraceAttribute): Span =
this@setEmbraceAttribute.setEmbraceAttribute(embraceAttribute.key, embraceAttribute.value)

@OptIn(ExperimentalApi::class)
fun io.embrace.opentelemetry.kotlin.tracing.Span.setEmbraceAttribute(embraceAttribute: EmbraceAttribute) =
setStringAttribute(embraceAttribute.key.name, embraceAttribute.value)

Check warning on line 85 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/sdk/OtelExt.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/sdk/OtelExt.kt#L85

Added line #L85 was not covered by tests

fun SpanData.toEmbraceSpanData(): EmbraceSpanData = EmbraceSpanData(
traceId = spanContext.traceId,
spanId = spanContext.spanId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.embrace.android.embracesdk.internal.otel.wrapper

import io.embrace.opentelemetry.kotlin.tracing.SpanContext
import io.opentelemetry.api.trace.TraceFlags
import io.opentelemetry.api.trace.TraceState

class KotlinSpanContextWrapper(
private val impl: SpanContext,

Check warning on line 8 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt#L7-L8

Added lines #L7 - L8 were not covered by tests
) : io.opentelemetry.api.trace.SpanContext {

override fun getTraceId(): String = impl.traceId
override fun getSpanId(): String = impl.spanId
override fun isRemote(): Boolean = impl.isRemote

Check warning on line 13 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt#L11-L13

Added lines #L11 - L13 were not covered by tests

override fun getTraceFlags(): TraceFlags = KotlinTraceFlagsWrapper(impl.traceFlags)
override fun getTraceState(): TraceState = KotlinTraceStateWrapper(impl.traceState)

Check warning on line 16 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinSpanContextWrapper.kt#L15-L16

Added lines #L15 - L16 were not covered by tests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.embrace.android.embracesdk.internal.otel.wrapper

import io.embrace.opentelemetry.kotlin.tracing.TraceFlags

class KotlinTraceFlagsWrapper(
private val impl: TraceFlags,

Check warning on line 6 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt#L5-L6

Added lines #L5 - L6 were not covered by tests
) : io.opentelemetry.api.trace.TraceFlags {
override fun isSampled(): Boolean = impl.isSampled

Check warning on line 8 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt#L8

Added line #L8 was not covered by tests

// FIXME: temporary. requires change in opentelemetry-kotlin first
override fun asHex(): String = throw UnsupportedOperationException()

Check warning on line 11 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt#L11

Added line #L11 was not covered by tests

override fun asByte(): Byte = asHex().toByte()

Check warning on line 13 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceFlagsWrapper.kt#L13

Added line #L13 was not covered by tests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.embrace.android.embracesdk.internal.otel.wrapper

import android.os.Build
import io.embrace.opentelemetry.kotlin.tracing.TraceState
import io.opentelemetry.api.trace.TraceStateBuilder
import java.util.function.BiConsumer

class KotlinTraceStateWrapper(
private val impl: TraceState,

Check warning on line 9 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L8-L9

Added lines #L8 - L9 were not covered by tests
) : io.opentelemetry.api.trace.TraceState {

override fun get(key: String): String? = impl.get(key)

Check warning on line 12 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L12

Added line #L12 was not covered by tests

override fun size(): Int = impl.asMap().size

Check warning on line 14 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L14

Added line #L14 was not covered by tests

override fun isEmpty(): Boolean = impl.asMap().isEmpty()

Check warning on line 16 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L16

Added line #L16 was not covered by tests

override fun forEach(consumer: BiConsumer<String, String>) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
impl.asMap().forEach(consumer)

Check warning on line 20 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L20

Added line #L20 was not covered by tests
}
}

override fun asMap(): MutableMap<String, String> = impl.asMap().toMutableMap()

Check warning on line 24 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L24

Added line #L24 was not covered by tests

override fun toBuilder(): TraceStateBuilder {
val builder = io.opentelemetry.api.trace.TraceState.builder()
asMap().forEach { entry ->
builder.put(entry.key, entry.value)
}
return builder

Check warning on line 31 in embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-otel/src/main/kotlin/io/embrace/android/embracesdk/internal/otel/wrapper/KotlinTraceStateWrapper.kt#L27-L31

Added lines #L27 - L31 were not covered by tests
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package io.embrace.android.embracesdk.fakes

import io.embrace.opentelemetry.kotlin.ExperimentalApi
import io.embrace.opentelemetry.kotlin.StatusCode
import io.embrace.opentelemetry.kotlin.attributes.AttributeContainer
import io.embrace.opentelemetry.kotlin.tracing.Link
import io.embrace.opentelemetry.kotlin.tracing.SpanContext
import io.embrace.opentelemetry.kotlin.tracing.SpanEvent
import io.embrace.opentelemetry.kotlin.tracing.SpanKind

@ExperimentalApi
class FakeKotlinSpan(
override var name: String,
override var parent: SpanContext?,
val spanKind: SpanKind,
val startTimestamp: Long?,
) : io.embrace.opentelemetry.kotlin.tracing.Span {

private var inProgress = true

override fun attributes(): Map<String, Any> = emptyMap()

// FIXME: temp, requires access to SpanContextAdapter in opentelemetry-kotlin
override val spanContext: SpanContext = throw UnsupportedOperationException()

override var status: StatusCode = StatusCode.Unset

override fun addEvent(name: String, timestamp: Long?, action: AttributeContainer.() -> Unit) {
}

override fun addLink(spanContext: SpanContext, action: AttributeContainer.() -> Unit) {
}

override fun end() {
inProgress = false
}

override fun end(timestamp: Long) {
inProgress = false
}

override fun events(): List<SpanEvent> = emptyList()

override fun isRecording(): Boolean = inProgress

override fun links(): List<Link> = emptyList()

override fun setBooleanAttribute(key: String, value: Boolean) {
}

override fun setBooleanListAttribute(key: String, value: List<Boolean>) {
}

override fun setDoubleAttribute(key: String, value: Double) {
}

override fun setDoubleListAttribute(key: String, value: List<Double>) {
}

override fun setLongAttribute(key: String, value: Long) {
}

override fun setLongListAttribute(key: String, value: List<Long>) {
}

override fun setStringAttribute(key: String, value: String) {
}

override fun setStringListAttribute(key: String, value: List<String>) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.embrace.android.embracesdk.fakes

import io.embrace.opentelemetry.kotlin.ExperimentalApi
import io.embrace.opentelemetry.kotlin.tracing.Span
import io.embrace.opentelemetry.kotlin.tracing.SpanContext
import io.embrace.opentelemetry.kotlin.tracing.SpanKind
import io.embrace.opentelemetry.kotlin.tracing.SpanRelationships

@ExperimentalApi
class FakeKotlinTracer : io.embrace.opentelemetry.kotlin.tracing.Tracer {

override fun createSpan(
name: String,
parent: SpanContext?,
spanKind: SpanKind,
startTimestamp: Long?,
action: SpanRelationships.() -> Unit,
): Span = FakeKotlinSpan(
name,
parent,
spanKind,
startTimestamp,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.embrace.android.embracesdk.fakes

import io.embrace.opentelemetry.kotlin.ExperimentalApi
import io.embrace.opentelemetry.kotlin.attributes.AttributeContainer
import io.embrace.opentelemetry.kotlin.tracing.Tracer

@ExperimentalApi
class FakeKotlinTracerProvider : io.embrace.opentelemetry.kotlin.tracing.TracerProvider {
override fun getTracer(
name: String,
version: String?,
schemaUrl: String?,
attributes: AttributeContainer.() -> Unit,
): Tracer = FakeKotlinTracer()
}