diff options
3 files changed, 26 insertions, 11 deletions
diff --git a/api/src/main/java/io/opencensus/trace/samplers/ProbabilitySampler.java b/api/src/main/java/io/opencensus/trace/samplers/ProbabilitySampler.java index d6247344..21d4d6ca 100644 --- a/api/src/main/java/io/opencensus/trace/samplers/ProbabilitySampler.java +++ b/api/src/main/java/io/opencensus/trace/samplers/ProbabilitySampler.java @@ -83,10 +83,12 @@ abstract class ProbabilitySampler extends Sampler { if (parentContext != null && parentContext.getTraceOptions().isSampled()) { return true; } - // If any parent link is sampled keep the sampling decision. - for (Span parentLink : parentLinks) { - if (parentLink.getContext().getTraceOptions().isSampled()) { - return true; + if (parentLinks != null) { + // If any parent link is sampled keep the sampling decision. + for (Span parentLink : parentLinks) { + if (parentLink.getContext().getTraceOptions().isSampled()) { + return true; + } } } // Always sample if we are within probability range. This is true even for child spans (that diff --git a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java index 7c15ec9f..d3ade520 100644 --- a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java +++ b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverV2ExporterHandler.java @@ -114,9 +114,15 @@ final class StackdriverV2ExporterHandler extends SpanExporter.Handler { .setStartTime(toTimestampProto(spanData.getStartTimestamp())) .setAttributes(toAttributesProto(spanData.getAttributes())) .setTimeEvents( - toTimeEventsProto(spanData.getAnnotations(), spanData.getNetworkEvents())) - .setStatus(toStatusProto(spanData.getStatus())) - .setEndTime(toTimestampProto(spanData.getEndTimestamp())); + toTimeEventsProto(spanData.getAnnotations(), spanData.getNetworkEvents())); + io.opencensus.trace.Status status = spanData.getStatus(); + if (status != null) { + spanBuilder.setStatus(toStatusProto(status)); + } + Timestamp end = spanData.getEndTimestamp(); + if (end != null) { + spanBuilder.setEndTime(toTimestampProto(end)); + } if (spanData.getParentSpanId() != null && spanData.getParentSpanId().isValid()) { spanBuilder.setParentSpanId(encodeSpanId(spanData.getParentSpanId())); diff --git a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java index 00a8c9ee..5f33c1ab 100644 --- a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java +++ b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporterHandler.java @@ -128,9 +128,12 @@ final class ZipkinExporterHandler extends SpanExporter.Handler { spanData.getAttributes().getAttributeMap().entrySet()) { spanBuilder.putTag(label.getKey(), attributeValueToString(label.getValue())); } - spanBuilder.putTag(STATUS_CODE, spanData.getStatus().getCanonicalCode().toString()); - if (spanData.getStatus().getDescription() != null) { - spanBuilder.putTag(STATUS_DESCRIPTION, spanData.getStatus().getDescription()); + Status status = spanData.getStatus(); + if (status != null) { + spanBuilder.putTag(STATUS_CODE, status.getCanonicalCode().toString()); + if (status.getDescription() != null) { + spanBuilder.putTag(STATUS_DESCRIPTION, status.getDescription()); + } } for (TimedEvent<Annotation> annotation : spanData.getAnnotations().getEvents()) { @@ -196,7 +199,11 @@ final class ZipkinExporterHandler extends SpanExporter.Handler { try { sender.sendSpans(encodedSpans).execute(); } catch (IOException e) { - tracer.getCurrentSpan().setStatus(Status.UNKNOWN.withDescription(e.getMessage())); + tracer + .getCurrentSpan() + .setStatus( + Status.UNKNOWN.withDescription( + e.getMessage() == null ? e.getClass().getSimpleName() : e.getMessage())); throw new RuntimeException(e); // TODO: should we instead do drop metrics? } } finally { |
