void verifyRoundTrip(TraceContextOrSamplingFlags expected) { TraceContextOrSamplingFlags extracted = propagation.extractor(mapEntry).extract(map); assertThat(extracted) .isEqualTo(expected); Map<K, String> injected = new LinkedHashMap<>(); if (expected.context() != null) { propagation.injector(mapEntry).inject(expected.context(), injected); } else { inject(injected, expected.samplingFlags()); } assertThat(map).isEqualTo(injected); }
@Override public TraceContextOrSamplingFlags extract(C carrier) { TraceContextOrSamplingFlags result = delegate.extract(carrier); // always allocate in case fields are added late Extra fields = propagation.factory.extraFactory.create(); for (int i = 0, length = propagation.keys.size(); i < length; i++) { String maybeValue = getter.get(carrier, propagation.keys.get(i)); if (maybeValue == null) continue; fields.put(propagation.factory.keyToField[i], maybeValue); } return result.toBuilder().addExtra(fields).build(); } }
@Override public void accept(Propagation<?> propagation) { TraceContext.Injector<Map<Object, String>> injector = propagation.injector(Map::put); TraceContext.Extractor<Map<Object, String>> extractor = propagation.extractor(Map::get); TraceContext ctx = TraceContext.newBuilder().traceId(1L).spanId(2L).sampled(false).build(); Map<Object, String> map = new LinkedHashMap<>(); injector.inject(ctx, map); assertThat(extractor.extract(map).context()) .isEqualToIgnoringGivenFields(ctx, "traceIdString", "spanIdString"); } }
@Benchmark public TraceContextOrSamplingFlags extract_nothing() { return extraExtractor.extract(nothingIncoming); }
@Benchmark public TraceContextOrSamplingFlags extract_nothing() { return b3Extractor.extract(nothingIncoming); }
@Benchmark public TraceContextOrSamplingFlags extract_both_no_tags() { return bothExtractor.extract(incomingBothNoTags); }
@Benchmark public TraceContextOrSamplingFlags extract_both_nothing() { return bothExtractor.extract(nothingIncoming); }
@Benchmark public TraceContextOrSamplingFlags extract_b3_nothing() { return b3Extractor.extract(nothingIncoming); }
@Benchmark public TraceContextOrSamplingFlags extract_b3() { return b3Extractor.extract(incomingBoth); }
@Benchmark public TraceContextOrSamplingFlags extract_unsampled() { return b3Extractor.extract(incomingNotSampled); }
@Benchmark public TraceContextOrSamplingFlags extract_nothing() { return b3Extractor.extract(nothingIncoming); }
@Benchmark public TraceContextOrSamplingFlags extract() { return extraExtractor.extract(incoming); }
@Benchmark public TraceContextOrSamplingFlags extract() { return b3Extractor.extract(incoming); }
@Benchmark public TraceContextOrSamplingFlags extract() { return b3Extractor.extract(incoming); }
TraceContextOrSamplingFlags extractAndClearMessage(Message message) { TraceContextOrSamplingFlags extracted = extractor.extract(message); // Clear propagation regardless of extraction as JMS requires clearing as a means to make the // message writable PropertyFilter.MESSAGE.filterProperties(message, propagationKeys); return extracted; }
@Override TraceContextOrSamplingFlags extractAndClearMessage(JMSProducer message) { TraceContextOrSamplingFlags extracted = extractor.extract(message); PropertyFilter.JMS_PRODUCER.filterProperties(message, jmsTracing.propagationKeys); return extracted; }
Span nextSpan(ProcessorContext context) { TraceContextOrSamplingFlags extracted = extractor.extract(context.headers()); Span result = tracing.tracer().nextSpan(extracted); if (!result.isNoop()) { addTags(context, result); } return result; }
TraceContextOrSamplingFlags extractAndClearHeaders(Headers headers) { TraceContextOrSamplingFlags extracted = extractor.extract(headers); // clear propagation headers if we were able to extract a span if (!extracted.equals(TraceContextOrSamplingFlags.EMPTY)) { clearHeaders(headers); } return extracted; }
TraceContextOrSamplingFlags extractAndClearHeaders(Message message) { MessageProperties messageProperties = message.getMessageProperties(); TraceContextOrSamplingFlags extracted = extractor.extract(messageProperties); Map<String, Object> headers = messageProperties.getHeaders(); clearHeaders(headers); return extracted; }
/** * Like {@link #handleReceive(TraceContext.Extractor, Object)}, except for when the carrier of * trace data is not the same as the request. * * <p>Request data is parsed before the span is started. * * @see HttpServerParser#request(HttpAdapter, Object, SpanCustomizer) */ public <C> Span handleReceive(TraceContext.Extractor<C> extractor, C carrier, Req request) { Span span = nextSpan(extractor.extract(carrier), request); return handleStart(request, span); }