[ 
https://issues.apache.org/jira/browse/CAMEL-12656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16547481#comment-16547481
 ] 

Claus Ibsen commented on CAMEL-12656:
-------------------------------------

Yeah this seems more correct, thanks for the suggested fix. The root id should 
be used to group all of that activity on the exchange together, and your 
screenshots with the fix shows that.

You are welcome to provide a github PR with the fix
https://github.com/apache/camel/blob/master/CONTRIBUTING.md

> 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