【问题标题】:How to get currentSpan for rabbitmq application with brave (java)?如何使用勇敢(java)获取rabbitmq应用程序的currentSpan?
【发布时间】:2017-06-20 03:15:09
【问题描述】:

我的应用程序是基于 spring-rabbitmq 的应用程序(既不是 spring-cloud 也不是 spring-boot),从一个队列接收请求并将响应发送到另一个队列。

我想通过在发送消息之前注入 Zipkin 标头并在收到消息后立即提取 Zipkin 标头来使用勇敢来跟踪系统。

问题是在下面场景的step3中,如何在发送消息之前获取span1?

场景:

step1, app -> mq (new created span1, root span, client)
step2, mq -> app (receive span1, server)
step3, app -> mq (**new created span2, child span of span1, client**)
step4, mq -> app (receive span2, server)

发送消息前编码sn-p:

     try{
        Span currentSpan = tracer.currentSpan();
        Span newSpan = null;
        if(currentSpan == null){
            newSpan = tracer.newTrace();
        }else{
            newSpan = tracer.newChild(currentSpan.context());
        }

        Map<String, String> strHeaders = new HashMap<String, String>();
        tracing.propagation().injector(Map<String, String>::put).inject(newSpan.context(),strHeaders);
        messageProperties.setHeader("zipkin.brave.tracing.headers", strHeaders);
        newSpan.name("send").kind(Kind.CLIENT).start().flush();
    }catch(Exception e){
        logger.warn("zipkin problem", e);
    }

在上述代码 Span currentSpan = tracer.currentSpan(); 中,currentSpan 始终为 null

收到消息后编码sn-p:

    try{
        Map<String, Object> msgHeaders = messageProperties.getHeaders();
        Object headersObj = msgHeaders.get("zipkin.brave.tracing.headers");
        Map<String, String> strHeaders = null;
        if(headersObj != null){
            strHeaders = (HashMap<String, String>)headersObj;
        }
        TraceContextOrSamplingFlags result = tracing.propagation().extractor(Map<String, String>::get).extract(strHeaders);

        if(result.context() != null){
            Span clientSpan = tracer.joinSpan(result.context());
            clientSpan.name("receive").kind(Kind.SERVER).start().flush();
        }
    }catch(Exception e){
        logger.warn("zipkin problem", e);
    }

勇敢的配置代码:

@Configuration
public class BraveSpringConfiguration {
    private static final Logger logger = LoggerFactory.getLogger(BraveSpringConfiguration.class);

    /** Configuration for how to send spans to Zipkin */
    @Bean
    public Sender sender() {
        logger.debug("okhttpsender");
        return OkHttpSender.create("http://127.0.0.1:9411/api/v1/spans");
    }

    /** Configuration for how to buffer spans into messages for Zipkin */
    @Bean
    public Reporter<Span> reporter() {
        logger.debug("asyncreporter");
        return AsyncReporter.builder(sender()).build();
    }

    /** Controls aspects of tracing such as the name that shows up in the UI */
    @Bean
    public Tracing tracing() {
        logger.debug("one tracing");
        return Tracing.newBuilder()
            .localServiceName("spring-rabbitmq-brave")
            //// log4j2, import brave.context.log4j2.ThreadContextCurrentTraceContext;
            //.currentTraceContext(ThreadContextCurrentTraceContext.create()) // puts trace IDs into logs
            .currentTraceContext(MDCCurrentTraceContext.create()) // puts trace IDs into logs
            .sampler(Sampler.ALWAYS_SAMPLE) // always sampler
            .reporter(reporter())
            .build();
    }

    /** Controls aspects of tracing such as the name that shows up in the UI */
    @Bean
    public Tracer tracer() {
        logger.debug("one tracer");
        return tracing().tracer();
    }
}

以下是我的参考资料:

  1. https://github.com/openzipkin/brave/tree/master/brave#one-way-tracing

  2. https://github.com/openzipkin/brave/blob/master/brave/src/test/java/brave/features/async/OneWaySpanTest.java

  3. https://gist.github.com/adriancole/76d94054b77e3be338bd75424ca8ba30

【问题讨论】:

    标签: java spring zipkin


    【解决方案1】:

    问题解决了。 tracer.withSpanInScope(clientSpan) 会做这项工作。

    请注意,withSpanInScope(...) 在发送消息之前没有被调用。

    【讨论】:

    • 谢谢!在把我的头撞到墙上几个小时之后,这挽救了我的一天。
    • @Alpha TAN 你节省了一天!!!有趣的一点是您是如何知道这个解决方案的??
    • @DHRUVBANSAL 很高兴它有帮助。解决方案来自于勇敢在通常情况下工作的事实。它必须通过某种方式工作,然后我挖掘了源代码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多