Skip to content

Commit

Permalink
OpenTracing Shim: Properly set the status based on the error tag. (#4962
Browse files Browse the repository at this point in the history
)
  • Loading branch information
carlosalberto committed Nov 24, 2022
1 parent f6deb4c commit 41c5fbc
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 5 deletions.
Expand Up @@ -44,7 +44,7 @@ final class SpanBuilderShim extends BaseShimObject implements SpanBuilder {

private final List<Object> spanBuilderAttributeValues = new ArrayList<>();
@Nullable private SpanKind spanKind;
private boolean error;
@Nullable private Boolean error;
private long startTimestampMicros;

private static final Attributes CHILD_OF_ATTR =
Expand Down Expand Up @@ -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);
Expand Down
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
Expand Up @@ -11,17 +11,20 @@
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;
import io.opentelemetry.sdk.trace.ReadableSpan;
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;
Expand All @@ -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();
Expand Down Expand Up @@ -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 =
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 41c5fbc

Please sign in to comment.