Skip to content
Closed
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 @@ -8,7 +8,7 @@ import java.io.Serializable
*/
object PropertyUtils {

const val MAX_PROPERTY_SIZE: Int = 10
const val MAX_PROPERTY_SIZE: Int = 50

fun sanitizeProperties(properties: Map<String, Any>?, bypassPropertyLimit: Boolean = false): Map<String, Any> {
return if (properties == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ internal class PropertyUtilsTest {

@Test
fun testPropertyLimitExceeded() {
val input = (0..20).associateBy { "$it" }
val expected = (0..9).associateBy { "$it" }
val input = (0..70).associateBy { "$it" }
val expected = (0..49).associateBy { "$it" }
assertEquals(expected, sanitizeProperties(input as Map<String, Any>?))
}

Expand All @@ -44,7 +44,7 @@ internal class PropertyUtilsTest {
sourceMap[""] = "Empty key"
sourceMap["EmptyValue"] = ""
sourceMap["NullValue"] = ""
for (i in 1..9) {
for (i in 1..99) {
sourceMap["Key$i"] = "Value$i"
}
val resultMap = sanitizeProperties(sourceMap)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import io.opentelemetry.api.logs.Logger
import io.opentelemetry.api.trace.Tracer
import io.opentelemetry.sdk.OpenTelemetrySdk
import io.opentelemetry.sdk.common.Clock
import io.opentelemetry.sdk.logs.LogLimits
import io.opentelemetry.sdk.logs.SdkLoggerProvider
import io.opentelemetry.sdk.resources.Resource
import io.opentelemetry.sdk.trace.SdkTracerProvider
Expand Down Expand Up @@ -63,19 +64,28 @@ class OtelSdkWrapper(
configuration.resourceBuilder.build()
}

private val sdkLoggerProvider: SdkLoggerProvider by lazy {
SdkLoggerProvider
.builder()
.addResource(resource)
.addLogRecordProcessor(configuration.logProcessor)
.setClock(openTelemetryClock)
.setLogLimits {
LogLimits
.getDefault()
.toBuilder()
.setMaxNumberOfAttributes(limits.getMaxTotalAttributeCount())
.build()
}
.build()
}

private val sdk: OpenTelemetrySdk by lazy {
EmbTrace.trace("otel-sdk-init") {
OpenTelemetrySdk
.builder()
.setTracerProvider(sdkTracerProvider)
.setLoggerProvider(
SdkLoggerProvider
.builder()
.addResource(resource)
.addLogRecordProcessor(configuration.logProcessor)
.setClock(openTelemetryClock)
.build()
)
.setLoggerProvider(sdkLoggerProvider)
.build()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,19 @@ package io.embrace.android.embracesdk.testcases.features
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.embrace.android.embracesdk.LogExceptionType
import io.embrace.android.embracesdk.Severity
import io.embrace.android.embracesdk.assertions.assertOtelLogReceived
import io.embrace.android.embracesdk.assertions.getLogOfType
import io.embrace.android.embracesdk.assertions.getOtelSeverity
import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig
import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig
import io.embrace.android.embracesdk.internal.capture.session.isSessionPropertyAttributeName
import io.embrace.android.embracesdk.internal.config.remote.RemoteConfig
import io.embrace.android.embracesdk.internal.otel.schema.EmbType
import io.embrace.android.embracesdk.internal.payload.Envelope
import io.embrace.android.embracesdk.internal.payload.LogPayload
import io.embrace.android.embracesdk.internal.utils.getSafeStackTrace
import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule
import io.embrace.android.embracesdk.assertions.assertOtelLogReceived
import io.embrace.android.embracesdk.assertions.getLogOfType
import io.embrace.android.embracesdk.assertions.getOtelSeverity
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
Expand Down Expand Up @@ -417,6 +420,58 @@ internal class LogFeatureTest {
)
}

@Test
fun `default maximum number of session and log properties are recorded in log`() {
val props = buildMap {
repeat(50) {
set("prop$it", "val")
}
}
testRule.runTest(
testCaseAction = {
recordSession {
repeat(20) {
embrace.addSessionProperty("session-prop$it", "val", true)
}
embrace.logMessage("test", Severity.INFO, props)
}
},
assertAction = {
val log = getSingleLogEnvelope().getLogOfType(EmbType.System.Log)
assertEquals(50, log.attributes?.count { it.key?.startsWith("prop") == true })
},
otelExportAssertion = {
val logData = awaitLogs(1) { it.severity == io.opentelemetry.api.logs.Severity.INFO }.single()
val totalPropsCount = logData.attributes.asMap().filter {
it.key.key.startsWith("prop") || it.key.key.isSessionPropertyAttributeName()
}.size

assertEquals(60, totalPropsCount)
}
)
}

@Test
fun `exported logs can contain maximum number of session properties`() {
val maxCustomSessionProps = 200
testRule.runTest(
persistedRemoteConfig = RemoteConfig(maxSessionProperties = maxCustomSessionProps),
testCaseAction = {
recordSession {
repeat(maxCustomSessionProps + 1) {
embrace.addSessionProperty("session-prop$it", "val", true)
}
embrace.logMessage("test", Severity.INFO)
}
},
otelExportAssertion = {
val logData = awaitLogs(1) { it.severity == io.opentelemetry.api.logs.Severity.INFO }.single()
val totalPropsCount = logData.attributes.asMap().filter { it.key.key.isSessionPropertyAttributeName() }.size
assertEquals(maxCustomSessionProps, totalPropsCount)
}
)
}

private fun getEmbraceSeverity(severityNumber: Int): Severity {
return when (severityNumber) {
io.opentelemetry.api.logs.Severity.INFO.severityNumber -> Severity.INFO
Expand Down
Loading