diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java index ac3c1f62c17..2551e83d7d8 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java @@ -44,7 +44,7 @@ final class SpanBuilderShim extends BaseShimObject implements SpanBuilder { private final List spanBuilderAttributeValues = new ArrayList<>(); @Nullable private SpanKind spanKind; - private boolean error; + @Nullable private Boolean error; private long startTimestampMicros; private static final Attributes CHILD_OF_ATTR = @@ -249,8 +249,8 @@ public Span start() { } io.opentelemetry.api.trace.Span span = builder.startSpan(); - if (error) { - span.setStatus(StatusCode.ERROR); + if (error != null) { + span.setStatus(error ? StatusCode.ERROR : StatusCode.OK); } return new SpanShim(telemetryInfo(), span, baggage); diff --git a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java index 10adf19adf5..c12858c72ff 100644 --- a/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java +++ b/opentracing-shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java @@ -86,7 +86,7 @@ public Span setTag(String key, String value) { // TODO: confirm we can safely ignore span.kind after Span was created // https://github.com/bogdandrutu/opentelemetry/issues/42 } else if (Tags.ERROR.getKey().equals(key)) { - StatusCode canonicalCode = Boolean.parseBoolean(value) ? StatusCode.ERROR : StatusCode.UNSET; + StatusCode canonicalCode = Boolean.parseBoolean(value) ? StatusCode.ERROR : StatusCode.OK; span.setStatus(canonicalCode); } else { span.setAttribute(key, value); @@ -98,7 +98,7 @@ public Span setTag(String key, String value) { @Override public Span setTag(String key, boolean value) { if (Tags.ERROR.getKey().equals(key)) { - StatusCode canonicalCode = value ? StatusCode.ERROR : StatusCode.UNSET; + StatusCode canonicalCode = value ? StatusCode.ERROR : StatusCode.OK; span.setStatus(canonicalCode); } else { span.setAttribute(key, value); diff --git a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanBuilderShimTest.java b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanBuilderShimTest.java index 16ff9cfeb99..a915cee1272 100644 --- a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanBuilderShimTest.java +++ b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanBuilderShimTest.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; @@ -18,10 +19,12 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.data.StatusData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentracing.References; +import io.opentracing.tag.Tags; import java.math.BigInteger; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -41,6 +44,23 @@ void setUp() { GlobalOpenTelemetry.resetForTest(); } + @Test + void default_values() { + SpanShim span = (SpanShim) new SpanBuilderShim(telemetryInfo, SPAN_NAME).start(); + try { + SpanData spanData = ((ReadableSpan) span.getSpan()).toSpanData(); + assertThat(spanData.getName()).isEqualTo(SPAN_NAME); + assertThat(spanData.getStatus()).isEqualTo(StatusData.unset()); + assertThat(spanData.getSpanContext()).isNotEqualTo(SpanContext.getInvalid()); + assertThat(spanData.getKind()).isEqualTo(SpanKind.INTERNAL); + assertThat(spanData.getAttributes().size()).isEqualTo(0); + assertThat(spanData.getEvents()).hasSize(0); + assertThat(spanData.getLinks()).hasSize(0); + } finally { + span.finish(); + } + } + @Test void parent_single() { SpanShim parentSpan = (SpanShim) new SpanBuilderShim(telemetryInfo, SPAN_NAME).start(); @@ -297,6 +317,54 @@ void withStartTimestamp() { assertThat(spanData.getStartEpochNanos()).isEqualTo(micros * 1000L); } + @Test + void setAttribute_errorAsBoolean() { + SpanShim span1 = + (SpanShim) + new SpanBuilderShim(telemetryInfo, SPAN_NAME) + .withTag(Tags.ERROR.getKey(), true) + .start(); + SpanShim span2 = + (SpanShim) + new SpanBuilderShim(telemetryInfo, SPAN_NAME) + .withTag(Tags.ERROR.getKey(), false) + .start(); + try { + SpanData spanData1 = ((ReadableSpan) span1.getSpan()).toSpanData(); + assertThat(spanData1.getStatus()).isEqualTo(StatusData.error()); + + SpanData spanData2 = ((ReadableSpan) span2.getSpan()).toSpanData(); + assertThat(spanData2.getStatus()).isEqualTo(StatusData.ok()); + } finally { + span1.finish(); + span2.finish(); + } + } + + @Test + void setAttribute_errorAsString() { + SpanShim span1 = + (SpanShim) + new SpanBuilderShim(telemetryInfo, SPAN_NAME) + .withTag(Tags.ERROR.getKey(), "tRuE") + .start(); + SpanShim span2 = + (SpanShim) + new SpanBuilderShim(telemetryInfo, SPAN_NAME) + .withTag(Tags.ERROR.getKey(), "FaLsE") + .start(); + try { + SpanData spanData1 = ((ReadableSpan) span1.getSpan()).toSpanData(); + assertThat(spanData1.getStatus()).isEqualTo(StatusData.error()); + + SpanData spanData2 = ((ReadableSpan) span2.getSpan()).toSpanData(); + assertThat(spanData2.getStatus()).isEqualTo(StatusData.ok()); + } finally { + span1.finish(); + span2.finish(); + } + } + @Test void setAttribute_unrecognizedType() { SpanShim span = diff --git a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanShimTest.java b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanShimTest.java index 1d304e04c32..66b9a21be25 100644 --- a/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanShimTest.java +++ b/opentracing-shim/src/test/java/io/opentelemetry/opentracingshim/SpanShimTest.java @@ -15,8 +15,10 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.data.EventData; import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.sdk.trace.data.StatusData; import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; import io.opentracing.log.Fields; +import io.opentracing.tag.Tags; import java.math.BigInteger; import java.util.HashMap; import java.util.Map; @@ -60,6 +62,32 @@ void context_simple() { assertThat(contextShim.baggageItems().iterator().hasNext()).isFalse(); } + @Test + void setAttribute_errorAsBoolean() { + SpanShim spanShim = new SpanShim(telemetryInfo, span); + spanShim.setTag(Tags.ERROR.getKey(), true); + + SpanData spanData = ((ReadableSpan) span).toSpanData(); + assertThat(spanData.getStatus()).isEqualTo(StatusData.error()); + + spanShim.setTag(Tags.ERROR.getKey(), false); + spanData = ((ReadableSpan) span).toSpanData(); + assertThat(spanData.getStatus()).isEqualTo(StatusData.ok()); + } + + @Test + void setAttribute_errorAsString() { + SpanShim spanShim = new SpanShim(telemetryInfo, span); + spanShim.setTag(Tags.ERROR.getKey(), "tRuE"); + + SpanData spanData = ((ReadableSpan) span).toSpanData(); + assertThat(spanData.getStatus()).isEqualTo(StatusData.error()); + + spanShim.setTag(Tags.ERROR.getKey(), "FaLsE"); + spanData = ((ReadableSpan) span).toSpanData(); + assertThat(spanData.getStatus()).isEqualTo(StatusData.ok()); + } + @Test void setAttribute_unrecognizedType() { SpanShim spanShim = new SpanShim(telemetryInfo, span);