diff --git a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogExporterTest.java b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogExporterTest.java index 2d0bd170c4..19531f80aa 100644 --- a/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogExporterTest.java +++ b/exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogExporterTest.java @@ -12,11 +12,9 @@ import static org.assertj.core.api.Assertions.assertThat; import io.github.netmikey.logunit.api.LogCapturer; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.logs.data.LogData; import io.opentelemetry.sdk.logs.data.LogDataBuilder; @@ -44,15 +42,12 @@ class OtlpJsonLoggingLogExporterTest { .setSeverityText("INFO") .setEpoch(1631533710L, TimeUnit.MILLISECONDS) .setAttributes(Attributes.of(stringKey("animal"), "cat", longKey("lives"), 9L)) - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - "12345678876543211234567887654322", - "8765432112345876", - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + "12345678876543211234567887654322", + "8765432112345876", + TraceFlags.getDefault(), + TraceState.getDefault())) .build(); private static final LogData LOG2 = @@ -63,15 +58,12 @@ class OtlpJsonLoggingLogExporterTest { .setSeverityText("INFO") .setEpoch(1631533710L, TimeUnit.MILLISECONDS) .setAttributes(Attributes.of(booleanKey("important"), true)) - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - "12345678876543211234567887654322", - "8765432112345875", - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + "12345678876543211234567887654322", + "8765432112345875", + TraceFlags.getDefault(), + TraceState.getDefault())) .build(); @RegisterExtension diff --git a/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogExporterTest.java b/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogExporterTest.java index faf6116577..bb0ec3a703 100644 --- a/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogExporterTest.java +++ b/exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogExporterTest.java @@ -11,11 +11,9 @@ import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.logs.data.LogData; @@ -59,15 +57,12 @@ class SystemOutLogExporterTest { .setBody("message") .setSeverity(Severity.ERROR3) .setEpoch(timestamp, TimeUnit.MILLISECONDS) - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - "00000000000000010000000000000002", - "0000000000000003", - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + "00000000000000010000000000000002", + "0000000000000003", + TraceFlags.getDefault(), + TraceState.getDefault())) .build(); } } diff --git a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshalerTest.java b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshalerTest.java index 990a64e847..79d1f046c4 100644 --- a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshalerTest.java +++ b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshalerTest.java @@ -14,13 +14,11 @@ import com.google.protobuf.util.JsonFormat; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.internal.OtelEncodingUtils; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.context.Context; import io.opentelemetry.exporter.otlp.internal.Marshaler; import io.opentelemetry.proto.common.v1.AnyValue; import io.opentelemetry.proto.common.v1.InstrumentationLibrary; @@ -63,15 +61,9 @@ class LogsRequestMarshalerTest { .setBody(BODY) .setSeverity(Severity.INFO) .setSeverityText("INFO") - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - TRACE_ID, - SPAN_ID, - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault())) .setAttributes(Attributes.of(AttributeKey.booleanKey("key"), true)) .setEpoch(12345, TimeUnit.NANOSECONDS) .build())); @@ -103,15 +95,9 @@ class LogsRequestMarshalerTest { .setBody(BODY) .setSeverity(Severity.INFO) .setSeverityText("INFO") - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - TRACE_ID, - SPAN_ID, - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TraceState.getDefault())) .setAttributes(Attributes.of(AttributeKey.booleanKey("key"), true)) .setEpoch(12345, TimeUnit.NANOSECONDS) .build())); diff --git a/integration-tests/src/testOtlpCommon/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java b/integration-tests/src/testOtlpCommon/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java index fed54a70aa..acd10c819e 100644 --- a/integration-tests/src/testOtlpCommon/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java +++ b/integration-tests/src/testOtlpCommon/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java @@ -25,7 +25,6 @@ import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.context.Context; import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogExporter; import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; @@ -386,15 +385,12 @@ abstract class OtlpExporterIntegrationTest { .setSeverity(Severity.DEBUG) .setSeverityText("DEBUG") .setEpoch(Instant.now()) - .setContext( - Context.root() - .with( - Span.wrap( - SpanContext.create( - IdGenerator.random().generateTraceId(), - IdGenerator.random().generateSpanId(), - TraceFlags.getDefault(), - TraceState.getDefault())))) + .setSpanContext( + SpanContext.create( + IdGenerator.random().generateTraceId(), + IdGenerator.random().generateSpanId(), + TraceFlags.getDefault(), + TraceState.getDefault())) .build(); logExporter.export(Collections.singletonList(logData)); diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java index 81ae514034..8993fb9eea 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java @@ -62,9 +62,14 @@ public final class LogDataBuilder { return this; } - /** Set the context. */ + /** Sets the context. */ public LogDataBuilder setContext(Context context) { - this.spanContext = Span.fromContext(context).getSpanContext(); + return setSpanContext(Span.fromContext(context).getSpanContext()); + } + + /** Sets the span context. */ + public LogDataBuilder setSpanContext(SpanContext spanContext) { + this.spanContext = spanContext == null ? SpanContext.getInvalid() : spanContext; return this; } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java index eb8b11d500..42480ed79a 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java @@ -6,9 +6,16 @@ package io.opentelemetry.sdk.logs.data; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.resources.Resource; @@ -16,10 +23,11 @@ import org.junit.jupiter.api.Test; class LogDataBuilderTest { + private final Resource resource = Resource.getDefault(); + private final InstrumentationLibraryInfo libraryInfo = InstrumentationLibraryInfo.empty(); + @Test void canSetClock() { - Resource resource = Resource.getDefault(); - InstrumentationLibraryInfo libraryInfo = InstrumentationLibraryInfo.empty(); Clock clock = mock(Clock.class); when(clock.now()).thenReturn(12L); LogDataBuilder builder = LogDataBuilder.create(resource, libraryInfo, clock); @@ -27,4 +35,36 @@ class LogDataBuilderTest { LogData result = builder.build(); assertEquals(12L, result.getEpochNanos()); } + + @Test + void canSetSpanContext() { + LogDataBuilder builder = LogDataBuilder.create(resource, libraryInfo); + SpanContext spanContext = mock(SpanContext.class); + LogData result = builder.setSpanContext(spanContext).build(); + assertSame(spanContext, result.getSpanContext()); + } + + @Test + void setSpanContext_nullSafe() { + LogDataBuilder builder = LogDataBuilder.create(resource, libraryInfo); + LogData result = builder.setSpanContext(null).build(); + assertSame(SpanContext.getInvalid(), result.getSpanContext()); + } + + @Test + void canSetSpanContextFromContext() { + String traceId = "33333333333333333333333333333333"; + String spanId = "7777777777777777"; + SpanContext spanContext = + SpanContext.create(traceId, spanId, TraceFlags.getSampled(), TraceState.getDefault()); + Span span = Span.wrap(spanContext); + + Context context = mock(Context.class); + when(context.get(any())).thenReturn(span); + + LogDataBuilder builder = LogDataBuilder.create(resource, libraryInfo); + + LogData result = builder.setContext(context).build(); + assertSame(spanContext, result.getSpanContext()); + } }