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

Ramu updated CAMEL-12656:
-------------------------
    Description: 
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.

  was:
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.


> 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