下面列出了怎么用io.opentracing.propagation.Format.Builtin的API类实例代码及写法,或者点击链接到github查看源代码。
private void process(Message message) {
SpanContext context =
tracer.extract(Builtin.TEXT_MAP_EXTRACT, new TextMapExtractAdapter(message));
Span span =
tracer
.buildSpan("receive")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
.withTag(Tags.COMPONENT.getKey(), "example-server")
.asChildOf(context)
.start();
try (Scope scope = tracer.activateSpan(span)) {
// Simulate work.
} finally {
span.finish();
}
}
public void send() throws InterruptedException {
Message message = new Message();
Span span =
tracer
.buildSpan("send")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(Tags.COMPONENT.getKey(), "example-client")
.start();
try (Scope scope = tracer.activateSpan(span)) {
tracer.inject(span.context(), Builtin.TEXT_MAP_INJECT, new TextMapInjectAdapter(message));
queue.put(message);
} finally {
span.finish();
}
}
public static void onMessageEnter(final Object msg) {
if (LocalSpanContext.get(COMPONENT_NAME) != null) {
LocalSpanContext.get(COMPONENT_NAME).increment();
return;
}
final Tracer tracer = GlobalTracer.get();
final SpanBuilder builder = tracer
.buildSpan("onMessage")
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_CONSUMER);
final Message message = (Message)msg;
if (message.getMessageProperties() != null) {
final Map<String,Object> headers = message.getMessageProperties().getHeaders();
final SpanContext spanContext = tracer.extract(Builtin.TEXT_MAP, new HeadersMapExtractAdapter(headers));
if (spanContext != null)
builder.addReference(References.FOLLOWS_FROM, spanContext);
}
final Span span = builder.start();
LocalSpanContext.set(COMPONENT_NAME, span, tracer.activateSpan(span));
}
public static void handleMessageEnter(final Object function, final Object contextArg, final Object arg0) {
final Tracer tracer = GlobalTracer.get();
final SpanBuilder spanBuilder = tracer
.buildSpan(getFunctionName(function, contextArg))
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER);
if (arg0 != null) {
final Record<?> record = (Record<?>)arg0;
final SpanContext spanContext = tracer.extract(Builtin.TEXT_MAP, new TextMapExtractAdapter(record.getProperties()));
if (spanContext != null)
spanBuilder.addReference(References.FOLLOWS_FROM, spanContext);
}
final Span span = spanBuilder.start();
final Scope scope = tracer.activateSpan(span);
LocalSpanContext.set(COMPONENT_NAME, span, scope);
}
@SuppressWarnings("unchecked")
private Message<?> preSendServerSpan(final Message<?> message) {
final String destination = (String)message.getHeaders().get(SIMP_DESTINATION);
final SpanBuilder spanBuilder = tracer
.buildSpan(destination != null ? destination : UNKNOWN_DESTINATION)
.withTag(Tags.SPAN_KIND.getKey(), spanKind)
.withTag(Tags.COMPONENT.getKey(), WEBSOCKET);
final Map<String,List<String>> nativeHeaders = (Map<String,List<String>>)message.getHeaders().get(NativeMessageHeaderAccessor.NATIVE_HEADERS);
SpanContext spanContext = null;
if (nativeHeaders != null)
spanContext = tracer.extract(Builtin.TEXT_MAP, new NativeHeadersExtractAdapter(nativeHeaders));
if (spanContext == null)
spanContext = tracer.extract(Format.Builtin.TEXT_MAP, new TextMapExtractAdapter(message.getHeaders()));
if (spanContext != null)
spanBuilder.asChildOf(spanContext);
final Span span = spanBuilder.start();
return MessageBuilder.fromMessage(message).setHeader(OPENTRACING_SPAN, span).build();
}
public static void enter(final Object thiz) {
if (LocalSpanContext.get(COMPONENT_NAME) != null) {
LocalSpanContext.get(COMPONENT_NAME).increment();
return;
}
final Tracer tracer = GlobalTracer.get();
HttpRequest request = (HttpRequest)thiz;
final Span span = tracer
.buildSpan(request.getRequestMethod())
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.HTTP_METHOD, request.getRequestMethod())
.withTag(Tags.HTTP_URL, request.getUrl().toString())
.withTag(Tags.PEER_PORT, getPort(request))
.withTag(Tags.PEER_HOSTNAME, request.getUrl().getHost()).start();
final Scope scope = tracer.activateSpan(span);
tracer.inject(span.context(), Builtin.HTTP_HEADERS, new HttpHeadersInjectAdapter(request.getHeaders()));
LocalSpanContext.set(COMPONENT_NAME, span, scope);
}
public static void writeFieldStop(final Object protocol) throws TException {
if (injected.get())
return;
final TProtocol tProtocol = (TProtocol)protocol;
final Span span = spanHolder.get();
if (span == null)
return;
final Map<String,String> map = new HashMap<>();
GlobalTracer.get().inject(span.context(), Builtin.TEXT_MAP, new TextMapAdapter(map));
tProtocol.writeFieldBegin(new TField("span", TType.MAP, SPAN_FIELD_ID));
tProtocol.writeMapBegin(new TMap(TType.STRING, TType.STRING, map.size()));
for (final Entry<String,String> entry : map.entrySet()) {
tProtocol.writeString(entry.getKey());
tProtocol.writeString(entry.getValue());
}
tProtocol.writeMapEnd();
tProtocol.writeFieldEnd();
injected.set(true);
}
public static void applyStart(final Object arg0) {
if (LocalSpanContext.get(COMPONENT_NAME) != null) {
LocalSpanContext.get(COMPONENT_NAME).increment();
return;
}
final Request<?> request = (Request<?>)arg0;
final Tracer tracer = GlobalTracer.get();
final SpanBuilder spanBuilder = tracer.buildSpan(request.method())
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER)
.withTag(Tags.HTTP_METHOD, request.method())
.withTag(Tags.HTTP_URL, (request.secure() ? "https://" : "http://") + request.host() + request.uri());
final SpanContext parent = tracer.extract(Builtin.HTTP_HEADERS, new HttpHeadersExtractAdapter(request.headers()));
if (parent != null)
spanBuilder.asChildOf(parent);
final Span span = spanBuilder.start();
LocalSpanContext.set(COMPONENT_NAME, span, tracer.activateSpan(span));
}
public static Object requestStart(final Object arg0) {
if (LocalSpanContext.get(COMPONENT_NAME_CLIENT) != null) {
LocalSpanContext.get(COMPONENT_NAME_CLIENT).increment();
return arg0;
}
final HttpRequest request = (HttpRequest)arg0;
final Tracer tracer = GlobalTracer.get();
final Span span = tracer
.buildSpan(request.method().value())
.withTag(Tags.COMPONENT, COMPONENT_NAME_CLIENT)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_CLIENT)
.withTag(Tags.HTTP_METHOD, request.method().value())
.withTag(Tags.HTTP_URL, request.getUri().toString())
.withTag(Tags.PEER_HOSTNAME, request.getUri().host().address())
.withTag(Tags.PEER_PORT, request.getUri().port())
.start();
final HttpHeadersInjectAdapter injectAdapter = new HttpHeadersInjectAdapter(request);
tracer.inject(span.context(), Builtin.HTTP_HEADERS, injectAdapter);
LocalSpanContext.set(COMPONENT_NAME_CLIENT, span, tracer.activateSpan(span));
return injectAdapter.getHttpRequest();
}
private static void buildConsumerSpan(final Consumer<?> consumer, final Message<?> message) {
final Tracer tracer = GlobalTracer.get();
final SpanContext parentContext = tracer.extract(Builtin.TEXT_MAP, new TextMapAdapter(message.getProperties()));
final SpanBuilder spanBuilder = tracer
.buildSpan("receive")
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_CONSUMER)
.withTag("topic", consumer.getTopic())
.withTag("subscription", consumer.getSubscription())
.withTag(Tags.PEER_SERVICE, "pulsar");
if (parentContext != null)
spanBuilder.addReference(References.FOLLOWS_FROM, parentContext);
spanBuilder.start().finish();
}
public static void internalSendAsyncEnter(final Object thiz, final Object arg) {
if (LocalSpanContext.get(COMPONENT_NAME) != null) {
LocalSpanContext.get(COMPONENT_NAME).increment();
return;
}
final MessageImpl<?> message = (MessageImpl<?>)arg;
final Producer<?> producer = (Producer<?>)thiz;
final Tracer tracer = GlobalTracer.get();
final Span span = tracer
.buildSpan("send")
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_PRODUCER)
.withTag(Tags.MESSAGE_BUS_DESTINATION, producer.getTopic())
.withTag(Tags.PEER_SERVICE, "pulsar")
.start();
message.getProperties();
tracer.inject(span.context(), Builtin.TEXT_MAP, new PropertiesMapInjectAdapter(message.getMessageBuilder()));
final Scope scope = tracer.activateSpan(span);
LocalSpanContext.set(COMPONENT_NAME, span, scope);
}
@Bean
Tracer tracer() {
return new Configuration("camel-server")
.withSampler(
new SamplerConfiguration()
.withType(ConstSampler.TYPE)
.withParam(1))
.withReporter(new ReporterConfiguration().withSender(
new SenderConfiguration()
.withEndpoint("http://localhost:14268/api/traces")
))
.withCodec(
new CodecConfiguration()
.withCodec(Builtin.TEXT_MAP, new TextMapCodec(true))
)
.getTracer();
}
private WebClient withTrace(final WebClient client, final JaegerSpanContext spanContext) {
tracer.inject(spanContext, Builtin.HTTP_HEADERS, new TextMap() {
@Override
public void put(String key, String value) {
client.header(key, value);
}
@Override
public Iterator<Entry<String, String>> iterator() {
return null;
}
});
return client;
}
@Override
public void write(final ChannelHandlerContext context, final Object message, final ChannelPromise promise) {
if (!(message instanceof HttpRequest)) {
context.write(message, promise);
return;
}
final HttpRequest request = (HttpRequest)message;
final Tracer tracer = GlobalTracer.get();
final SpanBuilder builder = tracer
.buildSpan(request.method().name())
.withTag(Tags.COMPONENT, "netty")
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_CLIENT)
.withTag(Tags.HTTP_METHOD, request.method().name())
.withTag(Tags.HTTP_URL, request.uri());
final SpanContext parentContext = tracer.extract(Builtin.HTTP_HEADERS, new NettyExtractAdapter(request.headers()));
if (parentContext != null)
builder.asChildOf(parentContext);
final Span span = builder.start();
try (final Scope scope = tracer.activateSpan(span)) {
// AWS calls are often signed, so we can't add headers without breaking
// the signature.
if (!request.headers().contains("amz-sdk-invocation-id")) {
tracer.inject(span.context(), Builtin.HTTP_HEADERS, new NettyInjectAdapter(request.headers()));
}
context.channel().attr(TracingClientChannelInboundHandlerAdapter.CLIENT_ATTRIBUTE_KEY).set(span);
try {
context.write(message, promise);
}
catch (final Throwable t) {
OpenTracingApiUtil.setErrorTag(span, t);
span.finish();
throw t;
}
}
}
@Override
public void channelRead(final ChannelHandlerContext handlerContext, final Object message) {
if (!(message instanceof HttpRequest)) {
handlerContext.fireChannelRead(message);
return;
}
final HttpRequest request = (HttpRequest)message;
final Tracer tracer = GlobalTracer.get();
final SpanBuilder spanBuilder = tracer.buildSpan(request.method().name())
.withTag(Tags.COMPONENT, "netty")
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER)
.withTag(Tags.HTTP_METHOD, request.method().name())
.withTag(Tags.HTTP_URL, request.uri());
final SpanContext spanContext = tracer.extract(Builtin.HTTP_HEADERS, new NettyExtractAdapter(request.headers()));
if (spanContext != null)
spanBuilder.asChildOf(spanContext);
final Span span = spanBuilder.start();
try (final Scope scope = tracer.activateSpan(span)) {
handlerContext.channel().attr(SERVER_ATTRIBUTE_KEY).set(span);
try {
handlerContext.fireChannelRead(message);
}
catch (final Throwable t) {
OpenTracingApiUtil.setErrorTag(span, t);
span.finish();
throw t;
}
}
}
private Message<?> preSendClientSpan(final Message<?> message) {
final String destination = (String)message.getHeaders().get(SIMP_DESTINATION);
final Span span = tracer
.buildSpan(destination != null ? destination : UNKNOWN_DESTINATION)
.withTag(Tags.SPAN_KIND.getKey(), spanKind)
.withTag(Tags.COMPONENT.getKey(), WEBSOCKET).start();
final MessageBuilder<?> messageBuilder = MessageBuilder.fromMessage(message).setHeader(OPENTRACING_SPAN, span);
tracer.inject(span.context(), Format.Builtin.TEXT_MAP, new TextMapInjectAdapter(messageBuilder));
return messageBuilder.build();
}
public static void enter(final Object thiz, final boolean connected) {
if (LocalSpanContext.get(COMPONENT_NAME) != null) {
LocalSpanContext.get(COMPONENT_NAME).increment();
return;
}
if (connected)
return;
final HttpURLConnection connection = (HttpURLConnection)thiz;
final Tracer tracer = GlobalTracer.get();
final SpanContext spanContext = tracer.extract(Builtin.HTTP_HEADERS, new HttpURLConnectionExtractAdapter(connection));
if (spanContext != null)
return;
final Span span = tracer.buildSpan(connection.getRequestMethod())
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.HTTP_METHOD, connection.getRequestMethod())
.withTag(Tags.HTTP_URL, connection.getURL().toString())
.withTag(Tags.PEER_PORT, getPort(connection))
.withTag(Tags.PEER_HOSTNAME, connection.getURL().getHost()).start();
final Scope scope = tracer.activateSpan(span);
tracer.inject(span.context(), Builtin.HTTP_HEADERS, new HttpURLConnectionInjectAdapter(connection));
LocalSpanContext.set(COMPONENT_NAME, span, scope);
}
public static Object[] enter(final Object arg0, final Object arg1, final Object arg2) {
final HttpRequest request = arg0 instanceof HttpRequest ? (HttpRequest)arg0 : arg1 instanceof HttpRequest ? (HttpRequest)arg1 : null;
if (request == null)
return null;
if (request.getHeaders("amz-sdk-invocation-id").length > 0) {
// skip embedded Apache HttpClient in AWS SDK Client, because it breaks
// request signature and AWS SDK gets traced by the aws-sdk rule
return null;
}
final LocalSpanContext context = LocalSpanContext.get(COMPONENT_NAME);
if (context != null) {
context.increment();
return null;
}
final Tracer tracer = GlobalTracer.get();
final Span span = tracer
.buildSpan(request.getRequestLine().getMethod())
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(Tags.HTTP_METHOD, request.getRequestLine().getMethod())
.withTag(Tags.HTTP_URL, request.getRequestLine().getUri()).start();
for (final ApacheClientSpanDecorator decorator : Configuration.spanDecorators)
decorator.onRequest(request, arg0 instanceof HttpHost ? (HttpHost)arg0 : null, span);
LocalSpanContext.set(COMPONENT_NAME, span, null);
tracer.inject(span.context(), Builtin.HTTP_HEADERS, new HttpHeadersInjectAdapter(request));
if (arg1 instanceof ResponseHandler)
return new Object[] {WrapperProxy.wrap(arg1, new TracingResponseHandler<>((ResponseHandler<?>)arg1, span))};
if (arg2 instanceof ResponseHandler)
return new Object[] {null, WrapperProxy.wrap(arg2, new TracingResponseHandler<>((ResponseHandler<?>)arg2, span))};
return null;
}
static Span buildSpan(final HttpRequest request) {
final SpanBuilder spanBuilder = GlobalTracer.get().buildSpan(request.method().value())
.withTag(Tags.COMPONENT, COMPONENT_NAME_SERVER)
.withTag(Tags.HTTP_URL, request.getUri().toString())
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER);
final SpanContext context = GlobalTracer.get().extract(Builtin.HTTP_HEADERS, new HttpHeadersExtractAdapter(request));
if (context != null)
spanBuilder.addReference(References.FOLLOWS_FROM, context);
return spanBuilder.start();
}
public static Object executeStart(final Object arg0, final Object arg1) {
final Request request = (Request)arg0;
final AsyncHandler<?> asyncHandler = (AsyncHandler<?>)arg1;
final Tracer tracer = GlobalTracer.get();
final Span span = tracer.buildSpan(request.getMethod())
.withTag(Tags.COMPONENT, COMPONENT_NAME)
.withTag(Tags.SPAN_KIND, Tags.SPAN_KIND_CLIENT)
.withTag(Tags.HTTP_METHOD, request.getMethod())
.withTag(Tags.HTTP_URL, request.getUrl())
.start();
tracer.inject(span.context(), Builtin.HTTP_HEADERS, new HttpHeadersInjectAdapter(request.getHeaders()));
return WrapperProxy.wrap(asyncHandler, new TracingAsyncHandler(asyncHandler, span));
}
private void randomBall(RoutingContext ctx) {
JsonObject json = new JsonObject()
.put("x", LEFT + rnd.nextInt(WIDTH))
.put("y", TOP + rnd.nextInt(HEIGHT));
HttpRequest<Buffer> request = client.put(BALL_PORT, BALL_HOST, "/setPosition");
TRACER.ifPresent(tracer -> tracer.inject(TracingHandler.serverSpanContext(ctx), Builtin.HTTP_HEADERS, new TracingContext(request.headers())));
request.sendJson(json, ar -> {
if (!ar.succeeded()) {
ar.cause().printStackTrace();
}
});
ctx.response().end();
}
private void resetBall(RoutingContext ctx) {
JsonObject json = new JsonObject()
.put("x", LEFT + WIDTH / 2)
.put("y", TOP + HEIGHT / 2);
HttpRequest<Buffer> request = client.put(BALL_PORT, BALL_HOST, "/setPosition");
TRACER.ifPresent(tracer -> tracer.inject(TracingHandler.serverSpanContext(ctx), Builtin.HTTP_HEADERS, new TracingContext(request.headers())));
request.sendJson(json, ar -> {
if (!ar.succeeded()) {
ar.cause().printStackTrace();
}
});
}
private void process(Message message) {
SpanContext context = tracer.extract(Builtin.TEXT_MAP_EXTRACT, new TextMapExtractAdapter(message));
Span span = tracer.buildSpan("receive")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
.withTag(Tags.COMPONENT.getKey(), "example-server")
.asChildOf(context)
.start();
try (Scope scope = tracer.activateSpan(span)) {
} finally {
span.finish();
}
}
public void send() throws InterruptedException {
Message message = new Message();
Span span = tracer.buildSpan("send")
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(Tags.COMPONENT.getKey(), "example-client")
.start();
try (Scope scope = tracer.activateSpan(span)) {
tracer.inject(span.context(), Builtin.TEXT_MAP_INJECT, new TextMapInjectAdapter(message));
queue.put(message);
} finally {
span.finish();
}
}
@VisibleForTesting
void setSourceSpan(@Nullable Span activeSpan, Tracer tracer) {
if (activeSpan == null) {
return;
}
tracer.inject(activeSpan.context(), Builtin.TEXT_MAP, new TextMapAdapter(_spanData));
}
protected TraceScopeHolder<TraceScope> startTraceSpan(final Map<String, List<String>> requestHeaders,
URI uri, String method) {
SpanContext parent = tracer.extract(Builtin.HTTP_HEADERS,
new TextMapAdapter(
requestHeaders
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, this::getFirstValueOrEmpty))
));
Span activeSpan = null;
Scope scope = null;
if (parent == null) {
activeSpan = tracer.buildSpan(buildSpanDescription(uri.getPath(), method)).start();
scope = tracer.scopeManager().activate(activeSpan);
} else {
activeSpan = tracer.buildSpan(buildSpanDescription(uri.getPath(), method)).asChildOf(parent).start();
scope = tracer.scopeManager().activate(activeSpan);
}
// Set additional tags
activeSpan.setTag(Tags.HTTP_METHOD.getKey(), method);
activeSpan.setTag(Tags.HTTP_URL.getKey(), uri.toString());
// If the service resource is using asynchronous processing mode, the trace
// scope will be closed in another thread and as such should be detached.
Span span = null;
if (isAsyncResponse()) {
// Do not modify the current context span
span = activeSpan;
propagateContinuationSpan(span);
scope.close();
}
return new TraceScopeHolder<TraceScope>(new TraceScope(activeSpan, scope), span != null);
}
@Test
public void testThatNewInnerSpanIsCreated() throws Exception {
final JaegerSpanContext spanId = fromRandom();
final Map<String, List<String>> headers = new HashMap<>();
tracer.inject(spanId, Builtin.HTTP_HEADERS, new TextMapInjectAdapter(headers));
final BookStoreService service = createJaxWsService(headers);
assertThat(service.getBooks().size(), equalTo(2));
assertThat(REPORTER.getSpans().size(), equalTo(2));
assertThat(REPORTER.getSpans().get(0).getOperationName(), equalTo("Get Books"));
assertThat(REPORTER.getSpans().get(1).getOperationName(), equalTo("POST /BookStore"));
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
ServletContext sc = servletContextEvent.getServletContext();
String serviceName = getProperty(sc, JAEGER_SERVICE_NAME);
if (serviceName == null || serviceName.isEmpty()) {
logger.warn("No Service Name set. Using default. Please change it.");
serviceName = "thorntail/unknown";
}
Configuration configuration = new Configuration(serviceName)
.withSampler(
new Configuration.SamplerConfiguration()
.withType(
getProperty(sc, JAEGER_SAMPLER_TYPE))
.withParam(
getPropertyAsNumber(sc, JAEGER_SAMPLER_PARAM))
.withManagerHostPort(
getProperty(sc, JAEGER_SAMPLER_MANAGER_HOST_PORT)))
.withReporter(
new ReporterConfiguration()
.withLogSpans(
getPropertyAsBoolean(sc, JAEGER_REPORTER_LOG_SPANS))
.withSender(
new SenderConfiguration()
.withAuthUsername(getProperty(sc, JAEGER_USER))
.withAuthPassword(getProperty(sc, JAEGER_PASSWORD))
.withAgentHost(getProperty(sc, JAEGER_AGENT_HOST))
.withAgentPort(getPropertyAsInt(sc, JAEGER_AGENT_PORT)))
.withFlushInterval(
getPropertyAsInt(sc, JAEGER_REPORTER_FLUSH_INTERVAL))
.withMaxQueueSize(
getPropertyAsInt(sc, JAEGER_REPORTER_MAX_QUEUE_SIZE)
)
);
String remoteEndpoint = getProperty(sc, JAEGER_ENDPOINT);
if (remoteEndpoint != null && remoteEndpoint.trim().length() > 0) {
configuration.getReporter()
.withSender(new SenderConfiguration()
.withEndpoint(remoteEndpoint));
}
String enableB3HeaderPropagation = getProperty(sc, "enableB3HeaderPropagation");
if (enableB3HeaderPropagation != null && Boolean.parseBoolean(enableB3HeaderPropagation)) {
logger.info("Enabling B3 Header Propagation for Jaeger");
CodecConfiguration codecConfiguration = new CodecConfiguration();
codecConfiguration.withCodec(Builtin.HTTP_HEADERS, new B3TextMapCodec.Builder().build());
codecConfiguration.withCodec(Builtin.TEXT_MAP, new B3TextMapCodec.Builder().build());
configuration.withCodec(codecConfiguration);
}
GlobalTracer.register(configuration.getTracer());
}
@VisibleForTesting
SpanContext getSourceSpan(Tracer tracer) {
return tracer.extract(Builtin.TEXT_MAP, new TextMapAdapter(_spanData));
}