OpenTracing Shim: Properly set the status based on the error tag. (#4962)

This commit is contained in:
Carlos Alberto Cortez 2022-11-24 19:53:09 +01:00 committed by GitHub
parent f6deb4c1b7
commit 41c5fbc19a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 101 additions and 5 deletions

View File

@ -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 =
@ -249,8 +249,8 @@ final class SpanBuilderShim extends BaseShimObject implements SpanBuilder {
}
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);

View File

@ -86,7 +86,7 @@ final class SpanShim extends BaseShimObject implements Span, ImplicitContextKeye
// 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 @@ final class SpanShim extends BaseShimObject implements Span, ImplicitContextKeye
@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);

View File

@ -11,6 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat;
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.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;
@ -41,6 +44,23 @@ class SpanBuilderShimTest {
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 @@ class SpanBuilderShimTest {
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 =

View File

@ -15,8 +15,10 @@ import io.opentelemetry.sdk.trace.ReadableSpan;
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 @@ class SpanShimTest {
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);