@Override public boolean isRoot(Span span) { // TODO replace with Span#unwrap once https://github.com/opentracing/opentracing-java/pull/211 is merged if (span instanceof SpanWrapper) { span = ((SpanWrapper) span).getDelegate(); } if (span instanceof io.jaegertracing.internal.JaegerSpan) { final io.jaegertracing.internal.JaegerSpan jaegerSpan = (io.jaegertracing.internal.JaegerSpan) span; return jaegerSpan.context().getParentId() == 0; } return false; }
@Override public boolean isSampled(Span span) { if (span instanceof SpanWrapper) { span = ((SpanWrapper) span).unwrap(Span.class); } if (span instanceof io.jaegertracing.internal.JaegerSpan) { final io.jaegertracing.internal.JaegerSpan jaegerSpan = (io.jaegertracing.internal.JaegerSpan) span; return jaegerSpan.context().isSampled(); } return false; } }
context == null ? 0L : context.getTraceIdHigh(), context == null ? 0L : context.getTraceIdLow(), context == null ? 0L : context.getSpanId(), context == null ? 0L : context.getParentId(), context == null ? (byte)0 : context.getFlags(), baggage, debugId);
@Override public void inject(JaegerSpanContext spanContext, TextMap carrier) { carrier.put(TRACE_ID_NAME, // Use HexCode instead of getTraceId to ensure zipkin compatibility HexCodec.toLowerHex(spanContext.getTraceIdHigh(), spanContext.getTraceIdLow())); if (spanContext.getParentId() != 0L) { // Conventionally, parent id == 0 means the root span carrier.put(PARENT_SPAN_ID_NAME, HexCodec.toLowerHex(spanContext.getParentId())); } carrier.put(SPAN_ID_NAME, HexCodec.toLowerHex(spanContext.getSpanId())); carrier.put(SAMPLED_NAME, spanContext.isSampled() ? "1" : "0"); if (spanContext.isDebug()) { carrier.put(FLAGS_NAME, "1"); } for (Map.Entry<String, String> entry : spanContext.baggageItems()) { carrier.put(keys.prefixedKey(entry.getKey(), baggagePrefix), entry.getValue()); } }
/** * Encode context into a string. * @param context Span context to encode. * @return Encoded string representing span context. */ public static String contextAsString(JaegerSpanContext context) { int intFlag = context.getFlags() & 0xFF; return new StringBuilder() .append(context.getTraceId()).append(":") .append(Long.toHexString(context.getSpanId())).append(":") .append(Long.toHexString(context.getParentId())).append(":") .append(Integer.toHexString(intFlag)) .toString(); }
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 JaegerSpan setTagAsObject(String key, Object value) { if (key.equals(Tags.SAMPLING_PRIORITY.getKey()) && (value instanceof Number)) { int priority = ((Number) value).intValue(); byte newFlags; if (priority > 0) { newFlags = (byte) (context.getFlags() | JaegerSpanContext.flagSampled | JaegerSpanContext.flagDebug); } else { newFlags = (byte) (context.getFlags() & (~JaegerSpanContext.flagSampled)); } context = context.withFlags(newFlags); } if (context.isSampled()) { tags.put(key, value); } return this; }
public JaegerSpanContext createSpanContext( long traceIdHigh, long traceIdLow, long spanId, long parentId, byte flags, Map<String, String> baggage, String debugId) { return new JaegerSpanContext(traceIdHigh, traceIdLow, spanId, parentId, flags, baggage, debugId, this); }
@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())); }
private JaegerSpanContext createChildContext() { JaegerSpanContext preferredReference = preferredReference(); if (isRpcServer()) { if (isSampled()) { metrics.tracesJoinedSampled.inc(1); } else { metrics.tracesJoinedNotSampled.inc(1); } // Zipkin server compatibility if (zipkinSharedRpcSpan) { return preferredReference; } } return getObjectFactory().createSpanContext( preferredReference.getTraceIdHigh(), preferredReference.getTraceIdLow(), Utils.uniqueId(), preferredReference.getSpanId(), // should we do OR across passed references? preferredReference.getFlags(), getBaggage(), null); }
private JaegerSpanContext fromRandom() { return new JaegerSpanContext(random.nextLong(), /* traceId */ random.nextLong() /* spanId */, random.nextLong() /* parentId */, (byte)1 /* sampled */); } }
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 boolean isSampled() { if (references != null) { for (Reference reference : references) { if (reference.getSpanContext().isSampled()) { return true; } } } return false; }
@Override public boolean isRoot(Span span) { // TODO replace with Span#unwrap once https://github.com/opentracing/opentracing-java/pull/211 is merged if (span instanceof SpanWrapper) { span = ((SpanWrapper) span).getDelegate(); } if (span instanceof io.jaegertracing.internal.JaegerSpan) { final io.jaegertracing.internal.JaegerSpan jaegerSpan = (io.jaegertracing.internal.JaegerSpan) span; return jaegerSpan.context().getParentId() == 0; } return false; }
private JaegerSpanContext fromRandom() { return new JaegerSpanContext(random.nextLong(), /* traceId */ random.nextLong() /* spanId */, random.nextLong() /* parentId */, (byte)1 /* sampled */); } }
private void finishWithDuration(long durationMicros) { synchronized (this) { if (finished) { log.warn("Span has already been finished; will not be reported again."); return; } finished = true; this.durationMicroseconds = durationMicros; } if (context.isSampled()) { tracer.reportSpan(this); } }
static JaegerSpanContext contextFromString(String value) throws MalformedTracerStateStringException, EmptyTracerStateStringException { if (value == null || value.equals("")) { throw new EmptyTracerStateStringException(); } String[] parts = value.split(":"); if (parts.length != 4) { throw new MalformedTracerStateStringException(value); } String traceId = parts[0]; if (traceId.length() > 32 || traceId.length() < 1) { throw new TraceIdOutOfBoundException("Trace id [" + traceId + "] length is not withing 1 and 32"); } // TODO(isaachier): When we drop Java 1.6 support, use Long.parseUnsignedLong instead of using BigInteger. return new JaegerSpanContext( high(traceId), new BigInteger(traceId, 16).longValue(), new BigInteger(parts[1], 16).longValue(), new BigInteger(parts[2], 16).longValue(), new BigInteger(parts[3], 16).byteValue()); }
private void logFields(JaegerSpan jaegerSpan, String key, String value, String prevItem, boolean truncated, boolean valid) { if (!jaegerSpan.context().isSampled()) { return; } Map<String, String> fields = new HashMap<String, String>(); fields.put("event", "baggage"); fields.put("key", key); fields.put("value", value); if (prevItem != null) { fields.put("override", "true"); } if (truncated) { fields.put("truncated", "true"); } if (!valid) { fields.put("invalid", "true"); } jaegerSpan.log(fields); } }
@Override public boolean isSampled(Span span) { if (span instanceof SpanWrapper) { span = ((SpanWrapper) span).unwrap(Span.class); } if (span instanceof io.jaegertracing.internal.JaegerSpan) { final io.jaegertracing.internal.JaegerSpan jaegerSpan = (io.jaegertracing.internal.JaegerSpan) span; return jaegerSpan.context().isSampled(); } return false; } }