2017-06-20 5 views
0

Mon application est une application basée sur spring-rabbitmq (ni spring-cloud ni spring-boot), les requêtes ont été reçues d'une file d'attente et ont envoyé des réponses à une autre file d'attente. Je veux utiliser courageux pour tracer le système en injectant des en-têtes Zipkin avant d'envoyer des messages et d'extraire des en-têtes Zipkin juste après avoir reçu des messages.Comment obtenir currentSpan pour l'application rabbitmq avec brave (java)?

Le problème est À l'étape 3 du scénario suivant, comment puis-je obtenir span1 avant d'envoyer un message?

Scénario:

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) 

extrait de code avant d'envoyer un message:

 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); 
    } 

Dans le code ci-dessus, Span currentSpan = tracer.currentSpan();, le currentSpan est toujours nulle.

extrait de code

après réception du message:

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); 
    } 

code de configuration Brave:

@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(); 
    } 
} 

Voici mes références:

  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

Répondre

0

Problème résolu. tracer.withSpanInScope(clientSpan) ferait le travail.

Notez que withSpanInScope(...) n'a pas été appelée avant d'envoyer des messages.