From c0b73f5218d3b0867c01d07a456d311da6f09a20 Mon Sep 17 00:00:00 2001 From: Austin Pederson Date: Thu, 8 Feb 2024 11:46:28 -0800 Subject: [PATCH] #6207 Ensure Span Status Cannot Be Updated After StatusCode.OK Is Set (#6209) --- .../main/java/io/opentelemetry/sdk/trace/SdkSpan.java | 3 +++ .../java/io/opentelemetry/sdk/trace/SdkSpanTest.java | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index 7f095ddd916..fec835b17ff 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -394,6 +394,9 @@ public ReadWriteSpan setStatus(StatusCode statusCode, @Nullable String descripti if (hasEnded) { logger.log(Level.FINE, "Calling setStatus() on an ended Span."); return this; + } else if (this.status.getStatusCode() == StatusCode.OK) { + logger.log(Level.FINE, "Calling setStatus() on a Span that is already set to OK."); + return this; } this.status = StatusData.create(statusCode, description); } diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java index db75f189e06..df7a6ba1c02 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java @@ -1178,6 +1178,17 @@ void onStartOnEndNotRequired() { verify(spanProcessor, never()).onEnd(any()); } + @Test + void setStatusCannotOverrideStatusOK() { + SdkSpan testSpan = createTestRootSpan(); + testSpan.setStatus(StatusCode.OK); + assertThat(testSpan.toSpanData().getStatus().getStatusCode()).isEqualTo(StatusCode.OK); + testSpan.setStatus(StatusCode.ERROR); + assertThat(testSpan.toSpanData().getStatus().getStatusCode()).isEqualTo(StatusCode.OK); + testSpan.setStatus(StatusCode.UNSET); + assertThat(testSpan.toSpanData().getStatus().getStatusCode()).isEqualTo(StatusCode.OK); + } + private SdkSpan createTestSpanWithAttributes(Map attributes) { SpanLimits spanLimits = SpanLimits.getDefault(); AttributesMap attributesMap =