private JaegerSpanContext preferredReference() { Reference preferredReference = references.get(0); for (Reference reference: references) { // childOf takes precedence as a preferred parent if (References.CHILD_OF.equals(reference.getType()) && !References.CHILD_OF.equals(preferredReference.getType())) { preferredReference = reference; break; } } return preferredReference.getSpanContext(); }
@Override public JaegerTracer.SpanBuilder addReference(String referenceType, SpanContext reference) { if (reference == null) { return this; } if (!(reference instanceof JaegerSpanContext)) { log.warn("Expected to have a JaegerSpanContext but got " + reference.getClass().getName()); return this; } JaegerSpanContext referencedContext = (JaegerSpanContext) reference; // Jaeger thrift currently does not support other reference types if (!References.CHILD_OF.equals(referenceType) && !References.FOLLOWS_FROM.equals(referenceType)) { return this; } if (references.isEmpty()) { // Optimization for 99% situations, when there is only one parent references = Collections.singletonList(new Reference(referencedContext, referenceType)); } else { if (references.size() == 1) { references = new ArrayList<Reference>(references); } references.add(new Reference(referencedContext, referenceType)); } return this; }
private boolean isSampled() { if (references != null) { for (Reference reference : references) { if (reference.getSpanContext().isSampled()) { return true; } } } return false; }
public static io.jaegertracing.thriftjava.Span convertSpan(JaegerSpan jaegerSpan) { JaegerSpanContext context = jaegerSpan.context(); boolean oneChildOfParent = jaegerSpan.getReferences().size() == 1 && References.CHILD_OF.equals(jaegerSpan.getReferences().get(0).getType()); List<SpanRef> references = oneChildOfParent ? Collections.<SpanRef>emptyList() : buildReferences(jaegerSpan.getReferences()); return new io.jaegertracing.thriftjava.Span( context.getTraceIdLow(), context.getTraceIdHigh(), context.getSpanId(), oneChildOfParent ? context.getParentId() : 0, jaegerSpan.getOperationName(), context.getFlags(), jaegerSpan.getStart(), jaegerSpan.getDuration() ) .setReferences(references) .setTags(buildTags(jaegerSpan.getTags())) .setLogs(buildLogs(jaegerSpan.getLogs())); }
private String getDebugId() { if (references.isEmpty()) { return null; } return references.get(0).getSpanContext().getDebugId(); }
static List<SpanRef> buildReferences(List<Reference> references) { List<SpanRef> thriftReferences = new ArrayList<SpanRef>(references.size()); for (Reference reference: references) { SpanRefType thriftRefType = References.CHILD_OF.equals(reference.getType()) ? SpanRefType.CHILD_OF : SpanRefType.FOLLOWS_FROM; thriftReferences.add(new SpanRef(thriftRefType, reference.getSpanContext().getTraceIdLow(), reference.getSpanContext().getTraceIdHigh(), reference.getSpanContext().getSpanId())); } return thriftReferences; }
private Map<String, String> getBaggage() { Map<String, String> baggage = null; // optimization for 99% use cases, when there is only one parent if (references.size() == 1) { return references.get(0).getSpanContext().baggage(); } for (Reference reference: references) { if (reference.getSpanContext().baggage() != null) { if (baggage == null) { baggage = new HashMap<String, String>(); } baggage.putAll(reference.getSpanContext().baggage()); } } return baggage; }
@Test public void testThatNewInnerSpanIsCreatedUsingAsyncInvocation() { final JaegerSpanContext spanId = fromRandom(); final Response r = withTrace(createWebClient("/bookstore/books/async"), spanId).get(); assertEquals(Status.OK.getStatusCode(), r.getStatus()); assertThat(TestSender.getAllSpans().size(), equalTo(2)); assertThat(TestSender.getAllSpans().get(0).getOperationName(), equalTo("Processing books")); assertThat(TestSender.getAllSpans().get(1).getOperationName(), equalTo("GET /bookstore/books/async")); assertThat(TestSender.getAllSpans().get(1).getReferences(), not(empty())); assertThat(TestSender.getAllSpans().get(1).getReferences().get(0).getSpanContext().getSpanId(), equalTo(spanId.getSpanId())); }
if (references.isEmpty() || !references.get(0).getSpanContext().hasTrace()) { context = createNewContext(); } else {