From 09e60ac633c7fa7342b2fc5d71376b3765c60037 Mon Sep 17 00:00:00 2001 From: Lucas Date: Tue, 12 Mar 2024 18:05:28 -0300 Subject: [PATCH] Implement Log Payload Source to populate the payload. --- .../capture/envelope/LogEnvelopeSource.kt | 10 +++--- .../capture/envelope/log/LogPayloadSource.kt | 7 ++++ .../envelope/log/LogPayloadSourceImpl.kt | 16 +++++++++ .../capture/envelope/log/LogSource.kt | 7 ---- .../capture/envelope/log/LogSourceImpl.kt | 9 ----- .../embracesdk/injection/PayloadModule.kt | 10 +++--- .../embracesdk/internal/payload/LogMapper.kt | 19 ++++++----- .../capture/envelope/LogEnvelopeSourceTest.kt | 6 ++-- .../envelope/log/LogPayloadSourceImplTest.kt | 34 +++++++++++++++++++ .../embracesdk/fakes/FakeLogPayloadSource.kt | 11 ++++++ .../android/embracesdk/fakes/FakeLogSource.kt | 11 ------ .../fakes/FakeOpenTelemetryModule.kt | 6 ++-- .../internal/payload/LogMapperTest.kt | 15 ++++---- 13 files changed, 104 insertions(+), 57 deletions(-) create mode 100644 embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSource.kt create mode 100644 embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImpl.kt delete mode 100644 embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSource.kt delete mode 100644 embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSourceImpl.kt create mode 100644 embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImplTest.kt create mode 100644 embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogPayloadSource.kt delete mode 100644 embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogSource.kt diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSource.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSource.kt index f385ff1a3b..3097089da5 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSource.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSource.kt @@ -1,23 +1,23 @@ package io.embrace.android.embracesdk.capture.envelope -import io.embrace.android.embracesdk.capture.envelope.log.LogSource +import io.embrace.android.embracesdk.capture.envelope.log.LogPayloadSource import io.embrace.android.embracesdk.capture.envelope.metadata.EnvelopeMetadataSource import io.embrace.android.embracesdk.capture.envelope.resource.EnvelopeResourceSource import io.embrace.android.embracesdk.internal.payload.Envelope -import io.embrace.android.embracesdk.internal.payload.Log +import io.embrace.android.embracesdk.internal.payload.LogPayload import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType internal class LogEnvelopeSource( private val metadataSource: EnvelopeMetadataSource, private val resourceSource: EnvelopeResourceSource, - private val logSource: LogSource, -) : EnvelopeSource { + private val logPayloadSource: LogPayloadSource, +) : EnvelopeSource { override fun getEnvelope(endType: SessionSnapshotType) = Envelope( resourceSource.getEnvelopeResource(), metadataSource.getEnvelopeMetadata(), null, null, - logSource.getLogPayload() + logPayloadSource.getLogPayload() ) } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSource.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSource.kt new file mode 100644 index 0000000000..6c72321b48 --- /dev/null +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSource.kt @@ -0,0 +1,7 @@ +package io.embrace.android.embracesdk.capture.envelope.log + +import io.embrace.android.embracesdk.internal.payload.LogPayload + +internal interface LogPayloadSource { + fun getLogPayload(): LogPayload +} diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImpl.kt new file mode 100644 index 0000000000..87a8874fcc --- /dev/null +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImpl.kt @@ -0,0 +1,16 @@ +package io.embrace.android.embracesdk.capture.envelope.log + +import io.embrace.android.embracesdk.internal.logs.EmbraceLogRecordData +import io.embrace.android.embracesdk.internal.logs.LogSink +import io.embrace.android.embracesdk.internal.payload.LogPayload +import io.embrace.android.embracesdk.internal.payload.toNewPayload + +internal class LogPayloadSourceImpl( + private val logSink: LogSink +) : LogPayloadSource { + override fun getLogPayload(): LogPayload { + return LogPayload( + logs = logSink.completedLogs().map(EmbraceLogRecordData::toNewPayload) + ) + } +} diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSource.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSource.kt deleted file mode 100644 index 13377b0f8b..0000000000 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSource.kt +++ /dev/null @@ -1,7 +0,0 @@ -package io.embrace.android.embracesdk.capture.envelope.log - -import io.embrace.android.embracesdk.internal.payload.Log - -internal interface LogSource { - fun getLogPayload(): Log -} diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSourceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSourceImpl.kt deleted file mode 100644 index ea8e80f2f0..0000000000 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/log/LogSourceImpl.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.embrace.android.embracesdk.capture.envelope.log - -import io.embrace.android.embracesdk.internal.payload.Log - -internal class LogSourceImpl : LogSource { - override fun getLogPayload(): Log { - throw NotImplementedError("Not implemented yet") - } -} diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt index 53d98fe687..143ace3cf0 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt @@ -2,7 +2,7 @@ package io.embrace.android.embracesdk.injection import io.embrace.android.embracesdk.capture.envelope.LogEnvelopeSource import io.embrace.android.embracesdk.capture.envelope.SessionEnvelopeSource -import io.embrace.android.embracesdk.capture.envelope.log.LogSourceImpl +import io.embrace.android.embracesdk.capture.envelope.log.LogPayloadSourceImpl import io.embrace.android.embracesdk.capture.envelope.metadata.EnvelopeMetadataSourceImpl import io.embrace.android.embracesdk.capture.envelope.resource.EnvelopeResourceSourceImpl import io.embrace.android.embracesdk.capture.envelope.session.SessionPayloadSourceImpl @@ -40,8 +40,10 @@ internal class PayloadModuleImpl( ) } - private val logSource by singleton { - LogSourceImpl() + private val logPayloadSource by singleton { + LogPayloadSourceImpl( + otelModule.logSink + ) } override val sessionEnvelopeSource: SessionEnvelopeSource by singleton { @@ -49,6 +51,6 @@ internal class PayloadModuleImpl( } override val logEnvelopeSource: LogEnvelopeSource by singleton { - LogEnvelopeSource(metadataSource, resourceSource, logSource) + LogEnvelopeSource(metadataSource, resourceSource, logPayloadSource) } } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/LogMapper.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/LogMapper.kt index dab3ff3fae..6c4de0ad9c 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/LogMapper.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/LogMapper.kt @@ -1,13 +1,16 @@ package io.embrace.android.embracesdk.internal.payload -import io.opentelemetry.sdk.logs.data.LogRecordData +import io.embrace.android.embracesdk.internal.logs.EmbraceLogRecordData -internal fun LogRecordData.toNewPayload(): Log = Log( - timeUnixNano = observedTimestampEpochNanos, - severityNumber = severity.severityNumber, +internal fun EmbraceLogRecordData.toNewPayload(): Log = Log( + timeUnixNano = timeUnixNanos, + severityNumber = severityNumber, severityText = severityText, - body = LogBody(body.asString()), - attributes = attributes.asMap().map { (key, value) -> Attribute(key.key, value.toString()) }, - traceId = spanContext.traceId, - spanId = spanContext.spanId, + body = LogBody(body.message), + attributes = attributes.toNewPayload(), + traceId = traceId, + spanId = spanId, ) + +internal fun Map.toNewPayload(): List = + map { (key, value) -> Attribute(key, value.toString()) } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSourceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSourceTest.kt index 9cfe34831b..4fbac01443 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSourceTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/LogEnvelopeSourceTest.kt @@ -2,7 +2,7 @@ package io.embrace.android.embracesdk.capture.envelope import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource -import io.embrace.android.embracesdk.fakes.FakeLogSource +import io.embrace.android.embracesdk.fakes.FakeLogPayloadSource import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType import org.junit.Assert.assertEquals import org.junit.Assert.assertNull @@ -14,7 +14,7 @@ internal class LogEnvelopeSourceTest { fun getEnvelope() { val metadataSource = FakeEnvelopeMetadataSource() val resourceSource = FakeEnvelopeResourceSource() - val logSource = FakeLogSource() + val logSource = FakeLogPayloadSource() val source = LogEnvelopeSource( metadataSource, resourceSource, @@ -23,7 +23,7 @@ internal class LogEnvelopeSourceTest { val payload = source.getEnvelope(SessionSnapshotType.NORMAL_END) assertEquals(metadataSource.metadata, payload.metadata) assertEquals(resourceSource.resource, payload.resource) - assertEquals(logSource.log, payload.data) + assertEquals(logSource.logs, payload.data) // future fields that need populating: assertNull(payload.type) diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImplTest.kt new file mode 100644 index 0000000000..7c4b96d380 --- /dev/null +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/log/LogPayloadSourceImplTest.kt @@ -0,0 +1,34 @@ +package io.embrace.android.embracesdk.capture.envelope.log + +import io.embrace.android.embracesdk.fakes.FakeLogRecordData +import io.embrace.android.embracesdk.internal.logs.LogSinkImpl +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test + +internal class LogPayloadSourceImplTest { + + private lateinit var impl: LogPayloadSourceImpl + private lateinit var sink: LogSinkImpl + private val fakeLog = FakeLogRecordData() + + @Before + fun setUp() { + sink = LogSinkImpl().apply { + storeLogs(listOf(fakeLog)) + } + impl = LogPayloadSourceImpl(sink) + } + + @Test + fun getLogPayload() { + val payload = impl.getLogPayload() + val log = checkNotNull(payload.logs?.single()) + assertEquals(1, payload.logs?.size) + assertEquals(fakeLog.timestampEpochNanos, log.timeUnixNano) + assertEquals(fakeLog.severityText, log.severityText) + assertEquals(fakeLog.severity.severityNumber, log.severityNumber) + assertEquals(fakeLog.attributes.size(), log.attributes?.size) + assertEquals(fakeLog.body.asString(), log.body?.message) + } +} diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogPayloadSource.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogPayloadSource.kt new file mode 100644 index 0000000000..a65f0eb12f --- /dev/null +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogPayloadSource.kt @@ -0,0 +1,11 @@ +package io.embrace.android.embracesdk.fakes + +import io.embrace.android.embracesdk.capture.envelope.log.LogPayloadSource +import io.embrace.android.embracesdk.internal.payload.LogPayload + +internal class FakeLogPayloadSource : LogPayloadSource { + + var logs: LogPayload = LogPayload() + + override fun getLogPayload(): LogPayload = logs +} diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogSource.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogSource.kt deleted file mode 100644 index faca31ca67..0000000000 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeLogSource.kt +++ /dev/null @@ -1,11 +0,0 @@ -package io.embrace.android.embracesdk.fakes - -import io.embrace.android.embracesdk.capture.envelope.log.LogSource -import io.embrace.android.embracesdk.internal.payload.Log - -internal class FakeLogSource : LogSource { - - var log: Log = Log() - - override fun getLogPayload(): Log = log -} diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt index 0f16632a0a..520dd4d110 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeOpenTelemetryModule.kt @@ -3,6 +3,7 @@ package io.embrace.android.embracesdk.fakes import io.embrace.android.embracesdk.arch.destination.LogWriter import io.embrace.android.embracesdk.injection.OpenTelemetryModule import io.embrace.android.embracesdk.internal.logs.LogSink +import io.embrace.android.embracesdk.internal.logs.LogSinkImpl import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpan import io.embrace.android.embracesdk.internal.spans.EmbraceTracer import io.embrace.android.embracesdk.internal.spans.InternalTracer @@ -16,7 +17,8 @@ import io.opentelemetry.api.trace.Tracer internal class FakeOpenTelemetryModule( override val currentSessionSpan: CurrentSessionSpan = FakeCurrentSessionSpan(), - override val spanSink: SpanSink = SpanSinkImpl() + override val spanSink: SpanSink = SpanSinkImpl(), + override val logSink: LogSink = LogSinkImpl(), ) : OpenTelemetryModule { override val openTelemetryConfiguration: OpenTelemetryConfiguration get() = TODO() @@ -34,6 +36,4 @@ internal class FakeOpenTelemetryModule( get() = TODO() override val logger: Logger get() = TODO() - override val logSink: LogSink - get() = TODO() } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/LogMapperTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/LogMapperTest.kt index 36d4c36cf5..7292fb3194 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/LogMapperTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/LogMapperTest.kt @@ -1,6 +1,7 @@ package io.embrace.android.embracesdk.internal.payload import io.embrace.android.embracesdk.fakes.FakeLogRecordData +import io.embrace.android.embracesdk.internal.logs.EmbraceLogRecordData import org.junit.Assert.assertEquals import org.junit.Test @@ -8,16 +9,16 @@ internal class LogMapperTest { @Test fun `convert to new payload`() { - val input = FakeLogRecordData() + val input = EmbraceLogRecordData(FakeLogRecordData()) val output = input.toNewPayload() - assertEquals(input.observedTimestampEpochNanos, output.timeUnixNano) - assertEquals(input.severity.severityNumber, output.severityNumber) + assertEquals(input.timeUnixNanos, output.timeUnixNano) + assertEquals(input.severityNumber, output.severityNumber) assertEquals(input.severityText, output.severityText) - assertEquals(input.body.asString(), checkNotNull(output.body).message) - assertEquals(input.spanContext.traceId, output.traceId) - assertEquals(input.spanContext.spanId, output.spanId) + assertEquals(input.body.message, checkNotNull(output.body).message) + assertEquals(input.traceId, output.traceId) + assertEquals(input.spanId, output.spanId) - val inputMap = input.attributes.asMap().mapKeys { it.key.toString() }.mapValues { it.value.toString() } + val inputMap = input.attributes.mapKeys { it.key }.mapValues { it.value.toString() } val outputMap = checkNotNull(output.attributes).associateBy { it.key }.mapValues { it.value.data } assertEquals(inputMap, outputMap) }