Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-12656

camel-zipkin - Root Span Id is not reported if the route calls multiple route

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.21.1
    • Fix Version/s: 2.21.3, 2.22.1, 2.23.0
    • Component/s: camel-zipkin
    • Labels:
      None
    • Estimated Complexity:
      Unknown

      Description

      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.

        Attachments

        1. Traces breaking.png
          97 kB
          Sourabh Taletiya
        2. Traces fixed 1.png
          43 kB
          Sourabh Taletiya
        3. Traces fixed 2.png
          129 kB
          Sourabh Taletiya

          Activity

            People

            • Assignee:
              davsclaus Claus Ibsen
              Reporter:
              st2654 Sourabh Taletiya
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: