diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt index 390854a14ef..113e633aede 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt @@ -1,2 +1,4 @@ Comparing source compatibility of opentelemetry-sdk-logs-1.63.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.62.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.logs.export.LogRecordExporter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.logs.export.LogRecordExporter noop() diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt index abb4aed30ea..795070a6407 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt @@ -1,2 +1,4 @@ Comparing source compatibility of opentelemetry-sdk-trace-1.63.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.62.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.trace.export.SpanExporter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.trace.export.SpanExporter noop() diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java index 9b0fd51facb..505d37d0e48 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/export/LogRecordExporter.java @@ -56,6 +56,13 @@ static LogRecordExporter composite(Iterable exporters) { return MultiLogRecordExporter.create(exportersList); } + /** + * Returns a {@link LogRecordExporter} that does nothing. All exported LogRecordData are ignored. + */ + static LogRecordExporter noop() { + return NoopLogRecordExporter.getInstance(); + } + /** * Exports the collections of given {@link LogRecordData}. * diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/LogRecordExporterTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/LogRecordExporterTest.java new file mode 100644 index 00000000000..10325453adc --- /dev/null +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/LogRecordExporterTest.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs.export; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.logs.data.LogRecordData; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Test; + +class LogRecordExporterTest { + + @Test + void testNoop() { + LogRecordExporter noop = LogRecordExporter.noop(); + assertNotNull(noop); + assertSame(NoopLogRecordExporter.getInstance(), noop); + } + + @Test + void testComposite() { + LogRecordExporter exp1 = mock(); + LogRecordExporter exp2 = mock(); + List logs = Collections.singletonList(mock()); + + when(exp1.export(logs)).thenReturn(CompletableResultCode.ofSuccess()); + when(exp2.export(logs)).thenReturn(CompletableResultCode.ofSuccess()); + + LogRecordExporter exporter = LogRecordExporter.composite(exp1, exp2); + + exporter.export(logs); + + verify(exp1).export(logs); + verify(exp2).export(logs); + } +} diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java index 86fb4aa0fb8..37628de1e6b 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/export/SpanExporter.java @@ -55,6 +55,11 @@ static SpanExporter composite(Iterable exporters) { return MultiSpanExporter.create(exportersList); } + /** Returns a {@link SpanExporter} that does nothing. All exported Spans are ignored. */ + static SpanExporter noop() { + return NoopSpanExporter.getInstance(); + } + /** * Called to export sampled {@code Span}s. Note that export operations can be performed * simultaneously depending on the type of span processor being used. However, the {@link diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SpanExporterTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SpanExporterTest.java new file mode 100644 index 00000000000..9af27df210f --- /dev/null +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SpanExporterTest.java @@ -0,0 +1,45 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.trace.export; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.opentelemetry.sdk.common.CompletableResultCode; +import io.opentelemetry.sdk.trace.data.SpanData; +import java.util.Collection; +import java.util.Collections; +import org.junit.jupiter.api.Test; + +class SpanExporterTest { + + @Test + void testNoop() { + SpanExporter exporter = SpanExporter.noop(); + assertNotNull(exporter); + assertSame(exporter, NoopSpanExporter.getInstance()); + } + + @Test + void testComposite() { + SpanExporter exp1 = mock(); + SpanExporter exp2 = mock(); + + Collection spans = Collections.singletonList(mock(SpanData.class)); + + when(exp1.export(spans)).thenReturn(CompletableResultCode.ofSuccess()); + when(exp2.export(spans)).thenReturn(CompletableResultCode.ofSuccess()); + + SpanExporter exporter = SpanExporter.composite(exp1, exp2); + + exporter.export(spans); + verify(exp1).export(spans); + verify(exp2).export(spans); + } +}