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 =