[ 
https://issues.apache.org/jira/browse/CAMEL-12656?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen updated CAMEL-12656:
--------------------------------
    Summary: camel-zipkin - Root Span Id is not reported if the route calls 
multiple route  (was: Root Span Id is not reported if the route calls multiple 
route)

> camel-zipkin - Root Span Id is not reported if the route calls multiple route
> -----------------------------------------------------------------------------
>
>                 Key: CAMEL-12656
>                 URL: https://issues.apache.org/jira/browse/CAMEL-12656
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-zipkin
>    Affects Versions: 2.21.1
>            Reporter: Sourabh Taletiya
>            Priority: Major
>             Fix For: 2.22.1, 2.23.0, 2.21.3
>
>         Attachments: Traces breaking.png, Traces fixed 1.png, Traces fixed 
> 2.png
>
>
> Camel-Zipkin does not report traces with root span id when there are multiple 
> routes. 
> For example: 
>  
> {code:java}
> from("direct:foo")
>         .delay(1000)
>         .to("direct:bar")
>         .to("direct:moo")
>         .to("direct:tar");
> from("direct:bar")
>         .delay(2000);
> from("direct:moo")
>         .delay(1000);
> from("direct:tar")
>         .delay(3000);
> {code}
> Root SpanId(TraceId) should be for service-name = direct:foo and the trace in 
> UI should show all the 4 routes in one sequence. But it breaks. Check the 
> attached screenshot: Traces Breaking.png
> I looked into the code and figured out why its happening. Here is the code 
> which is breaking the functionality.
> Class Name: ZipkinTracer.ZipkinRoutePolicy
> Inside onExchangeBegin() method 
>  
> {code:java}
> // add on completion after the route is done, but before the consumer writes 
> the response
> // this allows us to track the zipkin event before returning the response 
> which is the right time
> exchange.addOnCompletion(new SynchronizationAdapter() {
>     @Override
>     public void onAfterRoute(Route route, Exchange exchange) {
>         String serviceName = getServiceName(exchange, route.getEndpoint(), 
> true, false);
>         Brave brave = getBrave(serviceName);
>         if (brave != null) {
>             serverResponse(brave, serviceName, exchange);
>         }
>     }
>     @Override
>     public String toString() {
>         return "ZipkinTracerOnCompletion[" + routeId + "]";
>     }
> });
> {code}
>  
>  
> Using onAfterRoute() :  if the exchange is being routed through multiple 
> routes, there will be callbacks for each route.
> I have fix for it: 
> If I use onExchangeDone() instead of above code. The traces are reported 
> properly.  Check screenshots.
> https://zipkin.io/pages/instrumenting.html
> *Note* This process must be repeated if the service makes multiple downstream 
> calls. That is each subsequent span will have the same trace id and parent 
> id, but a new and different span id.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to