Skip to content

Commit

Permalink
Implement Log Payload Source to populate the payload.
Browse files Browse the repository at this point in the history
  • Loading branch information
lucaslabari committed Mar 12, 2024
1 parent 033a88b commit 09e60ac
Show file tree
Hide file tree
Showing 13 changed files with 104 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -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<Log> {
private val logPayloadSource: LogPayloadSource,
) : EnvelopeSource<LogPayload> {

override fun getEnvelope(endType: SessionSnapshotType) = Envelope(
resourceSource.getEnvelopeResource(),
metadataSource.getEnvelopeMetadata(),
null,
null,
logSource.getLogPayload()
logPayloadSource.getLogPayload()
)
}
Original file line number Diff line number Diff line change
@@ -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
}
Original file line number Diff line number Diff line change
@@ -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)
)
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -40,15 +40,17 @@ internal class PayloadModuleImpl(
)
}

private val logSource by singleton {
LogSourceImpl()
private val logPayloadSource by singleton {
LogPayloadSourceImpl(
otelModule.logSink
)
}

override val sessionEnvelopeSource: SessionEnvelopeSource by singleton {
SessionEnvelopeSource(metadataSource, resourceSource, sessionPayloadSource)
}

override val logEnvelopeSource: LogEnvelopeSource by singleton {
LogEnvelopeSource(metadataSource, resourceSource, logSource)
LogEnvelopeSource(metadataSource, resourceSource, logPayloadSource)
}
}
Original file line number Diff line number Diff line change
@@ -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<String, Any>.toNewPayload(): List<Attribute> =
map { (key, value) -> Attribute(key, value.toString()) }
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand All @@ -34,6 +36,4 @@ internal class FakeOpenTelemetryModule(
get() = TODO()
override val logger: Logger
get() = TODO()
override val logSink: LogSink
get() = TODO()
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
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

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)
}
Expand Down

0 comments on commit 09e60ac

Please sign in to comment.