@Override public byte[] toByteArray(SpanContext spanContext) { checkNotNull(spanContext, "spanContext"); byte[] bytes = new byte[ALL_FORMAT_LENGTH]; bytes[VERSION_ID_OFFSET] = VERSION_ID; bytes[TRACE_ID_FIELD_ID_OFFSET] = TRACE_ID_FIELD_ID; spanContext.getTraceId().copyBytesTo(bytes, TRACE_ID_OFFSET); bytes[SPAN_ID_FIELD_ID_OFFSET] = SPAN_ID_FIELD_ID; spanContext.getSpanId().copyBytesTo(bytes, SPAN_ID_OFFSET); bytes[TRACE_OPTION_FIELD_ID_OFFSET] = TRACE_OPTION_FIELD_ID; spanContext.getTraceOptions().copyBytesTo(bytes, TRACE_OPTIONS_OFFSET); return bytes; }
@Test public void censusHttpExecuteInterceptorShouldInjectHeader() throws IOException { Random random = new Random(); SpanContext spanContext = SpanContext.create( TraceId.generateRandomId(random), SpanId.generateRandomId(random), TraceOptions.DEFAULT); Span mockSpan = createMockBuilder(Span.class) .withConstructor(SpanContext.class, EnumSet.class) .withArgs(spanContext, null) .createMock(); Scope scope = tracer.withSpan(mockSpan); try { HttpExecuteInterceptor interceptor = censusHttpModule.new CensusHttpExecuteInterceptor(null); interceptor.intercept(httpRequest); assertThat(httpRequest.getHeaders().get("X-Cloud-Trace-Context")).isNotNull(); } finally { scope.close(); } }
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); }
/** * Returns a new {@code Link}. * * @param context the context of the linked {@code Span}. * @param type the type of the relationship with the linked {@code Span}. * @return a new {@code Link}. * @since 0.5 */ public static Link fromSpanContext(SpanContext context, Type type) { return new AutoValue_Link(context.getTraceId(), context.getSpanId(), type, EMPTY_ATTRIBUTES); }
chars[1] = VERSION.charAt(1); chars[2] = TRACEPARENT_DELIMITER; spanContext.getTraceId().copyLowerBase16To(chars, TRACE_ID_OFFSET); chars[SPAN_ID_OFFSET - 1] = TRACEPARENT_DELIMITER; spanContext.getSpanId().copyLowerBase16To(chars, SPAN_ID_OFFSET); chars[TRACE_OPTION_OFFSET - 1] = TRACEPARENT_DELIMITER; spanContext.getTraceOptions().copyLowerBase16To(chars, TRACE_OPTION_OFFSET); setter.put(carrier, TRACEPARENT, new String(chars)); List<Tracestate.Entry> entries = spanContext.getTracestate().getEntries(); if (entries.isEmpty()) {
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()); } }
if (parentContext == null || !parentContext.isValid()) { } else { traceId = parentContext.getTraceId(); parentSpanId = parentContext.getSpanId(); tracestate = parentContext.getTracestate(); SpanContext.create(traceId, spanId, traceOptions, tracestate), name, kind, } else { return NoRecordEventsSpanImpl.create( SpanContext.create(traceId, spanId, traceOptions, tracestate));
@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(); }
TraceId traceId = spanContext.getTraceId(); SpanId spanId = spanContext.getSpanId(); Span.Builder spanBuilder = Span.newBuilder() .setTraceId(toByteString(traceId.getBytes())) .setSpanId(toByteString(spanId.getBytes())) .setTracestate(toTracestateProto(spanContext.getTracestate())) .setName(toTruncatableStringProto(spanData.getName())) .setStartTime(toTimestampProto(spanData.getStartTimestamp()))
private static boolean isAnyParentLinkSampled(List<Span> parentLinks) { for (Span parentLink : parentLinks) { if (parentLink.getContext().getTraceOptions().isSampled()) { return true; } } return false; }
@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(); }
/** Emits the list of SampledRequets with a header. */ private static void emitSpans(PrintWriter out, Formatter formatter, Collection<SpanData> spans) { out.write("<pre>\n"); formatter.format("%-23s %18s%n", "When", "Elapsed(s)"); out.write("-------------------------------------------\n"); for (SpanData span : spans) { tracer .getCurrentSpan() .addAnnotation( "Render span.", ImmutableMap.<String, AttributeValue>builder() .put( "SpanId", AttributeValue.stringAttributeValue( BaseEncoding.base16() .lowerCase() .encode(span.getContext().getSpanId().getBytes()))) .build()); emitSingleSpan(formatter, span); } out.write("</pre>\n"); }
@Test public void getTraceId() { assertThat(first.getTraceId()).isEqualTo(TraceId.fromBytes(firstTraceIdBytes)); assertThat(second.getTraceId()).isEqualTo(TraceId.fromBytes(secondTraceIdBytes)); }
@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 getTracestate() { assertThat(first.getTracestate()).isEqualTo(firstTracestate); assertThat(second.getTracestate()).isEqualTo(secondTracestate); }
/** * Returns a new {@code Link}. * * @param context the context of the linked {@code Span}. * @param type the type of the relationship with the linked {@code Span}. * @return a new {@code Link}. */ public static Link fromSpanContext(SpanContext context, Type type) { return new AutoValue_Link(context.getTraceId(), context.getSpanId(), type, EMPTY_ATTRIBUTES); }
@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(); }
if (parentContext == null || !parentContext.isValid()) { } else { traceId = parentContext.getTraceId(); parentSpanId = parentContext.getSpanId(); tracestate = parentContext.getTracestate(); SpanContext.create(traceId, spanId, traceOptions, tracestate), name, kind, } else { return NoRecordEventsSpanImpl.create( SpanContext.create(traceId, spanId, traceOptions, tracestate));
@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(); }
chars[1] = VERSION.charAt(1); chars[2] = TRACEPARENT_DELIMITER; spanContext.getTraceId().copyLowerBase16To(chars, TRACE_ID_OFFSET); chars[SPAN_ID_OFFSET - 1] = TRACEPARENT_DELIMITER; spanContext.getSpanId().copyLowerBase16To(chars, SPAN_ID_OFFSET); chars[TRACE_OPTION_OFFSET - 1] = TRACEPARENT_DELIMITER; spanContext.getTraceOptions().copyLowerBase16To(chars, TRACE_OPTION_OFFSET); setter.put(carrier, TRACEPARENT, new String(chars)); List<Tracestate.Entry> entries = spanContext.getTracestate().getEntries(); if (entries.isEmpty()) {