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
7 changes: 7 additions & 0 deletions embrace-android-api/api/embrace-android-api.api
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ public abstract interface class io/embrace/android/embracesdk/internal/api/OTelA
public abstract fun addLogRecordExporter (Lio/opentelemetry/sdk/logs/export/LogRecordExporter;)V
public abstract fun addSpanExporter (Lio/opentelemetry/sdk/trace/export/SpanExporter;)V
public abstract fun getOpenTelemetry ()Lio/opentelemetry/api/OpenTelemetry;
public abstract fun setResourceAttribute (Lio/opentelemetry/api/common/AttributeKey;Ljava/lang/String;)V
public abstract fun setResourceAttribute (Ljava/lang/String;Ljava/lang/String;)V
}

public final class io/embrace/android/embracesdk/internal/api/OTelApi$DefaultImpls {
public static fun setResourceAttribute (Lio/embrace/android/embracesdk/internal/api/OTelApi;Lio/opentelemetry/api/common/AttributeKey;Ljava/lang/String;)V
}

public abstract interface class io/embrace/android/embracesdk/internal/api/SdkApi : io/embrace/android/embracesdk/internal/api/BreadcrumbApi, io/embrace/android/embracesdk/internal/api/EmbraceAndroidApi, io/embrace/android/embracesdk/internal/api/InstrumentationApi, io/embrace/android/embracesdk/internal/api/InternalWebViewApi, io/embrace/android/embracesdk/internal/api/LogsApi, io/embrace/android/embracesdk/internal/api/NetworkRequestApi, io/embrace/android/embracesdk/internal/api/OTelApi, io/embrace/android/embracesdk/internal/api/SdkStateApi, io/embrace/android/embracesdk/internal/api/SessionApi, io/embrace/android/embracesdk/internal/api/UserApi, io/embrace/android/embracesdk/spans/TracingApi {
Expand All @@ -123,6 +129,7 @@ public final class io/embrace/android/embracesdk/internal/api/SdkApi$DefaultImpl
public static fun recordSpan (Lio/embrace/android/embracesdk/internal/api/SdkApi;Ljava/lang/String;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static fun recordSpan (Lio/embrace/android/embracesdk/internal/api/SdkApi;Ljava/lang/String;Lio/embrace/android/embracesdk/spans/EmbraceSpan;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static fun recordSpan (Lio/embrace/android/embracesdk/internal/api/SdkApi;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public static fun setResourceAttribute (Lio/embrace/android/embracesdk/internal/api/SdkApi;Lio/opentelemetry/api/common/AttributeKey;Ljava/lang/String;)V
public static fun startSpan (Lio/embrace/android/embracesdk/internal/api/SdkApi;Ljava/lang/String;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;)Lio/embrace/android/embracesdk/spans/EmbraceSpan;
public static fun startSpan (Lio/embrace/android/embracesdk/internal/api/SdkApi;Ljava/lang/String;Lio/embrace/android/embracesdk/spans/EmbraceSpan;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;)Lio/embrace/android/embracesdk/spans/EmbraceSpan;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package io.embrace.android.embracesdk.internal.api

import io.embrace.android.embracesdk.annotation.InternalApi
import io.opentelemetry.api.OpenTelemetry
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.sdk.logs.export.LogRecordExporter
import io.opentelemetry.sdk.resources.Resource
import io.opentelemetry.sdk.trace.export.SpanExporter

/**
Expand All @@ -27,4 +29,21 @@ public interface OTelApi {
* model.
*/
public fun getOpenTelemetry(): OpenTelemetry

/**
* Set an attribute on the [Resource] used by the OTel SDK instance with the given [AttributeKey] key and String value.
* The value set will override any value set previously or by the Embrace SDK.
* This must be called before the SDK is started in order for it to take effect.
*/
public fun setResourceAttribute(
key: AttributeKey<String>,
value: String
): Unit = setResourceAttribute(key.key, value)

/**
* Set an attribute on the [Resource] used by the OTel SDK instance with the given String key and value.
* The value set will override any value set previously or by the Embrace SDK.
* This must be called before the SDK is started in order for it to take effect.
*/
public fun setResourceAttribute(key: String, value: String)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import io.embrace.android.embracesdk.internal.spans.SpanSink
import io.opentelemetry.sdk.logs.LogRecordProcessor
import io.opentelemetry.sdk.logs.export.LogRecordExporter
import io.opentelemetry.sdk.resources.Resource
import io.opentelemetry.sdk.resources.ResourceBuilder
import io.opentelemetry.sdk.trace.SpanProcessor
import io.opentelemetry.sdk.trace.export.SpanExporter
import io.opentelemetry.semconv.ServiceAttributes
Expand All @@ -29,7 +30,7 @@ class OpenTelemetryConfiguration(
) {
val embraceSdkName: String = BuildConfig.LIBRARY_PACKAGE_NAME
val embraceSdkVersion: String = BuildConfig.VERSION_NAME
val resource: Resource = Resource.getDefault().toBuilder()
val resourceBuilder: ResourceBuilder = Resource.getDefault().toBuilder()
.put(ServiceAttributes.SERVICE_NAME, embraceSdkName)
.put(ServiceAttributes.SERVICE_VERSION, embraceSdkVersion)
.put(OsIncubatingAttributes.OS_NAME, systemInfo.osName)
Expand All @@ -42,7 +43,6 @@ class OpenTelemetryConfiguration(
.put(DeviceIncubatingAttributes.DEVICE_MODEL_NAME, systemInfo.deviceModel)
.put(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_NAME, embraceSdkName)
.put(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION, embraceSdkVersion)
.build()

/**
* Unique ID generated for an instance of the app process and not related to the actual process ID assigned by the OS.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.sdk.OpenTelemetrySdk
import io.opentelemetry.sdk.common.Clock
import io.opentelemetry.sdk.logs.SdkLoggerProvider
import io.opentelemetry.sdk.resources.Resource
import io.opentelemetry.sdk.trace.SdkTracerProvider
import io.opentelemetry.sdk.trace.SpanLimits

Expand All @@ -33,7 +34,7 @@ internal class OpenTelemetrySdk(
Systrace.traceSynchronous("otel-tracer-provider-init") {
SdkTracerProvider
.builder()
.addResource(configuration.resource)
.addResource(resource)
.addSpanProcessor(configuration.spanProcessor)
.setSpanLimits(
SpanLimits
Expand All @@ -57,6 +58,10 @@ internal class OpenTelemetrySdk(

fun getOpenTelemetryLogger(): Logger = logger

private val resource: Resource by lazy {
configuration.resourceBuilder.build()
}

private val sdk: OpenTelemetrySdk by lazy {
Systrace.traceSynchronous("otel-sdk-init") {
OpenTelemetrySdk
Expand All @@ -65,7 +70,7 @@ internal class OpenTelemetrySdk(
.setLoggerProvider(
SdkLoggerProvider
.builder()
.addResource(configuration.resource)
.addResource(resource)
.addLogRecordProcessor(configuration.logProcessor)
.setClock(openTelemetryClock)
.build()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,38 +31,40 @@ internal class OpenTelemetryConfigurationTest {
systemInfo = systemInfo
)

assertEquals(configuration.embraceSdkName, configuration.resource.getAttribute(ServiceAttributes.SERVICE_NAME))
val resource = configuration.resourceBuilder.build()

assertEquals(configuration.embraceSdkName, resource.getAttribute(ServiceAttributes.SERVICE_NAME))
assertEquals(
configuration.embraceSdkVersion,
configuration.resource.getAttribute(ServiceAttributes.SERVICE_VERSION)
resource.getAttribute(ServiceAttributes.SERVICE_VERSION)
)
assertEquals(
configuration.embraceSdkName,
configuration.resource.getAttribute(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_NAME)
resource.getAttribute(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_NAME)
)
assertEquals(
configuration.embraceSdkVersion,
configuration.resource.getAttribute(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION)
resource.getAttribute(TelemetryIncubatingAttributes.TELEMETRY_DISTRO_VERSION)
)
assertEquals(systemInfo.osName, configuration.resource.getAttribute(OsIncubatingAttributes.OS_NAME))
assertEquals(systemInfo.osVersion, configuration.resource.getAttribute(OsIncubatingAttributes.OS_VERSION))
assertEquals(systemInfo.osType, configuration.resource.getAttribute(OsIncubatingAttributes.OS_TYPE))
assertEquals(systemInfo.osBuild, configuration.resource.getAttribute(OsIncubatingAttributes.OS_BUILD_ID))
assertEquals(systemInfo.osName, resource.getAttribute(OsIncubatingAttributes.OS_NAME))
assertEquals(systemInfo.osVersion, resource.getAttribute(OsIncubatingAttributes.OS_VERSION))
assertEquals(systemInfo.osType, resource.getAttribute(OsIncubatingAttributes.OS_TYPE))
assertEquals(systemInfo.osBuild, resource.getAttribute(OsIncubatingAttributes.OS_BUILD_ID))
assertEquals(
systemInfo.androidOsApiLevel,
configuration.resource.getAttribute(AndroidIncubatingAttributes.ANDROID_OS_API_LEVEL)
resource.getAttribute(AndroidIncubatingAttributes.ANDROID_OS_API_LEVEL)
)
assertEquals(
systemInfo.deviceManufacturer,
configuration.resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MANUFACTURER)
resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MANUFACTURER)
)
assertEquals(
systemInfo.deviceModel,
configuration.resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MODEL_IDENTIFIER)
resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MODEL_IDENTIFIER)
)
assertEquals(
systemInfo.deviceModel,
configuration.resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MODEL_NAME)
resource.getAttribute(DeviceIncubatingAttributes.DEVICE_MODEL_NAME)
)
}
}
2 changes: 2 additions & 0 deletions embrace-android-sdk/api/embrace-android-sdk.api
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public final class io/embrace/android/embracesdk/Embrace : io/embrace/android/em
public fun recordSpan (Ljava/lang/String;Lio/embrace/android/embracesdk/spans/EmbraceSpan;Ljava/util/Map;Ljava/util/List;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public fun recordSpan (Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Lio/embrace/android/embracesdk/spans/AutoTerminationMode;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
public fun removeSessionProperty (Ljava/lang/String;)Z
public fun setResourceAttribute (Lio/opentelemetry/api/common/AttributeKey;Ljava/lang/String;)V
public fun setResourceAttribute (Ljava/lang/String;Ljava/lang/String;)V
public fun setUserEmail (Ljava/lang/String;)V
public fun setUserIdentifier (Ljava/lang/String;)V
public fun setUsername (Ljava/lang/String;)V
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package io.embrace.android.embracesdk.testcases

import androidx.test.ext.junit.runners.AndroidJUnit4
import io.embrace.android.embracesdk.Severity
import io.embrace.android.embracesdk.fakes.FakeSpanExporter
import io.embrace.android.embracesdk.internal.arch.schema.EmbType
import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule
import io.opentelemetry.semconv.ServiceAttributes
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
internal class OTelExportTest {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I merged the Log and Span exporter tests because it makes sense to test them all as one feature


@Rule
@JvmField
val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule()

@Test
fun `session span exported`() {
val fakeSpanExporter = FakeSpanExporter()
testRule.runTest(
preSdkStartAction = {
embrace.setResourceAttribute(ServiceAttributes.SERVICE_NAME, "my.app")
embrace.setResourceAttribute("test", "foo")
embrace.addSpanExporter(fakeSpanExporter)
},
testCaseAction = {
recordSession {
embrace.startSpan("test-span")?.stop()
}
},
assertAction = {
assertNotNull(getSingleSessionEnvelope())
val exportedSpans = fakeSpanExporter.exportedSpans.associateBy { it.name }
assertNotNull(exportedSpans["emb-session"])
},
otelExportAssertion = {
val span = awaitSpans(1) { it.name == "test-span" }
with(span.single()) {
assertEquals("my.app", resource.attributes[ServiceAttributes.SERVICE_NAME])
assertEquals("foo", resource.attributes.asMap().filter { it.key.key == "test" }.values.single())
}
}
)
}

@Test
fun `a SpanExporter added after initialization won't be used`() {
val fakeSpanExporter = FakeSpanExporter()

testRule.runTest(
testCaseAction = {
embrace.addSpanExporter(fakeSpanExporter)
recordSession {
embrace.startSpan("test")?.stop()
}
},
assertAction = {
assertNotNull(getSingleSessionEnvelope())
assertTrue(fakeSpanExporter.exportedSpans.size == 0)
}
)
}

@Suppress("deprecation")
@Test
fun `SDK can receive a LogRecordExporter`() {
var logTimestampNanos = 0L

testRule.runTest(
preSdkStartAction = {
embrace.setResourceAttribute(ServiceAttributes.SERVICE_NAME, "my.app")
embrace.setResourceAttribute("test", "foo")
},
testCaseAction = {
recordSession {
logTimestampNanos = clock.nowInNanos()
embrace.logMessage("test message", Severity.INFO)
}
},
otelExportAssertion = {
val log = awaitLogs(1) { it.attributes.get(EmbType.System.Log.key.attributeKey) == EmbType.System.Log.value }
with(log.single()) {
assertEquals("test message", body.asString())
assertEquals(logTimestampNanos, timestampEpochNanos)
assertEquals(logTimestampNanos, observedTimestampEpochNanos)
assertEquals("my.app", resource.attributes[ServiceAttributes.SERVICE_NAME])
assertEquals("foo", resource.attributes.asMap().filter { it.key.key == "test" }.values.single())
}
}
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,10 @@ public class Embrace private constructor(
return impl.getOpenTelemetry()
}

override fun setResourceAttribute(key: String, value: String) {
impl.setResourceAttribute(key, value)
}

/**
* Adds a [LogRecordExporter] to the open telemetry logger.
*
Expand Down
Loading
Loading