首页 > 解决方案 > 从外部服务中提取跟踪 id

问题描述

我最近升级到 Spring Cloud Sleuth 2.0.0,现在面临从外部服务正确提取跟踪 id 的问题。

ExternalService(不受我控制)正在将消息发布到 ActiveMQ 队列中,其标头值为“X-B3-TraceId”,一个 16 字符长的字符串,如“1234567890abcdef”。

我将使用 JmsListener 注释消息从MyService中的队列中取出此消息:

...
/**
 * Pulls the messages from the ActiveMQ server which are located in the destination queue.
 */
@JmsListener(destination = "${destination}")
void pullMessage(Message<String> msg) throws IOException {
    String payload = msg.getPayload();

    Span span = interceptor.nextSpan(message);

...

当我使用 TracingChannelInterceptor 从标头中获取 traceId 时,它不会将正确的 id 放入日志输出中。

2018-07-01 21:59:10.529  INFO [MyService,fae6f4dac5903bb0,fae6f4dac5903bb0,false] 19276 --- [           main] ...

我实际上期待这条线。

 2018-07-01 21:59:10.529  INFO [MyService,1234567890abcdef,fae6f4dac5903bb0,false] 19276 --- [           main] ...

为什么 Sleuth 修改该值,以及如何正确传播我的跟踪上下文以便能够跨两个系统跟踪消息?

在以前版本的 Sleuth 中,我使用此方法从标头中提取了 traceId。

private static Optional<Span> extractFromHeaders(Message<String> msg) {
    Optional<Map.Entry<String, Object>> traceIdValue = msg.getHeaders().entrySet().stream()
            .filter(header -> header.getKey().equals(TraceMessageHeaders.TRACE_ID_NAME) ||
                    header.getKey().equals("X-B3-TraceId") || header.getKey().equals("jms_correlationId"))
            .findFirst();

    String traceId = traceIdValue.map(headerEntry -> headerEntry.getValue().toString());
    long id = new BigInteger(traceId, 16).longValue();

    return Span.builder().traceId(id).build();
}

我希望你能帮助我。

标签: spring-cloudtracespring-cloud-streamspring-cloud-sleuth

解决方案


推荐阅读