From 6a91dc382a554605379dd45df988922e900f409b Mon Sep 17 00:00:00 2001 From: Eunbin Son Date: Sun, 21 Jun 2026 18:13:02 +0900 Subject: [PATCH] Preserve OpenCensus status description when converting to OpenTelemetry --- CHANGELOG.md | 4 ++ .../opencensusshim/OpenTelemetrySpanImpl.java | 8 ++- .../OpenTelemetrySpanImplTest.java | 50 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index c399e74acfa..8ff72ada7ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Shims + +* OpenCensus: Preserve status description when converting a span status to OpenTelemetry + ## Version 1.63.0 (2026-06-05) ### API diff --git a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java index 8d25f722786..87c41b1ff07 100644 --- a/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java +++ b/opencensus-shim/src/main/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImpl.java @@ -123,7 +123,13 @@ public void addMessageEvent(MessageEvent messageEvent) { @Override public void setStatus(Status status) { Preconditions.checkNotNull(status, "status"); - DelegatingSpan.super.setStatus(status.isOk() ? StatusCode.OK : StatusCode.ERROR); + StatusCode code = status.isOk() ? StatusCode.OK : StatusCode.ERROR; + String description = status.getDescription(); + if (description == null) { + DelegatingSpan.super.setStatus(code); + } else { + DelegatingSpan.super.setStatus(code, description); + } } @Override diff --git a/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java b/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java new file mode 100644 index 00000000000..448c032a3f8 --- /dev/null +++ b/opencensus-shim/src/test/java/io/opentelemetry/opencensusshim/OpenTelemetrySpanImplTest.java @@ -0,0 +1,50 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.opencensusshim; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.opencensus.trace.Status; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.StatusCode; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) +class OpenTelemetrySpanImplTest { + + @Mock private Span otelSpan; + + private OpenTelemetrySpanImpl shimSpan() { + when(otelSpan.getSpanContext()).thenReturn(SpanContext.getInvalid()); + return new OpenTelemetrySpanImpl(otelSpan); + } + + @Test + void setStatus_preservesDescription() { + shimSpan().setStatus(Status.UNKNOWN.withDescription("connection refused")); + + verify(otelSpan).setStatus(StatusCode.ERROR, "connection refused"); + } + + @Test + void setStatus_withoutDescription_setsCodeOnly() { + shimSpan().setStatus(Status.OK); + + verify(otelSpan).setStatus(StatusCode.OK); + verify(otelSpan, never()).setStatus(any(StatusCode.class), anyString()); + } +}