Update the zipkin exporter Span Status handling (#2050)

CHANGELOG: Zipkin exporter has had it's handling of Span Status to match the specification.

* Update the zipkin exporter Span Status handling

* Fix review

* Remove unneeded check null
This commit is contained in:
dengliming 2020-11-12 04:36:05 +08:00 committed by GitHub
parent 56b1c23ac4
commit ac1099ee9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 14 deletions

View File

@ -14,7 +14,6 @@ import io.opentelemetry.api.common.AttributeType;
import io.opentelemetry.api.common.ReadableAttributes;
import io.opentelemetry.api.trace.Span.Kind;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.attributes.SemanticAttributes;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
import io.opentelemetry.sdk.common.export.ConfigBuilder;
@ -140,15 +139,15 @@ public final class ZipkinSpanExporter implements SpanExporter {
}
});
SpanData.Status status = spanData.getStatus();
// for GRPC spans, include status code & description.
if (status != null && spanAttributes.get(SemanticAttributes.RPC_SERVICE) != null) {
// include status code & description.
if (!status.isUnset()) {
spanBuilder.putTag(OTEL_STATUS_CODE, status.getCanonicalCode().toString());
if (status.getDescription() != null) {
spanBuilder.putTag(OTEL_STATUS_DESCRIPTION, status.getDescription());
}
}
// add the error tag, if it isn't already in the source span.
if (status != null && !status.isOk() && spanAttributes.get(STATUS_ERROR) == null) {
if (!status.isOk() && spanAttributes.get(STATUS_ERROR) == null) {
spanBuilder.putTag(STATUS_ERROR.getKey(), status.getCanonicalCode().toString());
}

View File

@ -166,6 +166,7 @@ public class ZipkinSpanExporterEndToEndHttpTest {
.localEndpoint(localEndpoint)
.addAnnotation(RECEIVED_TIMESTAMP_NANOS / 1000, "RECEIVED")
.addAnnotation(SENT_TIMESTAMP_NANOS / 1000, "SENT")
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build();
}
}

View File

@ -73,7 +73,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(Span.Kind.SERVER));
.isEqualTo(
standardZipkinSpanBuilder(Span.Kind.SERVER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -84,7 +87,11 @@ class ZipkinSpanExporterTest {
.setEndEpochNanos(1505855794_194009999L)
.build();
Span expected = standardZipkinSpanBuilder(Span.Kind.SERVER).duration(1).build();
Span expected =
standardZipkinSpanBuilder(Span.Kind.SERVER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.duration(1)
.build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint)).isEqualTo(expected);
}
@ -93,7 +100,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().setKind(Kind.SERVER).build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(Span.Kind.SERVER));
.isEqualTo(
standardZipkinSpanBuilder(Span.Kind.SERVER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -101,7 +111,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().setKind(Kind.CLIENT).build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(Span.Kind.CLIENT));
.isEqualTo(
standardZipkinSpanBuilder(Span.Kind.CLIENT)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -109,7 +122,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().setKind(Kind.INTERNAL).build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(null));
.isEqualTo(
standardZipkinSpanBuilder(null)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -117,7 +133,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().setKind(Kind.CONSUMER).build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(Span.Kind.CONSUMER));
.isEqualTo(
standardZipkinSpanBuilder(Span.Kind.CONSUMER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -125,7 +144,10 @@ class ZipkinSpanExporterTest {
SpanData data = buildStandardSpan().setKind(Kind.PRODUCER).build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(buildZipkinSpan(Span.Kind.PRODUCER));
.isEqualTo(
standardZipkinSpanBuilder(Span.Kind.PRODUCER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@Test
@ -136,7 +158,10 @@ class ZipkinSpanExporterTest {
Endpoint expectedEndpoint = Endpoint.newBuilder().serviceName("super-zipkin-service").build();
Span expectedZipkinSpan =
buildZipkinSpan(Span.Kind.SERVER).toBuilder().localEndpoint(expectedEndpoint).build();
buildZipkinSpan(Span.Kind.SERVER).toBuilder()
.localEndpoint(expectedEndpoint)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint)).isEqualTo(expectedZipkinSpan);
}
@ -166,6 +191,7 @@ class ZipkinSpanExporterTest {
.putTag("stringArray", "Hello")
.putTag("doubleArray", "32.33,-98.3")
.putTag("longArray", "33,999")
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@ -183,6 +209,7 @@ class ZipkinSpanExporterTest {
buildZipkinSpan(Span.Kind.CLIENT).toBuilder()
.putTag("otel.library.name", "io.opentelemetry.auto")
.putTag("otel.library.version", "1.0.0")
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build());
}
@ -203,6 +230,7 @@ class ZipkinSpanExporterTest {
buildZipkinSpan(Span.Kind.CLIENT).toBuilder()
.clearTags()
.putTag(SemanticAttributes.HTTP_STATUS_CODE.getKey(), "404")
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "ERROR")
.putTag("error", "A user provided error")
.build());
}
@ -229,13 +257,34 @@ class ZipkinSpanExporterTest {
.build());
}
@Test
void generateSpan_WithRpcUnsetStatus() {
Attributes attributeMap = Attributes.of(SemanticAttributes.RPC_SERVICE, "my service name");
SpanData data =
buildStandardSpan()
.setStatus(SpanData.Status.create(StatusCode.UNSET, null))
.setAttributes(attributeMap)
.build();
assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint))
.isEqualTo(
buildZipkinSpan(Span.Kind.SERVER).toBuilder()
.putTag(SemanticAttributes.RPC_SERVICE.getKey(), "my service name")
.build());
}
@Test
void testExport() {
ZipkinSpanExporter zipkinSpanExporter =
new ZipkinSpanExporter(mockEncoder, mockSender, "tweetiebird");
byte[] someBytes = new byte[0];
when(mockEncoder.encode(buildZipkinSpan(Span.Kind.SERVER))).thenReturn(someBytes);
when(mockEncoder.encode(
standardZipkinSpanBuilder(Span.Kind.SERVER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build()))
.thenReturn(someBytes);
when(mockSender.sendSpans(Collections.singletonList(someBytes))).thenReturn(mockZipkinCall);
doAnswer(
invocation -> {
@ -258,7 +307,11 @@ class ZipkinSpanExporterTest {
new ZipkinSpanExporter(mockEncoder, mockSender, "tweetiebird");
byte[] someBytes = new byte[0];
when(mockEncoder.encode(buildZipkinSpan(Span.Kind.SERVER))).thenReturn(someBytes);
when(mockEncoder.encode(
standardZipkinSpanBuilder(Span.Kind.SERVER)
.putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "OK")
.build()))
.thenReturn(someBytes);
when(mockSender.sendSpans(Collections.singletonList(someBytes))).thenReturn(mockZipkinCall);
doAnswer(
invocation -> {