diff --git a/QUICKSTART.md b/QUICKSTART.md index a87f86b6ace..b11de4d934e 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -55,7 +55,7 @@ try (Scope scope = tracer.withSpan(span)) { // your use case ... } catch (Throwable t) { - Status status = Status.UNKNOWN.withDescription("Change it to your error message"); + Status status = Status.ERROR.withDescription("Change it to your error message"); span.setStatus(status); } finally { span.end(); // closing the scope does not end the span, this has to be done manually diff --git a/api/src/main/java/io/opentelemetry/trace/Status.java b/api/src/main/java/io/opentelemetry/trace/Status.java index 74a27478a8e..6b47eeed2bb 100644 --- a/api/src/main/java/io/opentelemetry/trace/Status.java +++ b/api/src/main/java/io/opentelemetry/trace/Status.java @@ -17,10 +17,9 @@ package io.opentelemetry.trace; import io.opentelemetry.internal.Utils; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.TreeMap; import javax.annotation.Nullable; @@ -44,163 +43,18 @@ public final class Status { * @since 0.1.0 */ public enum CanonicalCode { - /** - * The operation completed successfully. - * - * @since 0.1.0 - */ - OK(0), - - /** - * The operation was cancelled (typically by the caller). - * - * @since 0.1.0 - */ - CANCELLED(1), - - /** - * Unknown error. An example of where this error may be returned is if a Status value received - * from another address space belongs to an error-space that is not known in this address space. - * Also errors raised by APIs that do not return enough error information may be converted to - * this error. - * - * @since 0.1.0 - */ - UNKNOWN(2), - - /** - * Client specified an invalid argument. Note that this differs from FAILED_PRECONDITION. - * INVALID_ARGUMENT indicates arguments that are problematic regardless of the state of the - * system (e.g., a malformed file name). - * - * @since 0.1.0 - */ - INVALID_ARGUMENT(3), - - /** - * Deadline expired before operation could complete. For operations that change the state of the - * system, this error may be returned even if the operation has completed successfully. For - * example, a successful response from a server could have been delayed long enough for the - * deadline to expire. - * - * @since 0.1.0 - */ - DEADLINE_EXCEEDED(4), - - /** - * Some requested entity (e.g., file or directory) was not found. - * - * @since 0.1.0 - */ - NOT_FOUND(5), - - /** - * Some entity that we attempted to create (e.g., file or directory) already exists. - * - * @since 0.1.0 - */ - ALREADY_EXISTS(6), - - /** - * The caller does not have permission to execute the specified operation. PERMISSION_DENIED - * must not be used for rejections caused by exhausting some resource (use RESOURCE_EXHAUSTED - * instead for those errors). PERMISSION_DENIED must not be used if the caller cannot be - * identified (use UNAUTHENTICATED instead for those errors). - * - * @since 0.1.0 - */ - PERMISSION_DENIED(7), - - /** - * Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system - * is out of space. - * - * @since 0.1.0 - */ - RESOURCE_EXHAUSTED(8), - - /** - * Operation was rejected because the system is not in a state required for the operation's - * execution. For example, directory to be deleted may be non-empty, an rmdir operation is - * applied to a non-directory, etc. - * - *

A litmus test that may help a service implementor in deciding between FAILED_PRECONDITION, - * ABORTED, and UNAVAILABLE: (a) Use UNAVAILABLE if the client can retry just the failing call. - * (b) Use ABORTED if the client should retry at a higher-level (e.g., restarting a - * read-modify-write sequence). (c) Use FAILED_PRECONDITION if the client should not retry until - * the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory - * is non-empty, FAILED_PRECONDITION should be returned since the client should not retry unless - * they have first fixed up the directory by deleting files from it. - * - * @since 0.1.0 - */ - FAILED_PRECONDITION(9), - - /** - * The operation was aborted, typically due to a concurrency issue like sequencer check - * failures, transaction aborts, etc. - * - *

See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE. - * - * @since 0.1.0 - */ - ABORTED(10), /** - * Operation was attempted past the valid range. E.g., seeking or reading past end of file. - * - *

Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed if the system - * state changes. For example, a 32-bit file system will generate INVALID_ARGUMENT if asked to - * read at an offset that is not in the range [0,2^32-1], but it will generate OUT_OF_RANGE if - * asked to read from an offset past the current file size. - * - *

There is a fair bit of overlap between FAILED_PRECONDITION and OUT_OF_RANGE. We recommend - * using OUT_OF_RANGE (the more specific error) when it applies so that callers who are - * iterating through a space can easily look for an OUT_OF_RANGE error to detect when they are - * done. - * - * @since 0.1.0 + * The operation has been validated by an Application developers or Operator to have completed + * successfully. */ - OUT_OF_RANGE(11), - - /** - * Operation is not implemented or not supported/enabled in this service. - * - * @since 0.1.0 - */ - UNIMPLEMENTED(12), - - /** - * Internal errors. Means some invariants expected by underlying system has been broken. If you - * see one of these errors, something is very broken. - * - * @since 0.1.0 - */ - INTERNAL(13), - - /** - * The service is currently unavailable. This is a most likely a transient condition and may be - * corrected by retrying with a backoff. - * - *

See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE. - * - * @since 0.1.0 - */ - UNAVAILABLE(14), + OK(0), - /** - * Unrecoverable data loss or corruption. - * - * @since 0.1.0 - */ - DATA_LOSS(15), + /** The default status. */ + UNSET(1), - /** - * The request does not have valid authentication credentials for the operation. - * - * @since 0.1.0 - */ - UNAUTHENTICATED(16); + /** The operation contains an error. */ + ERROR(2); private final int value; @@ -225,14 +79,14 @@ public int value() { * @since 0.1.0 */ public Status toStatus() { - return STATUS_LIST.get(value); + return STATUSES_BY_VALUE.get(value); } } // Create the canonical list of Status instances indexed by their code values. - private static final List STATUS_LIST = buildStatusList(); + private static final Map STATUSES_BY_VALUE = buildStatusList(); - private static List buildStatusList() { + private static Map buildStatusList() { TreeMap canonicalizer = new TreeMap<>(); for (CanonicalCode code : CanonicalCode.values()) { Status replaced = canonicalizer.put(code.value(), new Status(code, null)); @@ -244,133 +98,22 @@ private static List buildStatusList() { + code.name()); } } - return Collections.unmodifiableList(new ArrayList<>(canonicalizer.values())); + return Collections.unmodifiableMap(canonicalizer); } // A pseudo-enum of Status instances mapped 1:1 with values in CanonicalCode. This simplifies // construction patterns for derived instances of Status. /** - * The operation completed successfully. - * - * @since 0.1.0 + * The operation has been validated by an Application developers or Operator to have completed + * successfully. */ public static final Status OK = CanonicalCode.OK.toStatus(); - /** - * The operation was cancelled (typically by the caller). - * - * @since 0.1.0 - */ - public static final Status CANCELLED = CanonicalCode.CANCELLED.toStatus(); - - /** - * Unknown error. See {@link CanonicalCode#UNKNOWN}. - * - * @since 0.1.0 - */ - public static final Status UNKNOWN = CanonicalCode.UNKNOWN.toStatus(); - - /** - * Client specified an invalid argument. See {@link CanonicalCode#INVALID_ARGUMENT}. - * - * @since 0.1.0 - */ - public static final Status INVALID_ARGUMENT = CanonicalCode.INVALID_ARGUMENT.toStatus(); - - /** - * Deadline expired before operation could complete. See {@link CanonicalCode#DEADLINE_EXCEEDED}. - * - * @since 0.1.0 - */ - public static final Status DEADLINE_EXCEEDED = CanonicalCode.DEADLINE_EXCEEDED.toStatus(); - - /** - * Some requested entity (e.g., file or directory) was not found. - * - * @since 0.1.0 - */ - public static final Status NOT_FOUND = CanonicalCode.NOT_FOUND.toStatus(); - - /** - * Some entity that we attempted to create (e.g., file or directory) already exists. - * - * @since 0.1.0 - */ - public static final Status ALREADY_EXISTS = CanonicalCode.ALREADY_EXISTS.toStatus(); - - /** - * The caller does not have permission to execute the specified operation. See {@link - * CanonicalCode#PERMISSION_DENIED}. - * - * @since 0.1.0 - */ - public static final Status PERMISSION_DENIED = CanonicalCode.PERMISSION_DENIED.toStatus(); - - /** - * The request does not have valid authentication credentials for the operation. - * - * @since 0.1.0 - */ - public static final Status UNAUTHENTICATED = CanonicalCode.UNAUTHENTICATED.toStatus(); - - /** - * Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system - * is out of space. - * - * @since 0.1.0 - */ - public static final Status RESOURCE_EXHAUSTED = CanonicalCode.RESOURCE_EXHAUSTED.toStatus(); - - /** - * Operation was rejected because the system is not in a state required for the operation's - * execution. See {@link CanonicalCode#FAILED_PRECONDITION}. - * - * @since 0.1.0 - */ - public static final Status FAILED_PRECONDITION = CanonicalCode.FAILED_PRECONDITION.toStatus(); - - /** - * The operation was aborted, typically due to a concurrency issue like sequencer check failures, - * transaction aborts, etc. See {@link CanonicalCode#ABORTED}. - * - * @since 0.1.0 - */ - public static final Status ABORTED = CanonicalCode.ABORTED.toStatus(); - - /** - * Operation was attempted past the valid range. See {@link CanonicalCode#OUT_OF_RANGE}. - * - * @since 0.1.0 - */ - public static final Status OUT_OF_RANGE = CanonicalCode.OUT_OF_RANGE.toStatus(); + /** The default status. */ + public static final Status UNSET = CanonicalCode.UNSET.toStatus(); - /** - * Operation is not implemented or not supported/enabled in this service. - * - * @since 0.1.0 - */ - public static final Status UNIMPLEMENTED = CanonicalCode.UNIMPLEMENTED.toStatus(); - - /** - * Internal errors. See {@link CanonicalCode#INTERNAL}. - * - * @since 0.1.0 - */ - public static final Status INTERNAL = CanonicalCode.INTERNAL.toStatus(); - - /** - * The service is currently unavailable. See {@link CanonicalCode#UNAVAILABLE}. - * - * @since 0.1.0 - */ - public static final Status UNAVAILABLE = CanonicalCode.UNAVAILABLE.toStatus(); - - /** - * Unrecoverable data loss or corruption. - * - * @since 0.1.0 - */ - public static final Status DATA_LOSS = CanonicalCode.DATA_LOSS.toStatus(); + /** The operation contains an error. */ + public static final Status ERROR = CanonicalCode.ERROR.toStatus(); // The canonical code of this message. private final CanonicalCode canonicalCode; @@ -419,13 +162,22 @@ public String getDescription() { } /** - * Returns {@code true} if this {@code Status} is OK, i.e., not an error. + * Returns {@code true} if this {@code Status} is UNSET, i.e., not an error. * - * @return {@code true} if this {@code Status} is OK. - * @since 0.1.0 + * @return {@code true} if this {@code Status} is UNSET. + */ + public boolean isUnset() { + return CanonicalCode.UNSET == canonicalCode; + } + + /** + * Returns {@code true} if this {@code Status} is ok, i.e., status is not set, or has been + * overridden to be ok by an operator. + * + * @return {@code true} if this {@code Status} is OK or UNSET. */ public boolean isOk() { - return CanonicalCode.OK == canonicalCode; + return isUnset() || CanonicalCode.OK == canonicalCode; } /** diff --git a/api/src/test/java/io/opentelemetry/trace/StatusTest.java b/api/src/test/java/io/opentelemetry/trace/StatusTest.java index af9b2c81e50..7a51cccbf1c 100644 --- a/api/src/test/java/io/opentelemetry/trace/StatusTest.java +++ b/api/src/test/java/io/opentelemetry/trace/StatusTest.java @@ -28,14 +28,15 @@ void status_Ok() { assertThat(Status.OK.getCanonicalCode()).isEqualTo(Status.CanonicalCode.OK); assertThat(Status.OK.getDescription()).isNull(); assertThat(Status.OK.isOk()).isTrue(); + assertThat(Status.UNSET.isOk()).isTrue(); } @Test void createStatus_WithDescription() { - Status status = Status.UNKNOWN.withDescription("This is an error."); - assertThat(status.getCanonicalCode()).isEqualTo(Status.CanonicalCode.UNKNOWN); + Status status = Status.ERROR.withDescription("This is an error."); + assertThat(status.getCanonicalCode()).isEqualTo(Status.CanonicalCode.ERROR); assertThat(status.getDescription()).isEqualTo("This is an error."); - assertThat(status.isOk()).isFalse(); + assertThat(status.isUnset()).isFalse(); } @Test @@ -43,9 +44,9 @@ void status_EqualsAndHashCode() { EqualsTester tester = new EqualsTester(); tester.addEqualityGroup(Status.OK, Status.OK.withDescription(null)); tester.addEqualityGroup( - Status.CANCELLED.withDescription("ThisIsAnError"), - Status.CANCELLED.withDescription("ThisIsAnError")); - tester.addEqualityGroup(Status.UNKNOWN.withDescription("This is an error.")); + Status.ERROR.withDescription("ThisIsAnError"), + Status.ERROR.withDescription("ThisIsAnError")); + tester.addEqualityGroup(Status.ERROR.withDescription("This is an error.")); tester.testEquals(); } } diff --git a/exporters/jaeger/src/test/java/io/opentelemetry/exporters/jaeger/AdapterTest.java b/exporters/jaeger/src/test/java/io/opentelemetry/exporters/jaeger/AdapterTest.java index e428b778c30..e2cff4d053f 100644 --- a/exporters/jaeger/src/test/java/io/opentelemetry/exporters/jaeger/AdapterTest.java +++ b/exporters/jaeger/src/test/java/io/opentelemetry/exporters/jaeger/AdapterTest.java @@ -218,7 +218,7 @@ void testSpanRef() { } @Test - void testStatusNotOk() { + void testStatusNotUnset() { long startMs = System.currentTimeMillis(); long endMs = startMs + 900; SpanData span = @@ -230,7 +230,7 @@ void testStatusNotOk() { .setStartEpochNanos(TimeUnit.MILLISECONDS.toNanos(startMs)) .setEndEpochNanos(TimeUnit.MILLISECONDS.toNanos(endMs)) .setKind(Span.Kind.SERVER) - .setStatus(Status.CANCELLED) + .setStatus(Status.ERROR) .setTotalRecordedEvents(0) .setTotalRecordedLinks(0) .build(); @@ -257,7 +257,7 @@ void testSpanError() { .setStartEpochNanos(TimeUnit.MILLISECONDS.toNanos(startMs)) .setEndEpochNanos(TimeUnit.MILLISECONDS.toNanos(endMs)) .setKind(Span.Kind.SERVER) - .setStatus(Status.UNKNOWN) + .setStatus(Status.ERROR) .setAttributes(attributes) .setTotalRecordedEvents(0) .setTotalRecordedLinks(0) diff --git a/exporters/otlp/src/main/java/io/opentelemetry/exporters/otlp/SpanAdapter.java b/exporters/otlp/src/main/java/io/opentelemetry/exporters/otlp/SpanAdapter.java index 23a2ac4722f..1ad318d5e8b 100644 --- a/exporters/otlp/src/main/java/io/opentelemetry/exporters/otlp/SpanAdapter.java +++ b/exporters/otlp/src/main/java/io/opentelemetry/exporters/otlp/SpanAdapter.java @@ -39,6 +39,7 @@ import io.opentelemetry.sdk.trace.data.SpanData.Link; import io.opentelemetry.trace.Span.Kind; import io.opentelemetry.trace.SpanId; +import io.opentelemetry.trace.Status.CanonicalCode; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -181,8 +182,12 @@ public void consume(AttributeKey key, T value) { } static Status toStatusProto(io.opentelemetry.trace.Status status) { - Status.Builder builder = - Status.newBuilder().setCode(StatusCode.forNumber(status.getCanonicalCode().value())); + // todo: Update this when the proto definitions are updated to include UNSET and ERROR + StatusCode protoStatusCode = StatusCode.STATUS_CODE_OK; + if (status.getCanonicalCode() == CanonicalCode.ERROR) { + protoStatusCode = StatusCode.STATUS_CODE_UNKNOWN_ERROR; + } + Status.Builder builder = Status.newBuilder().setCode(protoStatusCode); if (status.getDescription() != null) { builder.setMessage(status.getDescription()); } diff --git a/exporters/otlp/src/test/java/io/opentelemetry/exporters/otlp/SpanAdapterTest.java b/exporters/otlp/src/test/java/io/opentelemetry/exporters/otlp/SpanAdapterTest.java index 4293aa47724..f5457e8bda3 100644 --- a/exporters/otlp/src/test/java/io/opentelemetry/exporters/otlp/SpanAdapterTest.java +++ b/exporters/otlp/src/test/java/io/opentelemetry/exporters/otlp/SpanAdapterTest.java @@ -23,22 +23,7 @@ import static io.opentelemetry.proto.trace.v1.Span.SpanKind.SPAN_KIND_INTERNAL; import static io.opentelemetry.proto.trace.v1.Span.SpanKind.SPAN_KIND_PRODUCER; import static io.opentelemetry.proto.trace.v1.Span.SpanKind.SPAN_KIND_SERVER; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_ABORTED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_ALREADY_EXISTS; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_CANCELLED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_DATA_LOSS; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_DEADLINE_EXCEEDED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_FAILED_PRECONDITION; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_INTERNAL_ERROR; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_INVALID_ARGUMENT; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_NOT_FOUND; import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_OK; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_OUT_OF_RANGE; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_PERMISSION_DENIED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_RESOURCE_EXHAUSTED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_UNAUTHENTICATED; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_UNAVAILABLE; -import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_UNIMPLEMENTED; import static io.opentelemetry.proto.trace.v1.Status.StatusCode.STATUS_CODE_UNKNOWN_ERROR; import static org.assertj.core.api.Assertions.assertThat; @@ -135,118 +120,21 @@ void toProtoSpanKind() { @Test void toProtoStatus() { - assertThat(SpanAdapter.toStatusProto(io.opentelemetry.trace.Status.OK)) + assertThat(SpanAdapter.toStatusProto(io.opentelemetry.trace.Status.UNSET)) .isEqualTo(Status.newBuilder().setCode(STATUS_CODE_OK).build()); assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.CANCELLED.withDescription("CANCELLED"))) + SpanAdapter.toStatusProto(io.opentelemetry.trace.Status.ERROR.withDescription("ERROR"))) .isEqualTo( - Status.newBuilder().setCode(STATUS_CODE_CANCELLED).setMessage("CANCELLED").build()); + Status.newBuilder().setCode(STATUS_CODE_UNKNOWN_ERROR).setMessage("ERROR").build()); assertThat( SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.UNKNOWN.withDescription("UNKNOWN"))) + io.opentelemetry.trace.Status.ERROR.withDescription("UNKNOWN"))) .isEqualTo( Status.newBuilder().setCode(STATUS_CODE_UNKNOWN_ERROR).setMessage("UNKNOWN").build()); assertThat( SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.INVALID_ARGUMENT.withDescription("INVALID_ARGUMENT"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_INVALID_ARGUMENT) - .setMessage("INVALID_ARGUMENT") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.DEADLINE_EXCEEDED.withDescription( - "DEADLINE_EXCEEDED"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_DEADLINE_EXCEEDED) - .setMessage("DEADLINE_EXCEEDED") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.NOT_FOUND.withDescription("NOT_FOUND"))) - .isEqualTo( - Status.newBuilder().setCode(STATUS_CODE_NOT_FOUND).setMessage("NOT_FOUND").build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.ALREADY_EXISTS.withDescription("ALREADY_EXISTS"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_ALREADY_EXISTS) - .setMessage("ALREADY_EXISTS") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.PERMISSION_DENIED.withDescription( - "PERMISSION_DENIED"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_PERMISSION_DENIED) - .setMessage("PERMISSION_DENIED") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.RESOURCE_EXHAUSTED.withDescription( - "RESOURCE_EXHAUSTED"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_RESOURCE_EXHAUSTED) - .setMessage("RESOURCE_EXHAUSTED") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.FAILED_PRECONDITION.withDescription( - "FAILED_PRECONDITION"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_FAILED_PRECONDITION) - .setMessage("FAILED_PRECONDITION") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.ABORTED.withDescription("ABORTED"))) - .isEqualTo(Status.newBuilder().setCode(STATUS_CODE_ABORTED).setMessage("ABORTED").build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.OUT_OF_RANGE.withDescription("OUT_OF_RANGE"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_OUT_OF_RANGE) - .setMessage("OUT_OF_RANGE") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.UNIMPLEMENTED.withDescription("UNIMPLEMENTED"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_UNIMPLEMENTED) - .setMessage("UNIMPLEMENTED") - .build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.INTERNAL.withDescription("INTERNAL"))) - .isEqualTo( - Status.newBuilder().setCode(STATUS_CODE_INTERNAL_ERROR).setMessage("INTERNAL").build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.UNAVAILABLE.withDescription("UNAVAILABLE"))) - .isEqualTo( - Status.newBuilder().setCode(STATUS_CODE_UNAVAILABLE).setMessage("UNAVAILABLE").build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.DATA_LOSS.withDescription("DATA_LOSS"))) - .isEqualTo( - Status.newBuilder().setCode(STATUS_CODE_DATA_LOSS).setMessage("DATA_LOSS").build()); - assertThat( - SpanAdapter.toStatusProto( - io.opentelemetry.trace.Status.UNAUTHENTICATED.withDescription("UNAUTHENTICATED"))) - .isEqualTo( - Status.newBuilder() - .setCode(STATUS_CODE_UNAUTHENTICATED) - .setMessage("UNAUTHENTICATED") - .build()); + io.opentelemetry.trace.Status.OK.withDescription("OK_OVERRIDE"))) + .isEqualTo(Status.newBuilder().setCode(STATUS_CODE_OK).setMessage("OK_OVERRIDE").build()); } @Test diff --git a/exporters/zipkin/src/test/java/io/opentelemetry/exporters/zipkin/ZipkinSpanExporterTest.java b/exporters/zipkin/src/test/java/io/opentelemetry/exporters/zipkin/ZipkinSpanExporterTest.java index fbd19663bcc..7d69bf394f0 100644 --- a/exporters/zipkin/src/test/java/io/opentelemetry/exporters/zipkin/ZipkinSpanExporterTest.java +++ b/exporters/zipkin/src/test/java/io/opentelemetry/exporters/zipkin/ZipkinSpanExporterTest.java @@ -209,7 +209,7 @@ void generateSpan_AlreadyHasHttpStatusInfo() { buildStandardSpan() .setAttributes(attributeMap) .setKind(Kind.CLIENT) - .setStatus(Status.NOT_FOUND) + .setStatus(Status.ERROR) .build(); assertThat(ZipkinSpanExporter.generateSpan(data, localEndpoint)) @@ -230,7 +230,7 @@ void generateSpan_WithRpcErrorStatus() { SpanData data = buildStandardSpan() - .setStatus(Status.DEADLINE_EXCEEDED.withDescription(errorMessage)) + .setStatus(Status.ERROR.withDescription(errorMessage)) .setAttributes(attributeMap) .build(); @@ -240,8 +240,8 @@ void generateSpan_WithRpcErrorStatus() { .toBuilder() .putTag(ZipkinSpanExporter.OTEL_STATUS_DESCRIPTION, errorMessage) .putTag(SemanticAttributes.RPC_SERVICE.getKey(), "my service name") - .putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "DEADLINE_EXCEEDED") - .putTag(ZipkinSpanExporter.STATUS_ERROR.getKey(), "DEADLINE_EXCEEDED") + .putTag(ZipkinSpanExporter.OTEL_STATUS_CODE, "ERROR") + .putTag(ZipkinSpanExporter.STATUS_ERROR.getKey(), "ERROR") .build()); } diff --git a/extensions/trace_utils/src/main/java/io/opentelemetry/extensions/trace/CurrentSpanUtils.java b/extensions/trace_utils/src/main/java/io/opentelemetry/extensions/trace/CurrentSpanUtils.java index 2d95350fab8..d06464a1b59 100644 --- a/extensions/trace_utils/src/main/java/io/opentelemetry/extensions/trace/CurrentSpanUtils.java +++ b/extensions/trace_utils/src/main/java/io/opentelemetry/extensions/trace/CurrentSpanUtils.java @@ -121,7 +121,7 @@ public V call() throws Exception { private static void setErrorStatus(Span span, Throwable t) { span.setStatus( - Status.UNKNOWN.withDescription( + Status.ERROR.withDescription( t.getMessage() == null ? t.getClass().getSimpleName() : t.getMessage())); } } diff --git a/extensions/trace_utils/src/test/java/io/opentelemetry/extensions/trace/CurrentSpanUtilsTest.java b/extensions/trace_utils/src/test/java/io/opentelemetry/extensions/trace/CurrentSpanUtilsTest.java index aff00a9ca81..7d4973dbc62 100644 --- a/extensions/trace_utils/src/test/java/io/opentelemetry/extensions/trace/CurrentSpanUtilsTest.java +++ b/extensions/trace_utils/src/test/java/io/opentelemetry/extensions/trace/CurrentSpanUtilsTest.java @@ -100,7 +100,7 @@ void withSpanRunnable_WithError() { throw error; }; executeRunnableAndExpectError(runnable, error); - verify(span).setStatus(Status.UNKNOWN.withDescription("MyError")); + verify(span).setStatus(Status.ERROR.withDescription("MyError")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } @@ -116,7 +116,7 @@ void withSpanRunnable_WithErrorNoMessage() { throw error; }; executeRunnableAndExpectError(runnable, error); - verify(span).setStatus(Status.UNKNOWN.withDescription("AssertionError")); + verify(span).setStatus(Status.ERROR.withDescription("AssertionError")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } @@ -162,7 +162,7 @@ void withSpanCallable_WithException() { throw exception; }; executeCallableAndExpectError(callable, exception); - verify(span).setStatus(Status.UNKNOWN.withDescription("MyException")); + verify(span).setStatus(Status.ERROR.withDescription("MyException")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } @@ -178,7 +178,7 @@ void withSpanCallable_WithExceptionNoMessage() { throw exception; }; executeCallableAndExpectError(callable, exception); - verify(span).setStatus(Status.UNKNOWN.withDescription("Exception")); + verify(span).setStatus(Status.ERROR.withDescription("Exception")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } @@ -194,7 +194,7 @@ void withSpanCallable_WithError() { throw error; }; executeCallableAndExpectError(callable, error); - verify(span).setStatus(Status.UNKNOWN.withDescription("MyError")); + verify(span).setStatus(Status.ERROR.withDescription("MyError")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } @@ -210,7 +210,7 @@ void withSpanCallable_WithErrorNoMessage() { throw error; }; executeCallableAndExpectError(callable, error); - verify(span).setStatus(Status.UNKNOWN.withDescription("AssertionError")); + verify(span).setStatus(Status.ERROR.withDescription("AssertionError")); verify(span).end(); assertThat(getCurrentSpan()).isInstanceOf(DefaultSpan.class); } 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 db51e6788a1..5fc1233793b 100644 --- a/opentracing_shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java +++ b/opentracing_shim/src/main/java/io/opentelemetry/opentracingshim/SpanBuilderShim.java @@ -221,7 +221,7 @@ public Span start() { span.setAttribute(key, value); } if (error) { - span.setStatus(Status.UNKNOWN); + span.setStatus(Status.ERROR); } SpanShim spanShim = new SpanShim(telemetryInfo(), span); 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 ee3ba79f5a4..74620ec8668 100644 --- a/opentracing_shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java +++ b/opentracing_shim/src/main/java/io/opentelemetry/opentracingshim/SpanShim.java @@ -76,7 +76,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)) { - Status status = Boolean.parseBoolean(value) ? Status.UNKNOWN : Status.OK; + Status status = Boolean.parseBoolean(value) ? Status.ERROR : Status.UNSET; span.setStatus(status); } else { span.setAttribute(key, value); @@ -88,7 +88,7 @@ public Span setTag(String key, String value) { @Override public Span setTag(String key, boolean value) { if (Tags.ERROR.getKey().equals(key)) { - Status status = value ? Status.UNKNOWN : Status.OK; + Status status = value ? Status.ERROR : Status.UNSET; span.setStatus(status); } else { span.setAttribute(key, value); diff --git a/opentracing_shim/src/test/java/io/opentelemetry/opentracingshim/testbed/errorreporting/ErrorReportingTest.java b/opentracing_shim/src/test/java/io/opentelemetry/opentracingshim/testbed/errorreporting/ErrorReportingTest.java index 2a79b1ad81e..5e436d23fab 100644 --- a/opentracing_shim/src/test/java/io/opentelemetry/opentracingshim/testbed/errorreporting/ErrorReportingTest.java +++ b/opentracing_shim/src/test/java/io/opentelemetry/opentracingshim/testbed/errorreporting/ErrorReportingTest.java @@ -67,7 +67,7 @@ void testSimpleError() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertEquals(spans.size(), 1); - assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.UNKNOWN.getCanonicalCode()); + assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.ERROR.getCanonicalCode()); } /* Error handling in a callback capturing/activating the Span */ @@ -91,7 +91,7 @@ void testCallbackError() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertEquals(spans.size(), 1); - assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.UNKNOWN.getCanonicalCode()); + assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.ERROR.getCanonicalCode()); } /* Error handling for a max-retries task (such as url fetching). @@ -122,7 +122,7 @@ void testErrorRecovery() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertEquals(spans.size(), 1); - assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.UNKNOWN.getCanonicalCode()); + assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.ERROR.getCanonicalCode()); List events = spans.get(0).getEvents(); assertEquals(events.size(), maxRetries); @@ -159,7 +159,7 @@ void testInstrumentationLayer() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertEquals(spans.size(), 1); - assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.UNKNOWN.getCanonicalCode()); + assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.ERROR.getCanonicalCode()); } static class ScopedRunnable implements Runnable { diff --git a/sdk/tracing/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java b/sdk/tracing/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java index c2debc664c9..bf6ea9063bf 100644 --- a/sdk/tracing/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java +++ b/sdk/tracing/src/main/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpan.java @@ -102,7 +102,7 @@ final class RecordEventsReadableSpan implements ReadWriteSpan { // The status of the span. @GuardedBy("lock") @Nullable - private Status status; + private Status status = Status.UNSET; // The end time of the span. @GuardedBy("lock") private long endEpochNanos; @@ -511,7 +511,7 @@ public boolean isRecording() { @GuardedBy("lock") private Status getStatusWithDefault() { synchronized (lock) { - return status == null ? Status.OK : status; + return status; } } diff --git a/sdk/tracing/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java b/sdk/tracing/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java index dcefaf960f2..09acb4cd512 100644 --- a/sdk/tracing/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java +++ b/sdk/tracing/src/test/java/io/opentelemetry/sdk/trace/RecordEventsReadableSpanTest.java @@ -112,7 +112,7 @@ void nothingChangedAfterEnd() { span.end(); // Check that adding trace events or update fields after Span#end() does not throw any thrown // and are ignored. - spanDoWork(span, Status.CANCELLED); + spanDoWork(span, Status.ERROR.withDescription("CANCELLED")); SpanData spanData = span.toSpanData(); verifySpanData( spanData, @@ -122,7 +122,7 @@ void nothingChangedAfterEnd() { SPAN_NAME, START_EPOCH_NANOS, START_EPOCH_NANOS, - Status.OK, + Status.UNSET, /*hasEnded=*/ true); } @@ -182,7 +182,7 @@ void toSpanData_ActiveSpan() { SPAN_NEW_NAME, START_EPOCH_NANOS, 0, - Status.OK, + Status.UNSET, /*hasEnded=*/ false); assertThat(span.hasEnded()).isFalse(); } finally { @@ -195,7 +195,7 @@ void toSpanData_ActiveSpan() { void toSpanData_EndedSpan() { RecordEventsReadableSpan span = createTestSpan(Kind.INTERNAL); try { - spanDoWork(span, Status.CANCELLED); + spanDoWork(span, Status.ERROR.withDescription("CANCELLED")); } finally { span.end(); } @@ -211,7 +211,7 @@ void toSpanData_EndedSpan() { SPAN_NEW_NAME, START_EPOCH_NANOS, testClock.now(), - Status.CANCELLED, + Status.ERROR.withDescription("CANCELLED"), /*hasEnded=*/ true); } @@ -296,13 +296,14 @@ void setStatus() { RecordEventsReadableSpan span = createTestSpan(Kind.CONSUMER); try { testClock.advanceMillis(MILLIS_PER_SECOND); - assertThat(span.toSpanData().getStatus()).isEqualTo(Status.OK); - span.setStatus(Status.CANCELLED); - assertThat(span.toSpanData().getStatus()).isEqualTo(Status.CANCELLED); + assertThat(span.toSpanData().getStatus()).isEqualTo(Status.UNSET); + span.setStatus(Status.ERROR.withDescription("CANCELLED")); + assertThat(span.toSpanData().getStatus()) + .isEqualTo(Status.ERROR.withDescription("CANCELLED")); } finally { span.end(); } - assertThat(span.toSpanData().getStatus()).isEqualTo(Status.CANCELLED); + assertThat(span.toSpanData().getStatus()).isEqualTo(Status.ERROR.withDescription("CANCELLED")); } @Test @@ -775,7 +776,7 @@ void badArgsIgnored() { // Ignored the bad calls SpanData data = span.toSpanData(); assertThat(data.getAttributes().isEmpty()).isTrue(); - assertThat(data.getStatus()).isEqualTo(Status.OK); + assertThat(data.getStatus()).isEqualTo(Status.UNSET); assertThat(data.getName()).isEqualTo(SPAN_NAME); } @@ -951,7 +952,7 @@ void testAsSpanData() { name, startEpochNanos, endEpochNanos, - Status.OK, + Status.UNSET, /* hasEnded= */ true); assertThat(result.getTotalRecordedLinks()).isEqualTo(1); assertThat(result.isSampled()).isEqualTo(false); diff --git a/sdk_extensions/testbed/src/test/java/io/opentelemetry/sdk/extensions/trace/testbed/errorreporting/ErrorReportingTest.java b/sdk_extensions/testbed/src/test/java/io/opentelemetry/sdk/extensions/trace/testbed/errorreporting/ErrorReportingTest.java index cfd743f52a0..f37589c475d 100644 --- a/sdk_extensions/testbed/src/test/java/io/opentelemetry/sdk/extensions/trace/testbed/errorreporting/ErrorReportingTest.java +++ b/sdk_extensions/testbed/src/test/java/io/opentelemetry/sdk/extensions/trace/testbed/errorreporting/ErrorReportingTest.java @@ -53,7 +53,7 @@ void testSimpleError() { try (Scope ignored = tracer.withSpan(span)) { throw new RuntimeException("Invalid state"); } catch (Exception e) { - span.setStatus(Status.UNKNOWN); + span.setStatus(Status.ERROR); } finally { span.end(); } @@ -63,7 +63,7 @@ void testSimpleError() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertThat(spans).hasSize(1); assertThat(spans.get(0).getStatus().getCanonicalCode().value()) - .isEqualTo(Status.UNKNOWN.getCanonicalCode().value()); + .isEqualTo(Status.ERROR.getCanonicalCode().value()); } /* Error handling in a callback capturing/activating the Span */ @@ -75,7 +75,7 @@ void testCallbackError() { try (Scope ignored = tracer.withSpan(span)) { throw new RuntimeException("Invalid state"); } catch (Exception exc) { - span.setStatus(Status.UNKNOWN); + span.setStatus(Status.ERROR); } finally { span.end(); } @@ -88,7 +88,7 @@ void testCallbackError() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertThat(spans).hasSize(1); assertThat(spans.get(0).getStatus().getCanonicalCode()) - .isEqualTo(Status.UNKNOWN.getCanonicalCode()); + .isEqualTo(Status.ERROR.getCanonicalCode()); } /* Error handling for a max-retries task (such as url fetching). @@ -108,7 +108,7 @@ void testErrorRecovery() { } } - span.setStatus(Status.UNKNOWN); // Could not fetch anything. + span.setStatus(Status.ERROR); // Could not fetch anything. span.end(); assertThat(tracer.getCurrentSpan()).isSameAs(DefaultSpan.getInvalid()); @@ -116,7 +116,7 @@ void testErrorRecovery() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertThat(spans).hasSize(1); assertThat(spans.get(0).getStatus().getCanonicalCode()) - .isEqualTo(Status.UNKNOWN.getCanonicalCode()); + .isEqualTo(Status.ERROR.getCanonicalCode()); List events = spans.get(0).getEvents(); assertEquals(events.size(), maxRetries); @@ -136,7 +136,7 @@ void testInstrumentationLayer() { try { throw new RuntimeException("Invalid state"); } catch (Exception exc) { - tracer.getCurrentSpan().setStatus(Status.UNKNOWN); + tracer.getCurrentSpan().setStatus(Status.ERROR); } finally { tracer.getCurrentSpan().end(); } @@ -150,7 +150,7 @@ void testInstrumentationLayer() { List spans = inMemoryTracing.getSpanExporter().getFinishedSpanItems(); assertEquals(spans.size(), 1); - assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.UNKNOWN.getCanonicalCode()); + assertEquals(spans.get(0).getStatus().getCanonicalCode(), Status.ERROR.getCanonicalCode()); } private static class ScopedRunnable implements Runnable { diff --git a/sdk_extensions/tracing_incubator/src/test/java/io/opentelemetry/sdk/extensions/incubator/trace/data/SpanDataBuilderTest.java b/sdk_extensions/tracing_incubator/src/test/java/io/opentelemetry/sdk/extensions/incubator/trace/data/SpanDataBuilderTest.java index e613eecbee1..c9da1f15606 100644 --- a/sdk_extensions/tracing_incubator/src/test/java/io/opentelemetry/sdk/extensions/incubator/trace/data/SpanDataBuilderTest.java +++ b/sdk_extensions/tracing_incubator/src/test/java/io/opentelemetry/sdk/extensions/incubator/trace/data/SpanDataBuilderTest.java @@ -40,7 +40,7 @@ class SpanDataBuilderTest { .setStartEpochNanos(0) .setEndEpochNanos(100) .setKind(Span.Kind.SERVER) - .setStatus(Status.UNKNOWN) + .setStatus(Status.ERROR) .setAttributes( Attributes.newBuilder() .setAttribute("cat", "meow") @@ -58,10 +58,12 @@ void noOp() { @Test void modifySpanData() { - assertThat(TEST_SPAN_DATA.getStatus()).isEqualTo(Status.UNKNOWN); + assertThat(TEST_SPAN_DATA.getStatus()).isEqualTo(Status.ERROR); SpanData modified = - SpanDataBuilder.newBuilder(TEST_SPAN_DATA).setStatus(Status.ABORTED).build(); - assertThat(modified.getStatus()).isEqualTo(Status.ABORTED); + SpanDataBuilder.newBuilder(TEST_SPAN_DATA) + .setStatus(Status.ERROR.withDescription("ABORTED")) + .build(); + assertThat(modified.getStatus()).isEqualTo(Status.ERROR.withDescription("ABORTED")); } @Test @@ -73,7 +75,9 @@ void equalsHashCode() { SpanDataBuilder.newBuilder(TEST_SPAN_DATA).build(), SpanDataBuilder.newBuilder(TEST_SPAN_DATA).build()) .addEqualityGroup( - SpanDataBuilder.newBuilder(TEST_SPAN_DATA).setStatus(Status.ABORTED).build()); + SpanDataBuilder.newBuilder(TEST_SPAN_DATA) + .setStatus(Status.ERROR.withDescription("ABORTED")) + .build()); tester.testEquals(); } } diff --git a/sdk_extensions/zpages/src/jmh/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorBenchmark.java b/sdk_extensions/zpages/src/jmh/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorBenchmark.java index 6e1dae95809..120d7122dd1 100644 --- a/sdk_extensions/zpages/src/jmh/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorBenchmark.java +++ b/sdk_extensions/zpages/src/jmh/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorBenchmark.java @@ -55,7 +55,7 @@ public final void setup() { tracer.spanBuilder(runningSpan).startSpan(); tracer.spanBuilder(latencySpan).startSpan().end(); Span error = tracer.spanBuilder(errorSpan).startSpan(); - error.setStatus(Status.UNKNOWN); + error.setStatus(Status.ERROR); error.end(); } } diff --git a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorTest.java b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorTest.java index 17562e9e74a..375c2119d5e 100644 --- a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorTest.java +++ b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezDataAggregatorTest.java @@ -240,7 +240,7 @@ void getErrorSpanCounts_noCompletedSpans() { /* getErrorSpanCounts should return a an empty map */ Span span = tracer.spanBuilder(SPAN_NAME_ONE).startSpan(); Map counts = dataAggregator.getErrorSpanCounts(); - span.setStatus(Status.UNKNOWN); + span.setStatus(Status.ERROR); span.end(); assertThat(counts).isEmpty(); } @@ -248,25 +248,23 @@ void getErrorSpanCounts_noCompletedSpans() { @Test void getErrorSpanCounts_oneSpanPerErrorCode() { for (CanonicalCode errorCode : CanonicalCode.values()) { - if (!errorCode.equals(CanonicalCode.OK)) { + if (errorCode.equals(CanonicalCode.ERROR)) { Span span = tracer.spanBuilder(SPAN_NAME_ONE).startSpan(); span.setStatus(errorCode.toStatus()); span.end(); } } - /* getErrorSpanCounts should return a map with CanonicalCode.values().length - 1 spans, as every - code, expect OK, represents an error */ Map errorCounts = dataAggregator.getErrorSpanCounts(); - assertThat(errorCounts.get(SPAN_NAME_ONE)).isEqualTo(CanonicalCode.values().length - 1); + assertThat(errorCounts.get(SPAN_NAME_ONE)).isEqualTo(1); } @Test void getErrorSpanCounts_twoSpanNames() { Span span1 = tracer.spanBuilder(SPAN_NAME_ONE).startSpan(); - span1.setStatus(Status.UNKNOWN); + span1.setStatus(Status.ERROR); span1.end(); Span span2 = tracer.spanBuilder(SPAN_NAME_TWO).startSpan(); - span2.setStatus(Status.UNKNOWN); + span2.setStatus(Status.ERROR); span2.end(); /* getErrorSpanCounts should return a map with 2 different span names */ Map errorCounts = dataAggregator.getErrorSpanCounts(); @@ -287,9 +285,9 @@ void getErrorSpans_oneSpanNameWithDifferentErrors() { Span span2 = tracer.spanBuilder(SPAN_NAME_ONE).startSpan(); /* getErrorSpans should return an empty List */ assertThat(dataAggregator.getErrorSpans(SPAN_NAME_ONE)).isEmpty(); - span1.setStatus(Status.UNKNOWN); + span1.setStatus(Status.ERROR); span1.end(); - span2.setStatus(Status.ABORTED); + span2.setStatus(Status.ERROR.withDescription("ABORTED")); span2.end(); /* getErrorSpans should return a List with both spans */ List errorSpans = dataAggregator.getErrorSpans(SPAN_NAME_ONE); @@ -304,9 +302,9 @@ void getErrorSpans_twoSpanNames() { /* getErrorSpans should return an empty List for each span name */ assertThat(dataAggregator.getErrorSpans(SPAN_NAME_ONE)).isEmpty(); assertThat(dataAggregator.getErrorSpans(SPAN_NAME_TWO)).isEmpty(); - span1.setStatus(Status.UNKNOWN); + span1.setStatus(Status.ERROR); span1.end(); - span2.setStatus(Status.UNKNOWN); + span2.setStatus(Status.ERROR); span2.end(); /* getErrorSpans should return a List with only the corresponding span */ assertThat(dataAggregator.getErrorSpans(SPAN_NAME_ONE)) diff --git a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezSpanProcessorTest.java b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezSpanProcessorTest.java index e7c4040cd4e..f754b66d4b6 100644 --- a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezSpanProcessorTest.java +++ b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezSpanProcessorTest.java @@ -49,7 +49,7 @@ class TracezSpanProcessorTest { TraceFlags.getSampled(), TraceState.builder().build()); private static final SpanContext NOT_SAMPLED_SPAN_CONTEXT = SpanContext.getInvalid(); - private static final Status SPAN_STATUS = Status.UNKNOWN; + private static final Status SPAN_STATUS = Status.ERROR; private static void assertSpanCacheSizes( TracezSpanProcessor spanProcessor, int runningSpanCacheSize, int completedSpanCacheSize) { diff --git a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezZPageHandlerTest.java b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezZPageHandlerTest.java index 50f07c0cdda..8475fe90058 100644 --- a/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezZPageHandlerTest.java +++ b/sdk_extensions/zpages/src/test/java/io/opentelemetry/sdk/extensions/zpages/TracezZPageHandlerTest.java @@ -24,6 +24,7 @@ import io.opentelemetry.sdk.trace.TracerSdkProvider; import io.opentelemetry.trace.EndSpanOptions; import io.opentelemetry.trace.Span; +import io.opentelemetry.trace.Status; import io.opentelemetry.trace.Status.CanonicalCode; import io.opentelemetry.trace.Tracer; import java.io.ByteArrayOutputStream; @@ -76,7 +77,7 @@ void summaryTable_emitRowForEachSpan() { latencySpan.end(endOptions); Span errorSpan = tracer.spanBuilder(ERROR_SPAN).startSpan(); - errorSpan.setStatus(CanonicalCode.INVALID_ARGUMENT.toStatus()); + errorSpan.setStatus(CanonicalCode.ERROR.toStatus()); errorSpan.end(); TracezZPageHandler tracezZPageHandler = new TracezZPageHandler(dataAggregator); @@ -255,9 +256,9 @@ void summaryTable_linkForErrorSpans() { Span errorSpan2 = tracer.spanBuilder(ERROR_SPAN).startSpan(); Span errorSpan3 = tracer.spanBuilder(ERROR_SPAN).startSpan(); Span finishedSpan = tracer.spanBuilder(FINISHED_SPAN_ONE).startSpan(); - errorSpan1.setStatus(CanonicalCode.CANCELLED.toStatus()); - errorSpan2.setStatus(CanonicalCode.ABORTED.toStatus()); - errorSpan3.setStatus(CanonicalCode.DEADLINE_EXCEEDED.toStatus()); + errorSpan1.setStatus(Status.ERROR.withDescription("CANCELLED")); + errorSpan2.setStatus(Status.ERROR.withDescription("ABORTED")); + errorSpan3.setStatus(Status.ERROR.withDescription("DEADLINE_EXCEEDED")); errorSpan1.end(); errorSpan2.end(); errorSpan3.end(); @@ -287,10 +288,8 @@ void spanDetails_emitRunningSpanDetailsCorrectly() { assertThat(output.toString()).contains("

Span Details

"); assertThat(output.toString()).contains(" Span Name: " + RUNNING_SPAN + ""); assertThat(output.toString()).contains(" Number of running: 1"); - assertThat(output.toString()) - .contains(runningSpan.getContext().getTraceIdAsHexString().toString()); - assertThat(output.toString()) - .contains(runningSpan.getContext().getSpanIdAsHexString().toString()); + assertThat(output.toString()).contains(runningSpan.getContext().getTraceIdAsHexString()); + assertThat(output.toString()).contains(runningSpan.getContext().getSpanIdAsHexString()); runningSpan.end(); } @@ -313,14 +312,10 @@ void spanDetails_emitLatencySpanDetailsCorrectly() { assertThat(output.toString()).contains("

Span Details

"); assertThat(output.toString()).contains(" Span Name: " + LATENCY_SPAN + ""); assertThat(output.toString()).contains(" Number of latency samples: 2"); - assertThat(output.toString()) - .contains(latencySpan1.getContext().getTraceIdAsHexString().toString()); - assertThat(output.toString()) - .contains(latencySpan1.getContext().getSpanIdAsHexString().toString()); - assertThat(output.toString()) - .contains(latencySpan2.getContext().getTraceIdAsHexString().toString()); - assertThat(output.toString()) - .contains(latencySpan2.getContext().getSpanIdAsHexString().toString()); + assertThat(output.toString()).contains(latencySpan1.getContext().getTraceIdAsHexString()); + assertThat(output.toString()).contains(latencySpan1.getContext().getSpanIdAsHexString()); + assertThat(output.toString()).contains(latencySpan2.getContext().getTraceIdAsHexString()); + assertThat(output.toString()).contains(latencySpan2.getContext().getSpanIdAsHexString()); } @Test @@ -328,8 +323,8 @@ void spanDetails_emitErrorSpanDetailsCorrectly() { OutputStream output = new ByteArrayOutputStream(); Span errorSpan1 = tracer.spanBuilder(ERROR_SPAN).startSpan(); Span errorSpan2 = tracer.spanBuilder(ERROR_SPAN).startSpan(); - errorSpan1.setStatus(CanonicalCode.CANCELLED.toStatus()); - errorSpan2.setStatus(CanonicalCode.ABORTED.toStatus()); + errorSpan1.setStatus(Status.ERROR.withDescription("CANCELLED")); + errorSpan2.setStatus(Status.ERROR.withDescription("ABORTED")); errorSpan1.end(); errorSpan2.end(); Map queryMap = @@ -341,14 +336,10 @@ void spanDetails_emitErrorSpanDetailsCorrectly() { assertThat(output.toString()).contains("

Span Details

"); assertThat(output.toString()).contains(" Span Name: " + ERROR_SPAN + ""); assertThat(output.toString()).contains(" Number of error samples: 2"); - assertThat(output.toString()) - .contains(errorSpan1.getContext().getTraceIdAsHexString().toString()); - assertThat(output.toString()) - .contains(errorSpan1.getContext().getSpanIdAsHexString().toString()); - assertThat(output.toString()) - .contains(errorSpan2.getContext().getTraceIdAsHexString().toString()); - assertThat(output.toString()) - .contains(errorSpan2.getContext().getSpanIdAsHexString().toString()); + assertThat(output.toString()).contains(errorSpan1.getContext().getTraceIdAsHexString()); + assertThat(output.toString()).contains(errorSpan1.getContext().getSpanIdAsHexString()); + assertThat(output.toString()).contains(errorSpan2.getContext().getTraceIdAsHexString()); + assertThat(output.toString()).contains(errorSpan2.getContext().getSpanIdAsHexString()); } @Test