Skip to content

Commit 0e1d3fd

Browse files
authored
Add SessionIdLogRecordAppender (open-telemetry#697)
* add SessionIdLogRecordAppender * spotless * fix tests
1 parent eb8b1f2 commit 0e1d3fd

File tree

5 files changed

+84
-8
lines changed

5 files changed

+84
-8
lines changed

core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,9 @@ public OpenTelemetryRum build() {
311311
OpenTelemetrySdk.builder()
312312
.setTracerProvider(
313313
buildTracerProvider(sessionManager, application, spanExporter))
314+
.setLoggerProvider(
315+
buildLoggerProvider(sessionManager, application, logsExporter))
314316
.setMeterProvider(buildMeterProvider(application))
315-
.setLoggerProvider(buildLoggerProvider(application, logsExporter))
316317
.setPropagators(buildFinalPropagators())
317318
.build();
318319

@@ -470,13 +471,16 @@ private SdkTracerProvider buildTracerProvider(
470471
}
471472

472473
private SdkLoggerProvider buildLoggerProvider(
473-
Application application, LogRecordExporter logsExporter) {
474+
SessionProvider sessionProvider,
475+
Application application,
476+
LogRecordExporter logsExporter) {
474477
SdkLoggerProviderBuilder loggerProviderBuilder =
475478
SdkLoggerProvider.builder()
479+
.setResource(resource)
480+
.addLogRecordProcessor(new SessionIdLogRecordAppender(sessionProvider))
476481
.addLogRecordProcessor(
477482
new GlobalAttributesLogRecordAppender(
478-
config.getGlobalAttributesSupplier()))
479-
.setResource(resource);
483+
config.getGlobalAttributesSupplier()));
480484
LogRecordProcessor batchLogsProcessor =
481485
BatchLogRecordProcessor.builder(logsExporter).build();
482486
loggerProviderBuilder.addLogRecordProcessor(batchLogsProcessor);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android
7+
8+
import io.opentelemetry.android.session.SessionProvider
9+
import io.opentelemetry.context.Context
10+
import io.opentelemetry.sdk.logs.LogRecordProcessor
11+
import io.opentelemetry.sdk.logs.ReadWriteLogRecord
12+
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID
13+
14+
internal class SessionIdLogRecordAppender(private val sessionProvider: SessionProvider) :
15+
LogRecordProcessor {
16+
override fun onEmit(
17+
context: Context,
18+
logRecord: ReadWriteLogRecord,
19+
) {
20+
logRecord.setAttribute(SESSION_ID, sessionProvider.getSessionId())
21+
}
22+
}

core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static io.opentelemetry.api.common.AttributeKey.stringKey;
1010
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
1111
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
12+
import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID;
1213
import static org.awaitility.Awaitility.await;
1314
import static org.mockito.ArgumentMatchers.anyCollection;
1415
import static org.mockito.ArgumentMatchers.anyLong;
@@ -64,7 +65,6 @@
6465
import io.opentelemetry.sdk.trace.data.SpanData;
6566
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
6667
import io.opentelemetry.sdk.trace.export.SpanExporter;
67-
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes;
6868
import java.io.IOException;
6969
import java.time.Duration;
7070
import java.util.Collection;
@@ -147,8 +147,7 @@ public void shouldBuildTracerProvider() {
147147
.hasName("test span")
148148
.hasResource(resource)
149149
.hasAttributesSatisfyingExactly(
150-
equalTo(SessionIncubatingAttributes.SESSION_ID, sessionId),
151-
equalTo(SCREEN_NAME_KEY, "unknown"));
150+
equalTo(SESSION_ID, sessionId), equalTo(SCREEN_NAME_KEY, "unknown"));
152151
}
153152

154153
@Test
@@ -173,6 +172,7 @@ public void shouldBuildLogRecordProvider() {
173172
assertThat(logs).hasSize(1);
174173
assertThat(logs.get(0))
175174
.hasAttributesSatisfyingExactly(
175+
equalTo(SESSION_ID, openTelemetryRum.getRumSessionId()),
176176
equalTo(stringKey("event.name"), "test.event"),
177177
equalTo(stringKey("mega"), "hit"))
178178
.hasResource(resource);
@@ -311,7 +311,9 @@ public void setLogRecordExporterCustomizer() {
311311
assertThat(logs).hasSize(1);
312312
assertThat(logs.iterator().next())
313313
.hasBody("foo")
314-
.hasAttributesSatisfyingExactly(equalTo(stringKey("bing"), "bang"))
314+
.hasAttributesSatisfyingExactly(
315+
equalTo(stringKey("bing"), "bang"),
316+
equalTo(SESSION_ID, rum.getRumSessionId()))
315317
.hasSeverity(Severity.FATAL3);
316318
}
317319

@@ -421,6 +423,7 @@ public void verifyGlobalAttrsForLogs() {
421423
OpenTelemetryAssertions.assertThat(logRecordData)
422424
.hasAttributes(
423425
Attributes.builder()
426+
.put(SESSION_ID, rum.getRumSessionId())
424427
.put("someGlobalKey", "someGlobalValue")
425428
.put("localAttrKey", "localAttrValue")
426429
.build());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.android
7+
8+
import io.mockk.MockKAnnotations
9+
import io.mockk.every
10+
import io.mockk.impl.annotations.MockK
11+
import io.mockk.verify
12+
import io.opentelemetry.android.session.SessionProvider
13+
import io.opentelemetry.api.common.AttributeKey
14+
import io.opentelemetry.context.Context
15+
import io.opentelemetry.sdk.logs.ReadWriteLogRecord
16+
import io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID
17+
import org.junit.jupiter.api.BeforeEach
18+
import org.junit.jupiter.api.Test
19+
20+
private const val SESSION_ID_VALUE = "0666"
21+
22+
class SessionIdLogRecordAppenderTest {
23+
@MockK
24+
lateinit var sessionProvider: SessionProvider
25+
26+
@MockK
27+
lateinit var log: ReadWriteLogRecord
28+
29+
@BeforeEach
30+
fun setUp() {
31+
MockKAnnotations.init(this)
32+
every { sessionProvider.getSessionId() }.returns(SESSION_ID_VALUE)
33+
every { log.setAttribute(any<AttributeKey<String>>(), any<String>()) } returns log
34+
}
35+
36+
@Test
37+
fun `should set sessionId as log record attribute`() {
38+
val underTest = SessionIdLogRecordAppender(sessionProvider)
39+
40+
underTest.onEmit(Context.root(), log)
41+
42+
verify { log.setAttribute(SESSION_ID, SESSION_ID_VALUE) }
43+
}
44+
}

instrumentation/crash/src/main/java/io/opentelemetry/android/instrumentation/crash/CrashReporter.java

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_MESSAGE;
1010
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_STACKTRACE;
1111
import static io.opentelemetry.semconv.ExceptionAttributes.EXCEPTION_TYPE;
12+
import static io.opentelemetry.semconv.incubating.EventIncubatingAttributes.EVENT_NAME;
1213
import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_ID;
1314
import static io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes.THREAD_NAME;
1415

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

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

0 commit comments

Comments
 (0)