static void endSpanWithFailure(Span span, Exception e) { if (e instanceof SpannerException) { endSpanWithFailure(span, (SpannerException) e); } else { span.setStatus(Status.INTERNAL.withDescription(e.getMessage())); span.end(); } }
/** * Returns a {@link io.grpc.Status} from a {@link io.opencensus.trace.Status}. * * @param opencensusStatus the given {@code io.opencensus.trace.Status}. * @return a {@code io.grpc.Status} from a {@code io.opencensus.trace.Status}. * @since 0.6 */ public static io.grpc.Status toGrpcStatus(io.opencensus.trace.Status opencensusStatus) { io.grpc.Status status = grpcStatusFromOpencensusCanonicalCode(opencensusStatus.getCanonicalCode()); if (opencensusStatus.getDescription() != null) { status = status.withDescription(opencensusStatus.getDescription()); } return status; }
@Test public void createStatus_WithDescription() { Status status = Status.UNKNOWN.withDescription("This is an error."); assertThat(status.getCanonicalCode()).isEqualTo(Status.CanonicalCode.UNKNOWN); assertThat(status.getDescription()).isEqualTo("This is an error."); assertThat(status.isOk()).isFalse(); }
@Test public void convertToGrpcStatus() { // Without description for (io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode : io.opencensus.trace.Status.CanonicalCode.values()) { io.opencensus.trace.Status opencensusStatus = opencensusCanonicalCode.toStatus(); io.grpc.Status grpcStatus = StatusConverter.toGrpcStatus(opencensusStatus); assertThat(grpcStatus.getCode().toString()) .isEqualTo(opencensusStatus.getCanonicalCode().toString()); assertThat(grpcStatus.getDescription()).isNull(); } // With description for (io.opencensus.trace.Status.CanonicalCode opencensusCanonicalCode : io.opencensus.trace.Status.CanonicalCode.values()) { io.opencensus.trace.Status opencensusStatus = opencensusCanonicalCode.toStatus().withDescription("This is my description"); io.grpc.Status grpcStatus = StatusConverter.toGrpcStatus(opencensusStatus); assertThat(grpcStatus.getCode().toString()) .isEqualTo(opencensusStatus.getCanonicalCode().toString()); assertThat(grpcStatus.getDescription()).isEqualTo(opencensusStatus.getDescription()); } } }
@Test public void status_Ok() { assertThat(Status.OK.getCanonicalCode()).isEqualTo(Status.CanonicalCode.OK); assertThat(Status.OK.getDescription()).isNull(); assertThat(Status.OK.isOk()).isTrue(); }
/** * Returns a {@link io.opencensus.trace.Status.CanonicalCode} from a {@link io.grpc.Status.Code}. * * @param grpcCode the given {@code io.grpc.Status.Code}. * @return a {@code io.opencensus.trace.Status.CanonicalCode} from a {@code io.grpc.Status.Code}. * @since 0.6 */ public static io.opencensus.trace.Status.CanonicalCode fromGrpcCode( io.grpc.Status.Code grpcCode) { return opencensusStatusFromGrpcCode(grpcCode).getCanonicalCode(); }
private void considerForSampling(RecordEventsSpanImpl span) { Status status = span.getStatus(); // Null status means running Span, this should not happen in production, but the library // should not crash because of this. if (status != null) { Bucket bucket = status.isOk() ? getLatencyBucket(span.getLatencyNs()) : getErrorBucket(status.getCanonicalCode()); // If unable to find the bucket, ignore this Span. if (bucket != null) { bucket.considerForSampling(span); } } }
private static List<Status> buildStatusList() { TreeMap<Integer, Status> canonicalizer = new TreeMap<Integer, Status>(); for (CanonicalCode code : CanonicalCode.values()) { Status replaced = canonicalizer.put(code.value(), new Status(code, null)); if (replaced != null) { throw new IllegalStateException( "Code value duplication between " + replaced.getCanonicalCode().name() + " & " + code.name()); } } return Collections.unmodifiableList(new ArrayList<Status>(canonicalizer.values())); }
@Test public void parseResponseStatusErrorWithMessage() { Throwable error = new Exception("testError"); assertThat(HttpTraceUtil.parseResponseStatus(0, error).getDescription()).isEqualTo("testError"); }
sb.append("\"name\":\"").append(toSpanName(span)).append("\","); sb.append("\"type\":\"").append(toSpanType(span)).append('"'); if (!status.isOk()) { sb.append(",\"error\":").append("true");
/** * Returns a {@link io.grpc.Status} from a {@link io.opencensus.trace.Status}. * * @param opencensusStatus the given {@code io.opencensus.trace.Status}. * @return a {@code io.grpc.Status} from a {@code io.opencensus.trace.Status}. * @since 0.6 */ public static io.grpc.Status toGrpcStatus(io.opencensus.trace.Status opencensusStatus) { io.grpc.Status status = grpcStatusFromOpencensusCanonicalCode(opencensusStatus.getCanonicalCode()); if (opencensusStatus.getDescription() != null) { status = status.withDescription(opencensusStatus.getDescription()); } return status; }
/** * Returns a {@link io.opencensus.trace.Status.CanonicalCode} from a {@link io.grpc.Status.Code}. * * @param grpcCode the given {@code io.grpc.Status.Code}. * @return a {@code io.opencensus.trace.Status.CanonicalCode} from a {@code io.grpc.Status.Code}. * @since 0.6 */ public static io.opencensus.trace.Status.CanonicalCode fromGrpcCode( io.grpc.Status.Code grpcCode) { return opencensusStatusFromGrpcCode(grpcCode).getCanonicalCode(); }
private void considerForSampling(RecordEventsSpanImpl span) { Status status = span.getStatus(); // Null status means running Span, this should not happen in production, but the library // should not crash because of this. if (status != null) { Bucket bucket = status.isOk() ? getLatencyBucket(span.getLatencyNs()) : getErrorBucket(status.getCanonicalCode()); // If unable to find the bucket, ignore this Span. if (bucket != null) { bucket.considerForSampling(span); } } }
private static List<Status> buildStatusList() { TreeMap<Integer, Status> canonicalizer = new TreeMap<Integer, Status>(); for (CanonicalCode code : CanonicalCode.values()) { Status replaced = canonicalizer.put(code.value(), new Status(code, null)); if (replaced != null) { throw new IllegalStateException( "Code value duplication between " + replaced.getCanonicalCode().name() + " & " + code.name()); } } return Collections.unmodifiableList(new ArrayList<Status>(canonicalizer.values())); }
@Test public void parseResponseStatusErrorWithoutMessage() { Throwable error = new NullPointerException(); assertThat(HttpTraceUtil.parseResponseStatus(0, error).getDescription()) .isEqualTo("NullPointerException"); }
static void endSpanWithFailure(Span span, SpannerException e) { span.setStatus( StatusConverter.fromGrpcStatus(e.getErrorCode().getGrpcStatus()) .withDescription(e.getMessage())); span.end(); }
private static Status toStatusProto(io.opencensus.trace.Status status) { Status.Builder statusBuilder = Status.newBuilder().setCode(status.getCanonicalCode().value()); if (status.getDescription() != null) { statusBuilder.setMessage(status.getDescription()); } return statusBuilder.build(); }
private void populateError(Map<String, AttributeValue> attributes, Throwable error) { if (error == null) { attributes.put("status", null); return; } Status status = convertErrorToStatus(error); attributes.put( "status", AttributeValue.stringAttributeValue(status.getCanonicalCode().toString())); }
public static Status statusFromApiException(ApiException exception) { if (exception.getStatusCode().getTransportCode() instanceof io.grpc.Status) { io.grpc.Status grpcStatus = (io.grpc.Status) exception.getStatusCode().getTransportCode(); return StatusConverter.fromGrpcStatus(grpcStatus); } return Status.UNKNOWN.withDescription(exception.getMessage()); } }
private static Status toStatusProto(io.opencensus.trace.Status status) { Status.Builder statusBuilder = Status.newBuilder().setCode(status.getCanonicalCode().value()); if (status.getDescription() != null) { statusBuilder.setMessage(status.getDescription()); } return statusBuilder.build(); }