From a8086498b1557a70e99a3455466b5d3bb01d2ca1 Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Wed, 27 Jul 2022 13:15:25 -0500 Subject: [PATCH] Add TestLogData, remove public LogDataImpl and LogDataBuilder from log SDK (#4635) * Add TestLogData, remove public LogDataImpl and LogDataBuilder from log sdk * pr comment --- exporters/logging-otlp/build.gradle.kts | 1 + .../otlp/OtlpJsonLoggingLogExporterTest.java | 13 +- exporters/logging/build.gradle.kts | 1 + .../logging/SystemOutLogExporterTest.java | 7 +- exporters/otlp/common/build.gradle.kts | 1 + .../otlp/logs/LogsRequestMarshalerTest.java | 20 +-- exporters/otlp/logs/build.gradle.kts | 4 + .../http/logs/OtlpHttpLogExporterTest.java | 8 +- .../otlp/logs/OtlpGrpcLogExporterTest.java | 8 +- .../logs/OtlpGrpcNettyLogExporterTest.java | 8 +- .../OtlpGrpcNettyShadedLogExporterTest.java | 8 +- .../OtlpGrpcNettyOkHttpLogExporterTest.java | 8 +- sdk-extensions/autoconfigure/build.gradle.kts | 1 + .../OtlpGrpcServerExtension.java | 6 +- .../OtlpHttpServerExtension.java | 6 +- sdk/logs-testing/build.gradle.kts | 2 + .../sdk/testing/logs/TestLogData.java | 90 ++++++++++++++ .../sdk/testing/logs/package-info.java | 9 ++ .../testing/assertj/LogAssertionsTest.java | 6 +- .../opentelemetry/sdk/logs/SdkLogBuilder.java | 50 ++++++-- .../LogDataImpl.java => SdkLogData.java} | 13 +- .../opentelemetry/sdk/logs/SdkLogEmitter.java | 8 +- .../sdk/logs/data/LogDataBuilder.java | 114 ------------------ .../sdk/logs/MultiLogProcessorTest.java | 5 +- .../sdk/logs/NoopLogProcessorTest.java | 4 +- .../sdk/logs/SdkLogBuilderTest.java | 107 ++++++++++------ .../sdk/logs/data/LogDataBuilderTest.java | 69 ----------- .../logs/export/InMemoryLogExporterTest.java | 4 +- .../sdk/logs/export/MultiLogExporterTest.java | 5 +- .../logs/export/SimpleLogProcessorTest.java | 10 +- .../opentelemetry/sdk/logs/util/TestUtil.java | 31 ----- 31 files changed, 302 insertions(+), 325 deletions(-) create mode 100644 sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogData.java create mode 100644 sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/package-info.java rename sdk/logs/src/main/java/io/opentelemetry/sdk/logs/{data/LogDataImpl.java => SdkLogData.java} (74%) delete mode 100644 sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java delete mode 100644 sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java delete mode 100644 sdk/logs/src/test/java/io/opentelemetry/sdk/logs/util/TestUtil.java diff --git a/exporters/logging-otlp/build.gradle.kts b/exporters/logging-otlp/build.gradle.kts index bcc0176d0d6..6dcb66aed88 100644 --- a/exporters/logging-otlp/build.gradle.kts +++ b/exporters/logging-otlp/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-core") testImplementation(project(":sdk:testing")) + testImplementation(project(":sdk:logs-testing")) testImplementation(project(":sdk:logs")) testImplementation(project(":sdk:metrics")) testImplementation(project(":sdk:trace")) 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 3458b2a0e6e..417a43796bd 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 @@ -18,10 +18,10 @@ import io.opentelemetry.internal.testing.slf4j.SuppressLogger; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.logs.export.LogExporter; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.util.Arrays; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.BeforeEach; @@ -37,7 +37,10 @@ class OtlpJsonLoggingLogExporterTest { Resource.create(Attributes.builder().put("key", "value").build()); private static final LogData LOG1 = - LogDataBuilder.create(RESOURCE, InstrumentationScopeInfo.create("instrumentation", "1", null)) + TestLogData.builder() + .setResource(RESOURCE) + .setInstrumentationScopeInfo( + InstrumentationScopeInfo.create("instrumentation", "1", null)) .setBody("body1") .setSeverity(Severity.INFO) .setSeverityText("INFO") @@ -52,8 +55,10 @@ class OtlpJsonLoggingLogExporterTest { .build(); private static final LogData LOG2 = - LogDataBuilder.create( - RESOURCE, InstrumentationScopeInfo.create("instrumentation2", "2", null)) + TestLogData.builder() + .setResource(RESOURCE) + .setInstrumentationScopeInfo( + InstrumentationScopeInfo.create("instrumentation2", "2", null)) .setBody("body2") .setSeverity(Severity.INFO) .setSeverityText("INFO") diff --git a/exporters/logging/build.gradle.kts b/exporters/logging/build.gradle.kts index 60cb832c131..8107ed13a9a 100644 --- a/exporters/logging/build.gradle.kts +++ b/exporters/logging/build.gradle.kts @@ -14,4 +14,5 @@ dependencies { api(project(":sdk:logs")) testImplementation(project(":sdk:testing")) + testImplementation(project(":sdk:logs-testing")) } 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 694e0b9e1b4..6cc8a499ccf 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 @@ -17,9 +17,9 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.time.LocalDateTime; import java.time.Month; import java.time.ZoneOffset; @@ -51,8 +51,9 @@ void format() { } private static LogData sampleLog(long timestamp) { - return LogDataBuilder.create( - Resource.empty(), InstrumentationScopeInfo.create("logTest", "1.0", null)) + return TestLogData.builder() + .setResource(Resource.empty()) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.create("logTest", "1.0", null)) .setAttributes(Attributes.of(stringKey("cheese"), "cheddar", longKey("amount"), 1L)) .setBody("message") .setSeverity(Severity.ERROR3) diff --git a/exporters/otlp/common/build.gradle.kts b/exporters/otlp/common/build.gradle.kts index f525c21ab75..ac90d2ff965 100644 --- a/exporters/otlp/common/build.gradle.kts +++ b/exporters/otlp/common/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { testImplementation(project(":sdk:trace")) testImplementation(project(":sdk:logs")) testImplementation(project(":sdk:testing")) + testImplementation(project(":sdk:logs-testing")) testImplementation("com.fasterxml.jackson.core:jackson-databind") testImplementation("com.google.protobuf:protobuf-java-util") diff --git a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/logs/LogsRequestMarshalerTest.java b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/logs/LogsRequestMarshalerTest.java index 8051aab239e..a9d86db6874 100644 --- a/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/logs/LogsRequestMarshalerTest.java +++ b/exporters/otlp/common/src/test/java/io/opentelemetry/exporter/internal/otlp/logs/LogsRequestMarshalerTest.java @@ -27,9 +27,9 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs; import io.opentelemetry.proto.logs.v1.ScopeLogs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UncheckedIOException; @@ -53,8 +53,10 @@ void toProtoResourceLogs() { ResourceLogsMarshaler[] resourceLogsMarshalers = ResourceLogsMarshaler.create( Collections.singleton( - LogDataBuilder.create( - Resource.builder().put("one", 1).setSchemaUrl("http://url").build(), + TestLogData.builder() + .setResource( + Resource.builder().put("one", 1).setSchemaUrl("http://url").build()) + .setInstrumentationScopeInfo( InstrumentationScopeInfo.create("testLib", "1.0", "http://url")) .setBody(BODY) .setSeverity(Severity.INFO) @@ -84,8 +86,10 @@ void toProtoLogRecord() { parse( LogRecord.getDefaultInstance(), LogMarshaler.create( - LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), + TestLogData.builder() + .setResource( + Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo( InstrumentationScopeInfo.create("instrumentation", "1", null)) .setBody(BODY) .setSeverity(Severity.INFO) @@ -116,8 +120,10 @@ void toProtoLogRecord_MinimalFields() { parse( LogRecord.getDefaultInstance(), LogMarshaler.create( - LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), + TestLogData.builder() + .setResource( + Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo( InstrumentationScopeInfo.create("instrumentation", "1", null)) .setEpoch(12345, TimeUnit.NANOSECONDS) .build())); diff --git a/exporters/otlp/logs/build.gradle.kts b/exporters/otlp/logs/build.gradle.kts index 5bd66a0a0f3..000b8e5da3e 100644 --- a/exporters/otlp/logs/build.gradle.kts +++ b/exporters/otlp/logs/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { compileOnly("io.grpc:grpc-stub") testImplementation(project(":exporters:otlp:testing-internal")) + testImplementation(project(":sdk:logs-testing")) testImplementation("com.linecorp.armeria:armeria-junit5") testImplementation("com.google.api.grpc:proto-google-common-protos") @@ -27,6 +28,7 @@ testing { val testGrpcNetty by registering(JvmTestSuite::class) { dependencies { implementation(project(":exporters:otlp:testing-internal")) + implementation(project(":sdk:logs-testing")) implementation("io.grpc:grpc-netty") implementation("io.grpc:grpc-stub") @@ -35,6 +37,7 @@ testing { val testGrpcNettyShaded by registering(JvmTestSuite::class) { dependencies { implementation(project(":exporters:otlp:testing-internal")) + implementation(project(":sdk:logs-testing")) implementation("io.grpc:grpc-netty-shaded") implementation("io.grpc:grpc-stub") @@ -43,6 +46,7 @@ testing { val testGrpcOkhttp by registering(JvmTestSuite::class) { dependencies { implementation(project(":exporters:otlp:testing-internal")) + implementation(project(":sdk:logs-testing")) implementation("io.grpc:grpc-okhttp") implementation("io.grpc:grpc-stub") diff --git a/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogExporterTest.java b/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogExporterTest.java index e92e25acae7..bb713a6ac1f 100644 --- a/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogExporterTest.java +++ b/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogExporterTest.java @@ -33,9 +33,9 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UncheckedIOException; @@ -339,8 +339,10 @@ private static HttpResponse buildResponse(HttpStatus httpSta } private static LogData generateFakeLog() { - return LogDataBuilder.create( - Resource.getDefault(), InstrumentationScopeInfo.create("testLib", "1.0", "http://url")) + return TestLogData.builder() + .setResource(Resource.getDefault()) + .setInstrumentationScopeInfo( + InstrumentationScopeInfo.create("testLib", "1.0", "http://url")) .setBody("log body") .setAttributes(Attributes.builder().put("key", "value").build()) .setSeverity(Severity.INFO) diff --git a/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogExporterTest.java b/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogExporterTest.java index 0f779e2df2a..c5904cd3f35 100644 --- a/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogExporterTest.java +++ b/exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogExporterTest.java @@ -19,9 +19,9 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.Closeable; import java.time.Instant; import java.util.List; @@ -56,9 +56,9 @@ protected TelemetryExporterBuilder exporterBuilder() { @Override protected LogData generateFakeTelemetry() { - return LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), - InstrumentationScopeInfo.create("instrumentation", "1", null)) + return TestLogData.builder() + .setResource(Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.create("instrumentation", "1", null)) .setEpoch(Instant.now()) .setSeverity(Severity.ERROR) .setSeverityText("really severe") diff --git a/exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyLogExporterTest.java b/exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyLogExporterTest.java index b596b844c6e..995c25fc639 100644 --- a/exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyLogExporterTest.java +++ b/exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyLogExporterTest.java @@ -21,9 +21,9 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.Closeable; import java.time.Instant; import java.util.List; @@ -64,9 +64,9 @@ protected TelemetryExporterBuilder exporterBuilder() { @Override protected LogData generateFakeTelemetry() { - return LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), - InstrumentationScopeInfo.create("instrumentation", "1", null)) + return TestLogData.builder() + .setResource(Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.create("instrumentation", "1", null)) .setEpoch(Instant.now()) .setSeverity(Severity.ERROR) .setSeverityText("really severe") diff --git a/exporters/otlp/logs/src/testGrpcNettyShaded/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyShadedLogExporterTest.java b/exporters/otlp/logs/src/testGrpcNettyShaded/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyShadedLogExporterTest.java index a531e891da2..f73f80a3980 100644 --- a/exporters/otlp/logs/src/testGrpcNettyShaded/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyShadedLogExporterTest.java +++ b/exporters/otlp/logs/src/testGrpcNettyShaded/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyShadedLogExporterTest.java @@ -18,9 +18,9 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.Closeable; import java.time.Instant; import java.util.List; @@ -52,9 +52,9 @@ protected TelemetryExporterBuilder exporterBuilder() { @Override protected LogData generateFakeTelemetry() { - return LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), - InstrumentationScopeInfo.create("instrumentation", "1", null)) + return TestLogData.builder() + .setResource(Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.create("instrumentation", "1", null)) .setEpoch(Instant.now()) .setSeverity(Severity.ERROR) .setSeverityText("really severe") diff --git a/exporters/otlp/logs/src/testGrpcOkhttp/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyOkHttpLogExporterTest.java b/exporters/otlp/logs/src/testGrpcOkhttp/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyOkHttpLogExporterTest.java index 1688ba5ced5..ab0574333ed 100644 --- a/exporters/otlp/logs/src/testGrpcOkhttp/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyOkHttpLogExporterTest.java +++ b/exporters/otlp/logs/src/testGrpcOkhttp/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcNettyOkHttpLogExporterTest.java @@ -18,9 +18,9 @@ import io.opentelemetry.proto.logs.v1.ResourceLogs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.io.Closeable; import java.time.Instant; import java.util.List; @@ -52,9 +52,9 @@ protected TelemetryExporterBuilder exporterBuilder() { @Override protected LogData generateFakeTelemetry() { - return LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), - InstrumentationScopeInfo.create("instrumentation", "1", null)) + return TestLogData.builder() + .setResource(Resource.create(Attributes.builder().put("testKey", "testValue").build())) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.create("instrumentation", "1", null)) .setEpoch(Instant.now()) .setSeverity(Severity.ERROR) .setSeverityText("really severe") diff --git a/sdk-extensions/autoconfigure/build.gradle.kts b/sdk-extensions/autoconfigure/build.gradle.kts index ed74b3b83f1..40ebd4e5c6f 100644 --- a/sdk-extensions/autoconfigure/build.gradle.kts +++ b/sdk-extensions/autoconfigure/build.gradle.kts @@ -121,6 +121,7 @@ testing { implementation(project(":exporters:otlp:logs")) implementation(project(":exporters:otlp:common")) implementation(project(":sdk:testing")) + implementation(project(":sdk:logs-testing")) implementation("io.opentelemetry.proto:opentelemetry-proto") implementation("com.linecorp.armeria:armeria-junit5") diff --git a/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpGrpcServerExtension.java b/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpGrpcServerExtension.java index 52759f81363..6f452c2e1b6 100644 --- a/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpGrpcServerExtension.java +++ b/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpGrpcServerExtension.java @@ -28,13 +28,13 @@ import io.opentelemetry.proto.collector.trace.v1.TraceServiceGrpc; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableLongPointData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableMetricData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import io.opentelemetry.sdk.testing.trace.TestSpanData; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; @@ -164,7 +164,9 @@ static MetricData generateFakeMetric() { } static LogData generateFakeLog() { - return LogDataBuilder.create(Resource.empty(), InstrumentationScopeInfo.empty()) + return TestLogData.builder() + .setResource(Resource.empty()) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.empty()) .setEpoch(Instant.now()) .setBody("log body") .build(); diff --git a/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpHttpServerExtension.java b/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpHttpServerExtension.java index 276843ba99a..ae6b4a26e3d 100644 --- a/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpHttpServerExtension.java +++ b/sdk-extensions/autoconfigure/src/testOtlp/java/io/opentelemetry/sdk/autoconfigure/OtlpHttpServerExtension.java @@ -23,13 +23,13 @@ import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableLongPointData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableMetricData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import io.opentelemetry.sdk.testing.trace.TestSpanData; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.StatusData; @@ -147,7 +147,9 @@ static MetricData generateFakeMetric() { } static LogData generateFakeLog() { - return LogDataBuilder.create(Resource.empty(), InstrumentationScopeInfo.empty()) + return TestLogData.builder() + .setResource(Resource.empty()) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.empty()) .setEpoch(Instant.now()) .setBody("log body") .build(); diff --git a/sdk/logs-testing/build.gradle.kts b/sdk/logs-testing/build.gradle.kts index f7fcce0c487..5d1b121357a 100644 --- a/sdk/logs-testing/build.gradle.kts +++ b/sdk/logs-testing/build.gradle.kts @@ -18,5 +18,7 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") + testImplementation(project(":sdk:logs-testing")) + testImplementation("junit:junit") } diff --git a/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogData.java b/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogData.java new file mode 100644 index 00000000000..4b6f7f9305b --- /dev/null +++ b/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogData.java @@ -0,0 +1,90 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.testing.logs; + +import com.google.auto.value.AutoValue; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.sdk.common.InstrumentationScopeInfo; +import io.opentelemetry.sdk.logs.data.Body; +import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.Severity; +import io.opentelemetry.sdk.resources.Resource; +import java.time.Instant; +import java.util.concurrent.TimeUnit; +import javax.annotation.concurrent.Immutable; + +/** Immutable representation of {@link LogData}. */ +@Immutable +@AutoValue +public abstract class TestLogData implements LogData { + + /** Creates a new Builder for creating an {@link LogData} instance. */ + public static Builder builder() { + return new AutoValue_TestLogData.Builder() + .setResource(Resource.empty()) + .setInstrumentationScopeInfo(InstrumentationScopeInfo.empty()) + .setEpoch(0, TimeUnit.NANOSECONDS) + .setSpanContext(SpanContext.getInvalid()) + .setSeverity(Severity.UNDEFINED_SEVERITY_NUMBER) + .setBody("") + .setAttributes(Attributes.empty()); + } + + TestLogData() {} + + /** A {@code Builder} class for {@link TestLogData}. */ + @AutoValue.Builder + public abstract static class Builder { + + abstract TestLogData autoBuild(); + + /** Create a new {@link LogData} instance from the data in this. */ + public TestLogData build() { + return autoBuild(); + } + + /** Set the {@link Resource}. */ + public abstract Builder setResource(Resource resource); + + /** Sets the {@link InstrumentationScopeInfo}. */ + public abstract Builder setInstrumentationScopeInfo( + InstrumentationScopeInfo instrumentationScopeInfo); + + /** Set the epoch timestamp to the {@code instant}. */ + public Builder setEpoch(Instant instant) { + return setEpochNanos(TimeUnit.SECONDS.toNanos(instant.getEpochSecond()) + instant.getNano()); + } + + /** Set the epoch timestamp. */ + public Builder setEpoch(long timestamp, TimeUnit unit) { + return setEpochNanos(unit.toNanos(timestamp)); + } + + /** Set the epoch timestamp in nanos. */ + abstract Builder setEpochNanos(long epochNanos); + + /** Set the span context. */ + public abstract Builder setSpanContext(SpanContext spanContext); + + /** Set the severity. */ + public abstract Builder setSeverity(Severity severity); + + /** Set the severity text. */ + public abstract Builder setSeverityText(String severityText); + + /** Set the body string. */ + public Builder setBody(String body) { + return setBody(Body.string(body)); + } + + /** Set the body. */ + abstract Builder setBody(Body body); + + /** Set the attributes. */ + public abstract Builder setAttributes(Attributes attributes); + } +} diff --git a/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/package-info.java b/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/package-info.java new file mode 100644 index 00000000000..7b6b01d11d3 --- /dev/null +++ b/sdk/logs-testing/src/main/java/io/opentelemetry/sdk/testing/logs/package-info.java @@ -0,0 +1,9 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +@ParametersAreNonnullByDefault +package io.opentelemetry.sdk.testing.logs; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/sdk/logs-testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java b/sdk/logs-testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java index 324ce819dab..ab228163b6a 100644 --- a/sdk/logs-testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java +++ b/sdk/logs-testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java @@ -17,9 +17,9 @@ import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.util.Arrays; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; @@ -44,7 +44,9 @@ public class LogAssertionsTest { .build(); private static final LogData LOG_DATA = - LogDataBuilder.create(RESOURCE, INSTRUMENTATION_SCOPE_INFO) + TestLogData.builder() + .setResource(RESOURCE) + .setInstrumentationScopeInfo(INSTRUMENTATION_SCOPE_INFO) .setEpoch(100, TimeUnit.NANOSECONDS) .setSpanContext( SpanContext.create( diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogBuilder.java index 437fba19eb6..e44f70d870c 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogBuilder.java @@ -6,69 +6,82 @@ package io.opentelemetry.sdk.logs; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; +import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.internal.AttributeUtil; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; +import io.opentelemetry.sdk.logs.data.Body; import io.opentelemetry.sdk.logs.data.Severity; import java.time.Instant; import java.util.concurrent.TimeUnit; +import javax.annotation.Nullable; /** {@link SdkLogBuilder} is the SDK implementation of {@link LogBuilder}. */ final class SdkLogBuilder implements LogBuilder { - private final LogDataBuilder logDataBuilder; private final LogEmitterSharedState logEmitterSharedState; private final LogLimits logLimits; - SdkLogBuilder(LogEmitterSharedState logEmitterSharedState, LogDataBuilder logDataBuilder) { + private final InstrumentationScopeInfo instrumentationScopeInfo; + private long epochNanos; + private SpanContext spanContext = SpanContext.getInvalid(); + private Severity severity = Severity.UNDEFINED_SEVERITY_NUMBER; + @Nullable private String severityText; + private Body body = Body.empty(); + private Attributes attributes = Attributes.empty(); + + SdkLogBuilder( + LogEmitterSharedState logEmitterSharedState, + InstrumentationScopeInfo instrumentationScopeInfo) { this.logEmitterSharedState = logEmitterSharedState; - this.logDataBuilder = logDataBuilder; this.logLimits = logEmitterSharedState.getLogLimits(); + this.instrumentationScopeInfo = instrumentationScopeInfo; } @Override public LogBuilder setEpoch(long timestamp, TimeUnit unit) { - logDataBuilder.setEpoch(timestamp, unit); + this.epochNanos = unit.toNanos(timestamp); return this; } @Override public LogBuilder setEpoch(Instant instant) { - logDataBuilder.setEpoch(instant); + this.epochNanos = TimeUnit.SECONDS.toNanos(instant.getEpochSecond()) + instant.getNano(); return this; } @Override public LogBuilder setContext(Context context) { - logDataBuilder.setContext(context); + spanContext = Span.fromContext(context).getSpanContext(); return this; } @Override public LogBuilder setSeverity(Severity severity) { - logDataBuilder.setSeverity(severity); + this.severity = severity; return this; } @Override public LogBuilder setSeverityText(String severityText) { - logDataBuilder.setSeverityText(severityText); + this.severityText = severityText; return this; } @Override public LogBuilder setBody(String body) { - logDataBuilder.setBody(body); + this.body = Body.string(body); return this; } @Override public LogBuilder setAttributes(Attributes attributes) { - logDataBuilder.setAttributes( + this.attributes = AttributeUtil.applyAttributesLimit( attributes, logLimits.getMaxNumberOfAttributes(), - logLimits.getMaxAttributeValueLength())); + logLimits.getMaxAttributeValueLength()); return this; } @@ -77,6 +90,17 @@ public void emit() { if (logEmitterSharedState.hasBeenShutdown()) { return; } - logEmitterSharedState.getLogProcessor().emit(logDataBuilder.build()); + logEmitterSharedState + .getLogProcessor() + .emit( + SdkLogData.create( + logEmitterSharedState.getResource(), + instrumentationScopeInfo, + this.epochNanos == 0 ? logEmitterSharedState.getClock().now() : this.epochNanos, + spanContext, + severity, + severityText, + body, + attributes)); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataImpl.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogData.java similarity index 74% rename from sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataImpl.java rename to sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogData.java index 42b690f68f4..1a470a68a16 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataImpl.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogData.java @@ -3,12 +3,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.sdk.logs.data; +package io.opentelemetry.sdk.logs; import com.google.auto.value.AutoValue; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; +import io.opentelemetry.sdk.logs.data.Body; +import io.opentelemetry.sdk.logs.data.LogData; +import io.opentelemetry.sdk.logs.data.Severity; import io.opentelemetry.sdk.resources.Resource; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -16,11 +19,11 @@ @AutoValue @AutoValue.CopyAnnotations @Immutable -abstract class LogDataImpl implements LogData { +abstract class SdkLogData implements LogData { - LogDataImpl() {} + SdkLogData() {} - static LogDataImpl create( + static SdkLogData create( Resource resource, InstrumentationScopeInfo instrumentationScopeInfo, long epochNanos, @@ -29,7 +32,7 @@ static LogDataImpl create( @Nullable String severityText, Body body, Attributes attributes) { - return new AutoValue_LogDataImpl( + return new AutoValue_SdkLogData( resource, instrumentationScopeInfo, epochNanos, diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitter.java index cf9d60439ff..ae4f73039b8 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogEmitter.java @@ -6,7 +6,6 @@ package io.opentelemetry.sdk.logs; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; /** SDK implementation of {@link LogEmitter}. */ final class SdkLogEmitter implements LogEmitter { @@ -23,12 +22,7 @@ final class SdkLogEmitter implements LogEmitter { @Override public LogBuilder logBuilder() { - LogDataBuilder logDataBuilder = - LogDataBuilder.create( - logEmitterSharedState.getResource(), - instrumentationScopeInfo, - logEmitterSharedState.getClock()); - return new SdkLogBuilder(logEmitterSharedState, logDataBuilder); + return new SdkLogBuilder(logEmitterSharedState, instrumentationScopeInfo); } // VisibleForTesting 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 deleted file mode 100644 index e339510f57a..00000000000 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogDataBuilder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.logs.data; - -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.api.trace.SpanContext; -import io.opentelemetry.context.Context; -import io.opentelemetry.sdk.common.Clock; -import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.resources.Resource; -import java.time.Instant; -import java.util.concurrent.TimeUnit; -import javax.annotation.Nullable; - -/** Builder for {@link LogData}. */ -public final class LogDataBuilder { - - private final Resource resource; - private final InstrumentationScopeInfo instrumentationScopeInfo; - - private long epochNanos; - private SpanContext spanContext = SpanContext.getInvalid(); - private Severity severity = Severity.UNDEFINED_SEVERITY_NUMBER; - @Nullable private String severityText; - private Body body = Body.empty(); - private final Clock clock; - private Attributes attributes = Attributes.empty(); - - private LogDataBuilder( - Resource resource, InstrumentationScopeInfo instrumentationScopeInfo, Clock clock) { - this.resource = resource; - this.instrumentationScopeInfo = instrumentationScopeInfo; - this.clock = clock; - } - - /** Returns a new {@link LogDataBuilder} with the default clock. */ - public static LogDataBuilder create( - Resource resource, InstrumentationScopeInfo instrumentationScopeInfo) { - return create(resource, instrumentationScopeInfo, Clock.getDefault()); - } - - /** Returns a new {@link LogDataBuilder}. */ - public static LogDataBuilder create( - Resource resource, InstrumentationScopeInfo instrumentationScopeInfo, Clock clock) { - return new LogDataBuilder(resource, instrumentationScopeInfo, clock); - } - - /** Set the epoch timestamp using the timestamp and unit. */ - public LogDataBuilder setEpoch(long timestamp, TimeUnit unit) { - this.epochNanos = unit.toNanos(timestamp); - return this; - } - - /** Set the epoch timestamp using the instant. */ - public LogDataBuilder setEpoch(Instant instant) { - this.epochNanos = TimeUnit.SECONDS.toNanos(instant.getEpochSecond()) + instant.getNano(); - return this; - } - - /** Sets the context. */ - public LogDataBuilder setContext(Context context) { - return setSpanContext(Span.fromContext(context).getSpanContext()); - } - - /** Sets the span context. */ - public LogDataBuilder setSpanContext(SpanContext spanContext) { - this.spanContext = spanContext == null ? SpanContext.getInvalid() : spanContext; - return this; - } - - /** Set the severity. */ - public LogDataBuilder setSeverity(Severity severity) { - this.severity = severity; - return this; - } - - /** Set the severity text. */ - public LogDataBuilder setSeverityText(String severityText) { - this.severityText = severityText; - return this; - } - - /** Set the body string. */ - public LogDataBuilder setBody(String body) { - this.body = Body.string(body); - return this; - } - - /** Set the attributes. */ - public LogDataBuilder setAttributes(Attributes attributes) { - this.attributes = attributes; - return this; - } - - /** Build a {@link LogData} instance from the configured properties. */ - public LogData build() { - if (epochNanos == 0) { - epochNanos = clock.now(); - } - return LogDataImpl.create( - resource, - instrumentationScopeInfo, - epochNanos, - spanContext, - severity, - severityText, - body, - attributes); - } -} diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/MultiLogProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/MultiLogProcessorTest.java index 5d8e1c23585..a3ef8771de6 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/MultiLogProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/MultiLogProcessorTest.java @@ -13,7 +13,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogData; import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.logs.util.TestUtil; +import io.opentelemetry.sdk.testing.logs.TestLogData; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -28,7 +28,8 @@ class MultiLogProcessorTest { @Mock private LogProcessor logProcessor1; @Mock private LogProcessor logProcessor2; - private static final LogData logData = TestUtil.createLogData(Severity.DEBUG, "message"); + private static final LogData logData = + TestLogData.builder().setSeverity(Severity.DEBUG).setBody("message").build(); @BeforeEach void setup() { diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/NoopLogProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/NoopLogProcessorTest.java index 40ac3f57820..03652b5fb82 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/NoopLogProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/NoopLogProcessorTest.java @@ -8,7 +8,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.logs.util.TestUtil; +import io.opentelemetry.sdk.testing.logs.TestLogData; import org.junit.jupiter.api.Test; class NoopLogProcessorTest { @@ -16,7 +16,7 @@ class NoopLogProcessorTest { @Test void noCrash() { LogProcessor logProcessor = NoopLogProcessor.getInstance(); - logProcessor.emit(TestUtil.createLogData(Severity.DEBUG, "message")); + logProcessor.emit(TestLogData.builder().setSeverity(Severity.DEBUG).setBody("message").build()); assertThat(logProcessor.forceFlush().isSuccess()).isEqualTo(true); assertThat(logProcessor.shutdown().isSuccess()).isEqualTo(true); } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogBuilderTest.java index 0f11830850f..fef884415aa 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogBuilderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogBuilderTest.java @@ -5,73 +5,112 @@ package io.opentelemetry.sdk.logs; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static io.opentelemetry.sdk.testing.assertj.LogAssertions.assertThat; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; 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.Clock; +import io.opentelemetry.sdk.common.InstrumentationScopeInfo; +import io.opentelemetry.sdk.logs.data.Body; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; import io.opentelemetry.sdk.logs.data.Severity; +import io.opentelemetry.sdk.resources.Resource; import java.time.Instant; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) class SdkLogBuilderTest { + private static final Resource RESOURCE = Resource.empty(); + private static final InstrumentationScopeInfo SCOPE_INFO = InstrumentationScopeInfo.empty(); + + @Mock LogEmitterSharedState logEmitterSharedState; + + private final AtomicReference emittedLog = new AtomicReference<>(); + private SdkLogBuilder builder; + + @BeforeEach + void setup() { + when(logEmitterSharedState.getLogLimits()).thenReturn(LogLimits.getDefault()); + when(logEmitterSharedState.getLogProcessor()).thenReturn(emittedLog::set); + when(logEmitterSharedState.getResource()).thenReturn(RESOURCE); + when(logEmitterSharedState.getClock()).thenReturn(Clock.getDefault()); + + builder = new SdkLogBuilder(logEmitterSharedState, SCOPE_INFO); + } + @Test - void buildAndEmit() { + void emit_AllFields() { Instant now = Instant.now(); String bodyStr = "body"; String sevText = "sevText"; Severity severity = Severity.DEBUG3; Attributes attrs = Attributes.empty(); - AtomicReference seenLog = new AtomicReference<>(); - LogProcessor logProcessor = seenLog::set; - - LogEmitterSharedState state = mock(LogEmitterSharedState.class); - LogDataBuilder delegate = mock(LogDataBuilder.class); - LogData logData = mock(LogData.class); - Context context = mock(Context.class); + SpanContext spanContext = + SpanContext.create( + "33333333333333333333333333333333", + "7777777777777777", + TraceFlags.getSampled(), + TraceState.getDefault()); - when(state.getLogLimits()).thenReturn(LogLimits.getDefault()); - when(state.getLogProcessor()).thenReturn(logProcessor); - when(delegate.build()).thenReturn(logData); - - SdkLogBuilder builder = new SdkLogBuilder(state, delegate); builder.setBody(bodyStr); - verify(delegate).setBody(bodyStr); builder.setEpoch(123, TimeUnit.SECONDS); - verify(delegate).setEpoch(123, TimeUnit.SECONDS); builder.setEpoch(now); - verify(delegate).setEpoch(now); builder.setAttributes(attrs); - verify(delegate).setAttributes(attrs); - builder.setContext(context); - verify(delegate).setContext(context); + builder.setContext(Span.wrap(spanContext).storeInContext(Context.root())); builder.setSeverity(severity); - verify(delegate).setSeverity(severity); builder.setSeverityText(sevText); - verify(delegate).setSeverityText(sevText); builder.emit(); - assertThat(seenLog.get()).isSameAs(logData); + assertThat(emittedLog.get()) + .hasResource(RESOURCE) + .hasInstrumentationScope(SCOPE_INFO) + .hasBody(bodyStr) + .hasEpochNanos(TimeUnit.SECONDS.toNanos(now.getEpochSecond()) + now.getNano()) + .hasAttributes(attrs) + .hasSpanContext(spanContext) + .hasSeverity(severity) + .hasSeverityText(sevText); } @Test - void emitAfterShutdown() { - LogEmitterSharedState state = mock(LogEmitterSharedState.class); - LogDataBuilder delegate = mock(LogDataBuilder.class); + void emit_NoFields() { + Clock clock = mock(Clock.class); + when(clock.now()).thenReturn(10L); + when(logEmitterSharedState.getClock()).thenReturn(clock); + + builder.emit(); - when(state.hasBeenShutdown()).thenReturn(true); + assertThat(emittedLog.get()) + .hasResource(RESOURCE) + .hasInstrumentationScope(SCOPE_INFO) + .hasBody(Body.empty().asString()) + .hasEpochNanos(10L) + .hasAttributes(Attributes.empty()) + .hasSpanContext(SpanContext.getInvalid()) + .hasSeverity(Severity.UNDEFINED_SEVERITY_NUMBER); + } + + @Test + void emit_AfterShutdown() { + when(logEmitterSharedState.hasBeenShutdown()).thenReturn(true); - SdkLogBuilder builder = new SdkLogBuilder(state, delegate); builder.emit(); - verify(state, never()).getLogProcessor(); - verifyNoInteractions(delegate); + + assertThat(emittedLog.get()).isNull(); } } 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 deleted file mode 100644 index c055f5e0b37..00000000000 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/data/LogDataBuilderTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.logs.data; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -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.InstrumentationScopeInfo; -import io.opentelemetry.sdk.resources.Resource; -import org.junit.jupiter.api.Test; - -class LogDataBuilderTest { - - private final Resource resource = Resource.getDefault(); - private final InstrumentationScopeInfo scopeInfo = InstrumentationScopeInfo.empty(); - - @Test - void canSetClock() { - Clock clock = mock(Clock.class); - when(clock.now()).thenReturn(12L); - LogDataBuilder builder = LogDataBuilder.create(resource, scopeInfo, clock); - - LogData result = builder.build(); - assertThat(result.getEpochNanos()).isEqualTo(12L); - } - - @Test - void canSetSpanContext() { - LogDataBuilder builder = LogDataBuilder.create(resource, scopeInfo); - SpanContext spanContext = mock(SpanContext.class); - LogData result = builder.setSpanContext(spanContext).build(); - assertThat(result.getSpanContext()).isSameAs(spanContext); - } - - @Test - void setSpanContext_nullSafe() { - LogDataBuilder builder = LogDataBuilder.create(resource, scopeInfo); - LogData result = builder.setSpanContext(null).build(); - assertThat(result.getSpanContext()).isSameAs(SpanContext.getInvalid()); - } - - @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, scopeInfo); - - LogData result = builder.setContext(context).build(); - assertThat(result.getSpanContext()).isSameAs(spanContext); - } -} diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/InMemoryLogExporterTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/InMemoryLogExporterTest.java index fcb1b546b9a..0ca68f32817 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/InMemoryLogExporterTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/InMemoryLogExporterTest.java @@ -6,13 +6,13 @@ package io.opentelemetry.sdk.logs.export; import static io.opentelemetry.sdk.logs.data.Severity.DEBUG; -import static io.opentelemetry.sdk.logs.util.TestUtil.createLogData; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.sdk.logs.LogEmitter; import io.opentelemetry.sdk.logs.SdkLogEmitterProvider; import io.opentelemetry.sdk.logs.data.LogData; import io.opentelemetry.sdk.testing.assertj.LogAssertions; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.AfterEach; @@ -85,7 +85,7 @@ void shutdown() { @Test void export_ReturnCode() { - LogData logData = createLogData(DEBUG, "message 1"); + LogData logData = TestLogData.builder().setBody("message 1").setSeverity(DEBUG).build(); assertThat(exporter.export(Collections.singletonList(logData)).isSuccess()).isTrue(); exporter.shutdown(); // After shutdown no more export. diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogExporterTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogExporterTest.java index 3e249a8bf9d..f6afd230f42 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogExporterTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/MultiLogExporterTest.java @@ -14,7 +14,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.data.LogData; import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.logs.util.TestUtil; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -30,7 +30,8 @@ class MultiLogExporterTest { @Mock private LogExporter logExporter1; @Mock private LogExporter logExporter2; private static final List LOG_LIST = - Collections.singletonList(TestUtil.createLogData(Severity.DEBUG, "Message!")); + Collections.singletonList( + TestLogData.builder().setBody("Message!").setSeverity(Severity.DEBUG).build()); @Test void empty() { diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogProcessorTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogProcessorTest.java index 7aaa7cf432f..f279fb58c45 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogProcessorTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/SimpleLogProcessorTest.java @@ -19,7 +19,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.LogProcessor; import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.util.TestUtil; +import io.opentelemetry.sdk.testing.logs.TestLogData; import java.util.Collections; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -53,7 +53,7 @@ void create_NullExporter() { @Test void addLogRecord() { - LogData logData = TestUtil.createLogData(DEBUG, "Log message"); + LogData logData = TestLogData.builder().setSeverity(DEBUG).setBody("Log message").build(); logProcessor.emit(logData); verify(logExporter).export(Collections.singletonList(logData)); } @@ -61,7 +61,7 @@ void addLogRecord() { @Test @SuppressLogger(SimpleLogProcessor.class) void addLogRecord_ExporterError() { - LogData logData = TestUtil.createLogData(DEBUG, "Log message"); + LogData logData = TestLogData.builder().setSeverity(DEBUG).setBody("Log message").build(); when(logExporter.export(any())).thenThrow(new RuntimeException("Exporter error!")); logProcessor.emit(logData); logProcessor.emit(logData); @@ -75,7 +75,7 @@ void forceFlush() { when(logExporter.export(any())).thenReturn(export1, export2); - LogData logData = TestUtil.createLogData(DEBUG, "Log message"); + LogData logData = TestLogData.builder().setSeverity(DEBUG).setBody("Log message").build(); logProcessor.emit(logData); logProcessor.emit(logData); @@ -99,7 +99,7 @@ void shutdown() { when(logExporter.export(any())).thenReturn(export1, export2); - LogData logData = TestUtil.createLogData(DEBUG, "Log message"); + LogData logData = TestLogData.builder().setSeverity(DEBUG).setBody("Log message").build(); logProcessor.emit(logData); logProcessor.emit(logData); diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/util/TestUtil.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/util/TestUtil.java deleted file mode 100644 index 420bf214785..00000000000 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/util/TestUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.sdk.logs.util; - -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.sdk.common.InstrumentationScopeInfo; -import io.opentelemetry.sdk.logs.data.LogData; -import io.opentelemetry.sdk.logs.data.LogDataBuilder; -import io.opentelemetry.sdk.logs.data.Severity; -import io.opentelemetry.sdk.resources.Resource; -import java.util.concurrent.TimeUnit; - -public final class TestUtil { - - public static LogData createLogData(Severity severity, String message) { - return LogDataBuilder.create( - Resource.create(Attributes.builder().put("testKey", "testValue").build()), - InstrumentationScopeInfo.create("instrumentation", "1", null)) - .setEpoch(System.currentTimeMillis(), TimeUnit.MILLISECONDS) - .setSeverity(severity) - .setSeverityText("really severe") - .setBody(message) - .setAttributes(Attributes.builder().put("animal", "cat").build()) - .build(); - } - - private TestUtil() {} -}