From 396d6ef8b3d3cd5253d8bd5b75029cbeb07536ba Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 28 May 2026 17:30:10 -0700 Subject: [PATCH 1/5] expose noop span exporter directly --- .../io/opentelemetry/sdk/trace/export/SpanExporter.java | 7 +++++++ 1 file changed, 7 insertions(+) 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..525d111c0f1 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,13 @@ 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 From 78c4fc5ebcb2be6091ad43e94a3bb4e7720c4ddb Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 28 May 2026 17:35:32 -0700 Subject: [PATCH 2/5] add noop to LogRecordExporter --- .../opentelemetry/sdk/logs/export/LogRecordExporter.java | 7 +++++++ 1 file changed, 7 insertions(+) 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..664251b7ff5 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}. * From a6f0156a8e73c0787ad8ce76b9f48764092dabbd Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Fri, 29 May 2026 14:04:14 -0700 Subject: [PATCH 3/5] spotless --- .../io/opentelemetry/sdk/logs/export/LogRecordExporter.java | 2 +- .../io/opentelemetry/sdk/trace/export/SpanExporter.java | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) 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 664251b7ff5..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 @@ -59,7 +59,7 @@ static LogRecordExporter composite(Iterable exporters) { /** * Returns a {@link LogRecordExporter} that does nothing. All exported LogRecordData are ignored. */ - static LogRecordExporter noop(){ + static LogRecordExporter noop() { return NoopLogRecordExporter.getInstance(); } 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 525d111c0f1..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,10 +55,8 @@ static SpanExporter composite(Iterable exporters) { return MultiSpanExporter.create(exportersList); } - /** - * Returns a {@link SpanExporter} that does nothing. All exported Spans are ignored. - */ - static SpanExporter noop(){ + /** Returns a {@link SpanExporter} that does nothing. All exported Spans are ignored. */ + static SpanExporter noop() { return NoopSpanExporter.getInstance(); } From c2c3a3a50d5b6d8131f2d5633671de5b2f89fc2c Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Mon, 1 Jun 2026 14:33:07 -0700 Subject: [PATCH 4/5] expose noops in api --- docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt | 4 +++- docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) 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() From 6ab6e044ec1659c6965d395d3490f5feac4a140d Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 2 Jun 2026 11:06:38 -0700 Subject: [PATCH 5/5] add tests --- .../logs/export/LogRecordExporterTest.java | 45 +++++++++++++++++++ .../sdk/trace/export/SpanExporterTest.java | 45 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 sdk/logs/src/test/java/io/opentelemetry/sdk/logs/export/LogRecordExporterTest.java create mode 100644 sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SpanExporterTest.java 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/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); + } +}