private static boolean makeSamplingDecision( @Nullable SpanContext parent, @Nullable Boolean hasRemoteParent, String name, @Nullable Sampler sampler, List<Span> parentLinks, TraceId traceId, SpanId spanId, TraceParams activeTraceParams) { // If users set a specific sampler in the SpanBuilder, use it. if (sampler != null) { return sampler.shouldSample(parent, hasRemoteParent, traceId, spanId, name, parentLinks); } // Use the default sampler if this is a root Span or this is an entry point Span (has remote // parent). if (Boolean.TRUE.equals(hasRemoteParent) || parent == null || !parent.isValid()) { return activeTraceParams .getSampler() .shouldSample(parent, hasRemoteParent, traceId, spanId, name, parentLinks); } // Parent is always different than null because otherwise we use the default sampler. return parent.getTraceOptions().isSampled() || isAnyParentLinkSampled(parentLinks); }
@Test public void isValid() { assertThat(SpanContext.INVALID.isValid()).isFalse(); assertThat( SpanContext.create( TraceId.fromBytes(firstTraceIdBytes), SpanId.INVALID, TraceOptions.DEFAULT) .isValid()) .isFalse(); assertThat( SpanContext.create( TraceId.INVALID, SpanId.fromBytes(firstSpanIdBytes), TraceOptions.DEFAULT) .isValid()) .isFalse(); assertThat(first.isValid()).isTrue(); assertThat(second.isValid()).isTrue(); }
@Test public void fromBinaryValue_UnsupportedFieldIdThird_skipped() throws SpanContextParseException { assertThat( binaryFormat .fromByteArray( new byte[] { 0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1, 97, 98, 99, 100, 101, 102, 103, 104, 0, 1 }) .isValid()) .isTrue(); }
@Test public void fromBinaryValue_MissingTraceOptionsOk() throws SpanContextParseException { SpanContext extracted = binaryFormat.fromByteArray( new byte[] { 0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1, 97, 98, 99, 100, 101, 102, 103, 104 }); assertThat(extracted.isValid()).isTrue(); assertThat(extracted.getTraceOptions()).isEqualTo(TraceOptions.DEFAULT); } }
@After @Before public void verifyNotTracing() { assertThat(OpenCensusSleuthSpanContextHolder.isTracing()).isFalse(); assertThat(tracer.getCurrentSpan().getContext().isValid()).isFalse(); }
private static final void assertSpanEquals(io.opencensus.trace.Span span, Span sleuthSpan) { assertThat(span.getContext().isValid()).isTrue(); assertThat(Long.parseLong(span.getContext().getTraceId().toLowerBase16().substring(0, 16), 16)) .isEqualTo(sleuthSpan.getTraceIdHigh()); assertThat(Long.parseLong(span.getContext().getTraceId().toLowerBase16().substring(16, 32), 16)) .isEqualTo(sleuthSpan.getTraceId()); assertThat(Long.parseLong(span.getContext().getSpanId().toLowerBase16(), 16)) .isEqualTo(sleuthSpan.getSpanId()); assertThat(span.getContext().getTraceOptions().isSampled()) .isEqualTo(sleuthSpan.isExportable()); } }
@Test public void startRootSpan_WithoutSpecifiedSampler() { // Apply default sampler (always true in the tests) for root spans. Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions).startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isTrue(); }
@Test public void startSpanNullParentNoRecordOptions() { Span span = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isFalse(); assertThat(span.getContext().getTraceOptions().isSampled()).isFalse(); }
@Test public void startRemoteSpanInvalidParent() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithRemoteParent( SPAN_NAME, SpanContext.INVALID, spanBuilderOptions) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); }
@Test public void startRemoteSpan_NullParent() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, null, spanBuilderOptions) .setRecordEvents(true) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); }
@Test public void startRootSpan_WithSpecifiedSampler() { // Apply given sampler before default sampler for root spans. Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isFalse(); }
@Test public void startSpanNullParent() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setRecordEvents(true) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); assertThat(spanData.getStartTimestamp()).isEqualTo(testClock.now()); assertThat(spanData.getName()).isEqualTo(SPAN_NAME); }
@Test public void startSpanNullParentWithRecordEvents() { RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .setRecordEvents(true) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(span.getContext().getTraceOptions().isSampled()).isFalse(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isNull(); assertThat(spanData.getHasRemoteParent()).isNull(); }
@Test public void startChildSpan_WithoutSpecifiedSampler() { Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isFalse(); // Don't apply the default sampler (always true) for child spans. Span childSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, rootSpan, spanBuilderOptions).startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); assertThat(childSpan.getContext().getTraceOptions().isSampled()).isFalse(); }
@Test public void startChildSpan() { Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions).startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getOptions().contains(Options.RECORD_EVENTS)).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isTrue(); assertThat(((RecordEventsSpanImpl) rootSpan).toSpanData().getHasRemoteParent()).isNull(); Span childSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, rootSpan, spanBuilderOptions).startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); assertThat(((RecordEventsSpanImpl) childSpan).toSpanData().getParentSpanId()) .isEqualTo(rootSpan.getContext().getSpanId()); assertThat(((RecordEventsSpanImpl) childSpan).toSpanData().getHasRemoteParent()).isFalse(); assertThat(((RecordEventsSpanImpl) childSpan).getTimestampConverter()) .isEqualTo(((RecordEventsSpanImpl) rootSpan).getTimestampConverter()); }
@Test public void startRemoteChildSpan_WithoutSpecifiedSampler() { Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isFalse(); // Apply default sampler (always true in the tests) for spans with remote parent. Span childSpan = SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, rootSpan.getContext(), spanBuilderOptions) .startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); assertThat(childSpan.getContext().getTraceOptions().isSampled()).isTrue(); }
@Test public void startChildSpan_WithSpecifiedSampler() { Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.alwaysSample()) .startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isTrue(); // Apply the given sampler for child spans. Span childSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, rootSpan, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); assertThat(childSpan.getContext().getTraceOptions().isSampled()).isFalse(); }
@Test public void startRemoteChildSpan_WithSpecifiedSampler() { Span rootSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.alwaysSample()) .startSpan(); assertThat(rootSpan.getContext().isValid()).isTrue(); assertThat(rootSpan.getContext().getTraceOptions().isSampled()).isTrue(); // Apply given sampler before default sampler for spans with remote parent. Span childSpan = SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, rootSpan.getContext(), spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()).isEqualTo(rootSpan.getContext().getTraceId()); assertThat(childSpan.getContext().getTraceOptions().isSampled()).isFalse(); }
@Test public void startRemoteSpan() { SpanContext spanContext = SpanContext.create( TraceId.generateRandomId(randomHandler.current()), SpanId.generateRandomId(randomHandler.current()), TraceOptions.DEFAULT); RecordEventsSpanImpl span = (RecordEventsSpanImpl) SpanBuilderImpl.createWithRemoteParent(SPAN_NAME, spanContext, spanBuilderOptions) .setRecordEvents(true) .startSpan(); assertThat(span.getContext().isValid()).isTrue(); assertThat(span.getContext().getTraceId()).isEqualTo(spanContext.getTraceId()); assertThat(span.getContext().getTraceOptions().isSampled()).isTrue(); SpanData spanData = span.toSpanData(); assertThat(spanData.getParentSpanId()).isEqualTo(spanContext.getSpanId()); assertThat(spanData.getHasRemoteParent()).isTrue(); }
@Test public void startChildSpan_SampledLinkedParent() { Span rootSpanUnsampled = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.neverSample()) .startSpan(); assertThat(rootSpanUnsampled.getContext().getTraceOptions().isSampled()).isFalse(); Span rootSpanSampled = SpanBuilderImpl.createWithParent(SPAN_NAME, null, spanBuilderOptions) .setSampler(Samplers.alwaysSample()) .startSpan(); assertThat(rootSpanSampled.getContext().getTraceOptions().isSampled()).isTrue(); // Sampled because the linked parent is sampled. Span childSpan = SpanBuilderImpl.createWithParent(SPAN_NAME, rootSpanUnsampled, spanBuilderOptions) .setParentLinks(Collections.singletonList(rootSpanSampled)) .startSpan(); assertThat(childSpan.getContext().isValid()).isTrue(); assertThat(childSpan.getContext().getTraceId()) .isEqualTo(rootSpanUnsampled.getContext().getTraceId()); assertThat(childSpan.getContext().getTraceOptions().isSampled()).isTrue(); }