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
@@ -1,15 +1,9 @@
package io.embrace.android.embracesdk.internal.otel.payload

import io.embrace.android.embracesdk.internal.clock.millisToNanos
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
import io.embrace.android.embracesdk.internal.otel.schema.AppTerminationCause
import io.embrace.android.embracesdk.internal.otel.schema.EmbType
import io.embrace.android.embracesdk.internal.otel.schema.ErrorCodeAttribute
import io.embrace.android.embracesdk.internal.otel.sdk.id.OtelIds
import io.embrace.android.embracesdk.internal.otel.sdk.setEmbraceAttribute
import io.embrace.android.embracesdk.internal.otel.spans.EmbraceLinkData
import io.embrace.android.embracesdk.internal.otel.spans.EmbraceSpanData
import io.embrace.android.embracesdk.internal.otel.spans.hasEmbraceAttribute
import io.embrace.android.embracesdk.internal.otel.toEmbracePayload
import io.embrace.android.embracesdk.internal.payload.Attribute
import io.embrace.android.embracesdk.internal.payload.Link
Expand Down Expand Up @@ -76,19 +70,3 @@ fun Span.toEmbracePayload(): EmbraceSpanData {
links = links ?: emptyList()
)
}

fun Span.toFailedSpan(endTimeMs: Long): Span {
val newAttributes = mutableMapOf<String, String>().apply {
setEmbraceAttribute(ErrorCodeAttribute.Failure)
if (hasEmbraceAttribute(EmbType.Ux.Session)) {
setEmbraceAttribute(AppTerminationCause.Crash)
}
}

return copy(
endTimeNanos = endTimeMs.millisToNanos(),
parentSpanId = parentSpanId ?: OtelJavaSpanId.getInvalid(),
status = Span.Status.ERROR,
attributes = newAttributes.map { Attribute(it.key, it.value) }.plus(attributes ?: emptyList())
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import io.embrace.android.embracesdk.internal.otel.spans.EmbraceSpanData
import io.embrace.android.embracesdk.internal.otel.spans.EmbraceSpanData.Companion.fromEventData
import io.embrace.android.embracesdk.internal.otel.toOtelKotlin
import io.embrace.android.embracesdk.internal.payload.Link
import io.embrace.android.embracesdk.internal.payload.Span.Status
import io.embrace.android.embracesdk.internal.utils.isBlankish
import io.embrace.opentelemetry.kotlin.ExperimentalApi
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaAttributeKey
Expand All @@ -18,7 +17,6 @@ import io.embrace.opentelemetry.kotlin.aliases.OtelJavaLinkData
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaLogRecordBuilder
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaSpan
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaSpanData
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaStatusCode
import io.embrace.opentelemetry.kotlin.tracing.model.Span

/**
Expand Down Expand Up @@ -94,11 +92,3 @@ fun OtelJavaSpanData.toEmbraceSpanData(): EmbraceSpanData = EmbraceSpanData(

fun OtelJavaAttributes.hasEmbraceAttribute(embraceAttribute: EmbraceAttribute): Boolean =
asMap()[embraceAttribute.key.asOtelAttributeKey()] == embraceAttribute.value

fun OtelJavaStatusCode.toStatus(): Status {
return when (this) {
OtelJavaStatusCode.UNSET -> Status.UNSET
OtelJavaStatusCode.OK -> Status.OK
OtelJavaStatusCode.ERROR -> Status.ERROR
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,19 @@ import io.embrace.android.embracesdk.arch.assertIsTypePerformance
import io.embrace.android.embracesdk.arch.assertNotPrivateSpan
import io.embrace.android.embracesdk.arch.assertSuccessful
import io.embrace.android.embracesdk.fakes.FakeSpanData
import io.embrace.android.embracesdk.internal.clock.millisToNanos
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
import io.embrace.android.embracesdk.internal.otel.schema.AppTerminationCause
import io.embrace.android.embracesdk.internal.otel.schema.EmbType
import io.embrace.android.embracesdk.internal.otel.schema.ErrorCodeAttribute
import io.embrace.android.embracesdk.internal.otel.sdk.setEmbraceAttribute
import io.embrace.android.embracesdk.internal.otel.sdk.toEmbraceSpanData
import io.embrace.android.embracesdk.internal.otel.spans.hasEmbraceAttribute
import io.embrace.android.embracesdk.internal.otel.toOtelJava
import io.embrace.android.embracesdk.internal.payload.Attribute
import io.embrace.android.embracesdk.internal.payload.Span
import io.embrace.android.embracesdk.spans.ErrorCode
import io.embrace.opentelemetry.kotlin.aliases.OtelJavaSpanId
import org.junit.Assert.assertEquals
import org.junit.Test

Expand Down Expand Up @@ -64,4 +72,20 @@ internal class SpanMapperTest {
assertEquals(attributesOfFailedSpan[it.key], it.data)
}
}

private fun Span.toFailedSpan(endTimeMs: Long): Span {
val newAttributes = mutableMapOf<String, String>().apply {
setEmbraceAttribute(ErrorCodeAttribute.Failure)
if (hasEmbraceAttribute(EmbType.Ux.Session)) {
setEmbraceAttribute(AppTerminationCause.Crash)
}
}

return copy(
endTimeNanos = endTimeMs.millisToNanos(),
parentSpanId = parentSpanId ?: OtelJavaSpanId.getInvalid(),
status = Span.Status.ERROR,
attributes = newAttributes.map { Attribute(it.key, it.value) }.plus(attributes ?: emptyList())
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@ internal class OTelExportTest {
}
},
otelExportAssertion = {
val log = awaitLogs(1) { it.attributes.get(EmbType.System.Log.key.asOtelAttributeKey()) == EmbType.System.Log.value }
val log = awaitLogs(1) {
it.attributes.get(EmbType.System.Log.key.asOtelAttributeKey()) == EmbType.System.Log.value
}
with(log.single()) {
assertEquals("test message", body.asString())
assertEquals(logTimestampNanos, timestampEpochNanos)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import io.embrace.android.embracesdk.assertions.toMap
import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig
import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig
import io.embrace.android.embracesdk.internal.clock.nanosToMillis
import io.embrace.android.embracesdk.internal.otel.attrs.asOtelAttributeKey
import io.embrace.android.embracesdk.internal.otel.attrs.embFreeDiskBytes
import io.embrace.android.embracesdk.internal.otel.sdk.findAttributeValue
import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule
Expand Down Expand Up @@ -108,7 +107,7 @@ internal class SessionApiTest {

// Attributes that are unstable that we should not try to verify
val ignoredAttributes = setOf(
embFreeDiskBytes.asOtelAttributeKey().key
embFreeDiskBytes.name
).plus(validateExistenceOnly)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import io.embrace.android.embracesdk.internal.config.remote.RemoteConfig
import io.embrace.android.embracesdk.internal.logging.InternalErrorType
import io.embrace.android.embracesdk.internal.otel.attrs.embAeiNumber
import io.embrace.android.embracesdk.internal.otel.attrs.embCrashNumber
import io.embrace.android.embracesdk.internal.otel.attrs.asOtelAttributeKey
import io.embrace.android.embracesdk.internal.payload.Log
import io.embrace.android.embracesdk.internal.otel.sdk.findAttributeValue
import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule
Expand Down Expand Up @@ -332,8 +331,8 @@ internal class AeiFeatureTest {
"description" to description,
"reason" to reason,
"emb.type" to "sys.exit",
embCrashNumber.asOtelAttributeKey().key to crashNumber,
embAeiNumber.asOtelAttributeKey().key to aeiNumber,
embCrashNumber.name to crashNumber,
embAeiNumber.name to aeiNumber,
)
)
assertEquals(trace, body)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import io.embrace.android.embracesdk.internal.otel.attrs.embSessionNumber
import io.embrace.android.embracesdk.internal.otel.attrs.embSessionStartType
import io.embrace.android.embracesdk.internal.otel.attrs.embState
import io.embrace.android.embracesdk.internal.otel.attrs.embTerminated
import io.embrace.android.embracesdk.internal.otel.attrs.asOtelAttributeKey
import io.embrace.android.embracesdk.internal.payload.ApplicationState
import io.embrace.android.embracesdk.internal.payload.Span
import io.embrace.android.embracesdk.internal.otel.sdk.findAttributeValue
Expand Down Expand Up @@ -85,7 +84,7 @@ internal class BackgroundActivityDisabledTest {
assertEquals("error", body)
attributes?.assertMatches(
mapOf(
embState.asOtelAttributeKey().key to "background"
embState.name to "background"
)
)
assertNull(attributes?.findAttributeValue(SessionIncubatingAttributes.SESSION_ID.key))
Expand All @@ -94,7 +93,7 @@ internal class BackgroundActivityDisabledTest {
assertEquals("info", body)
attributes?.assertMatches(
mapOf(
embState.asOtelAttributeKey().key to "background"
embState.name to "background"
)
)
assertNull(attributes?.findAttributeValue(SessionIncubatingAttributes.SESSION_ID.key))
Expand All @@ -103,7 +102,7 @@ internal class BackgroundActivityDisabledTest {
assertEquals("warning", body)
attributes?.assertMatches(
mapOf(
embState.asOtelAttributeKey().key to "foreground",
embState.name to "foreground",
SessionIncubatingAttributes.SESSION_ID.key to sessions[1].getSessionId()
)
)
Expand All @@ -114,7 +113,7 @@ internal class BackgroundActivityDisabledTest {
assertEquals("sent-after-session", body)
attributes?.assertMatches(
mapOf(
embState.asOtelAttributeKey().key to "foreground",
embState.name to "foreground",
SessionIncubatingAttributes.SESSION_ID.key to secondSession.getSessionId()
)
)
Expand Down Expand Up @@ -198,8 +197,8 @@ internal class BackgroundActivityDisabledTest {
)

assertEquals(
sessionSpan1.attributes?.findAttributeValue(embProcessIdentifier.asOtelAttributeKey().key),
sessionSpan2.attributes?.findAttributeValue(embProcessIdentifier.asOtelAttributeKey().key)
sessionSpan1.attributes?.findAttributeValue(embProcessIdentifier.name),
sessionSpan2.attributes?.findAttributeValue(embProcessIdentifier.name)
)
}
)
Expand All @@ -216,18 +215,18 @@ internal class BackgroundActivityDisabledTest {
assertEquals(endMs, endTimeNanos?.nanosToMillis())
attributes?.assertMatches(
mapOf(
embSessionNumber.asOtelAttributeKey().key to sessionNumber,
embSequenceId.asOtelAttributeKey().key to sequenceId,
embColdStart.asOtelAttributeKey().key to coldStart,
embState.asOtelAttributeKey().key to "foreground",
embCleanExit.asOtelAttributeKey().key to "true",
embTerminated.asOtelAttributeKey().key to "false",
embSessionStartType.asOtelAttributeKey().key to "state",
embSessionEndType.asOtelAttributeKey().key to "state",
embSessionNumber.name to sessionNumber,
embSequenceId.name to sequenceId,
embColdStart.name to coldStart,
embState.name to "foreground",
embCleanExit.name to "true",
embTerminated.name to "false",
embSessionStartType.name to "state",
embSessionEndType.name to "state",
)
)
with(checkNotNull(attributes)) {
assertFalse(findAttributeValue(embProcessIdentifier.asOtelAttributeKey().key).isNullOrBlank())
assertFalse(findAttributeValue(embProcessIdentifier.name).isNullOrBlank())
assertFalse(findAttributeValue(SessionIncubatingAttributes.SESSION_ID.key).isNullOrBlank())
}
}
Expand Down