diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java index aaefb61fc4..4d570993d0 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java @@ -483,6 +483,12 @@ final class RecordEventsReadableSpan implements ReadWriteSpan { return Collections.emptyList(); } + // if the span has ended, then the events are unmodifiable + // so we can return them directly and save copying all the data. + if (hasEnded) { + return Collections.unmodifiableList(events); + } + return Collections.unmodifiableList(new ArrayList<>(events)); } diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java index 9058df3894..cab9e87801 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java @@ -195,6 +195,17 @@ class RecordEventsReadableSpanTest { .isInstanceOf(UnsupportedOperationException.class); } + @Test + void toSpanData_immutableEvents_ended() { + RecordEventsReadableSpan span = createTestSpan(SpanKind.INTERNAL); + span.end(); + SpanData spanData = span.toSpanData(); + + assertThatThrownBy( + () -> spanData.getEvents().add(EventData.create(1000, "test", Attributes.empty()))) + .isInstanceOf(UnsupportedOperationException.class); + } + @Test void toSpanData_RootSpan() { RecordEventsReadableSpan span = createTestRootSpan();