Skip to content

Commit

Permalink
Add SessionIdLogRecordAppender (#697)
Browse files Browse the repository at this point in the history
* add SessionIdLogRecordAppender

* spotless

* fix tests
  • Loading branch information
breedx-splk authored Nov 19, 2024
1 parent eb8b1f2 commit 0e1d3fd
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,9 @@ public OpenTelemetryRum build() {
OpenTelemetrySdk.builder()
.setTracerProvider(
buildTracerProvider(sessionManager, application, spanExporter))
.setLoggerProvider(
buildLoggerProvider(sessionManager, application, logsExporter))
.setMeterProvider(buildMeterProvider(application))
.setLoggerProvider(buildLoggerProvider(application, logsExporter))
.setPropagators(buildFinalPropagators())
.build();

Expand Down Expand Up @@ -470,13 +471,16 @@ private SdkTracerProvider buildTracerProvider(
}

private SdkLoggerProvider buildLoggerProvider(
Application application, LogRecordExporter logsExporter) {
SessionProvider sessionProvider,
Application application,
LogRecordExporter logsExporter) {
SdkLoggerProviderBuilder loggerProviderBuilder =
SdkLoggerProvider.builder()
.setResource(resource)
.addLogRecordProcessor(new SessionIdLogRecordAppender(sessionProvider))
.addLogRecordProcessor(
new GlobalAttributesLogRecordAppender(
config.getGlobalAttributesSupplier()))
.setResource(resource);
config.getGlobalAttributesSupplier()));
LogRecordProcessor batchLogsProcessor =
BatchLogRecordProcessor.builder(logsExporter).build();
loggerProviderBuilder.addLogRecordProcessor(batchLogsProcessor);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.android

import io.opentelemetry.android.session.SessionProvider
import io.opentelemetry.context.Context
import io.opentelemetry.sdk.logs.LogRecordProcessor
import io.opentelemetry.sdk.logs.ReadWriteLogRecord
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID

internal class SessionIdLogRecordAppender(private val sessionProvider: SessionProvider) :
LogRecordProcessor {
override fun onEmit(
context: Context,
logRecord: ReadWriteLogRecord,
) {
logRecord.setAttribute(SESSION_ID, sessionProvider.getSessionId())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static io.opentelemetry.api.common.AttributeKey.stringKey;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID;
import static org.awaitility.Awaitility.await;
import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.anyLong;
Expand Down Expand Up @@ -64,7 +65,6 @@
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes;
import java.io.IOException;
import java.time.Duration;
import java.util.Collection;
Expand Down Expand Up @@ -147,8 +147,7 @@ public void shouldBuildTracerProvider() {
.hasName("test span")
.hasResource(resource)
.hasAttributesSatisfyingExactly(
equalTo(SessionIncubatingAttributes.SESSION_ID, sessionId),
equalTo(SCREEN_NAME_KEY, "unknown"));
equalTo(SESSION_ID, sessionId), equalTo(SCREEN_NAME_KEY, "unknown"));
}

@Test
Expand All @@ -173,6 +172,7 @@ public void shouldBuildLogRecordProvider() {
assertThat(logs).hasSize(1);
assertThat(logs.get(0))
.hasAttributesSatisfyingExactly(
equalTo(SESSION_ID, openTelemetryRum.getRumSessionId()),
equalTo(stringKey("event.name"), "test.event"),
equalTo(stringKey("mega"), "hit"))
.hasResource(resource);
Expand Down Expand Up @@ -311,7 +311,9 @@ public void setLogRecordExporterCustomizer() {
assertThat(logs).hasSize(1);
assertThat(logs.iterator().next())
.hasBody("foo")
.hasAttributesSatisfyingExactly(equalTo(stringKey("bing"), "bang"))
.hasAttributesSatisfyingExactly(
equalTo(stringKey("bing"), "bang"),
equalTo(SESSION_ID, rum.getRumSessionId()))
.hasSeverity(Severity.FATAL3);
}

Expand Down Expand Up @@ -421,6 +423,7 @@ public void verifyGlobalAttrsForLogs() {
OpenTelemetryAssertions.assertThat(logRecordData)
.hasAttributes(
Attributes.builder()
.put(SESSION_ID, rum.getRumSessionId())
.put("someGlobalKey", "someGlobalValue")
.put("localAttrKey", "localAttrValue")
.build());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.android

import io.mockk.MockKAnnotations
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.verify
import io.opentelemetry.android.session.SessionProvider
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.context.Context
import io.opentelemetry.sdk.logs.ReadWriteLogRecord
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

private const val SESSION_ID_VALUE = "0666"

class SessionIdLogRecordAppenderTest {
@MockK
lateinit var sessionProvider: SessionProvider

@MockK
lateinit var log: ReadWriteLogRecord

@BeforeEach
fun setUp() {
MockKAnnotations.init(this)
every { sessionProvider.getSessionId() }.returns(SESSION_ID_VALUE)
every { log.setAttribute(any<AttributeKey<String>>(), any<String>()) } returns log
}

@Test
fun `should set sessionId as log record attribute`() {
val underTest = SessionIdLogRecordAppender(sessionProvider)

underTest.onEmit(Context.root(), log)

verify { log.setAttribute(SESSION_ID, SESSION_ID_VALUE) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE;
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE;
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE;
import static io.opentelemetry.semconv.incubating.EventIncubatingAttributes.EVENT_NAME;
import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID;
import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME;

Expand Down Expand Up @@ -60,6 +61,8 @@ private void emitCrashEvent(Logger crashReporter, CrashDetails crashDetails) {
extractor.onStart(attributesBuilder, Context.current(), crashDetails);
}

// TODO: use emitEvent() when available, with event name from semantic conventions.
attributesBuilder.put(EVENT_NAME, "device.crash");
crashReporter.logRecordBuilder().setAllAttributes(attributesBuilder.build()).emit();
}

Expand Down

0 comments on commit 0e1d3fd

Please sign in to comment.