[
https://issues.apache.org/jira/browse/CAMEL-12656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16564696#comment-16564696
]
ASF GitHub Bot commented on CAMEL-12656:
----------------------------------------
GitHub user st2654 opened a pull request:
https://github.com/apache/camel/pull/2448
CAMEL-12656: Fixed root span id for multiple routes.
https://issues.apache.org/jira/browse/CAMEL-12656
I have added screenshots in Jira already.
Camel-Zipkin does not report traces with root span id when there are
multiple routes.
For example:
`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);`
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
// 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 + "]";
}
});
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.
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/st2654/camel CAMEL-12656
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/camel/pull/2448.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #2448
----
commit ca7fdaecc6645506a81c24409602ba3819b169b5
Author: Sourabh Taletiya <st2654@...>
Date: 2018-08-01T03:49:24Z
CAMEL-12656: Fixed root span id for multiple routes.
----
> 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.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)