You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2018/08/01 08:49:00 UTC

[jira] [Resolved] (CAMEL-12656) camel-zipkin - Root Span Id is not reported if the route calls multiple route

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

Claus Ibsen resolved CAMEL-12656.
---------------------------------
    Resolution: Fixed
      Assignee: Claus Ibsen

Thanks for the PR.

> 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
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 2.21.3, 2.22.1, 2.23.0
>
>         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)