Sourabh Taletiya created CAMEL-12656:
----------------------------------------

             Summary: 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
             Fix For: 2.21.2
         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