在下游微服务中继续跟踪

时间:2017-12-21 23:25:24

标签: java cloud microservices spring-cloud-sleuth google-cloud-stackdriver

我们正在尝试向微服务添加跟踪,以便可以在Google Stackdriver UI中查看。我们使用部署在Kubernetes容器中的Java Springboot应用程序,每个微服务通过http进行通信。我们已经看到有Sleuth和Zipkin,如果我们将RestTemplate移动到bean将会起作用。但是,我们真的不想在每个容器中部署zipkin pod或创建新的zipkin收集器pod。理想情况下,我们希望通过使用sleuth / zipkin使用google云跟踪sdk来实现这一点。使用sdk,我们可以使用google cloud grpc库将数据导入Stackdriver,该库只是将数据直接从应用程序发送到Stackdriver。 我们现在遇到的问题是我们可以将跟踪ID发送到下游微服务,但我们似乎无法找到在同一跟踪ID上创建新跨度的方法,它总是创建一个新的。我似乎无法找到有关如何执行此操作的任何文档。当然,我们正在做的是这个库的构建目的是什么? 任何有助于此的指针都会很棒。

添加更多信息......

我无法提供实际代码,因为这是我的问题,我实际上无法找到我想要做的事情 让我试着解释一下代码/伪代码。 所以我们假设这个场景,我有3个微服务,A,B和C.

Microservice A (top level where trace is created)
  TraceContext context = tracer.startSpan("myspan1");
  TraceId traceId = context.getHandle().getCurrentSpanContext().getTraceId();
    Call Microservice B over http passing traceId in the B3-X-TraceId header
  tracer.endSpan(context);

MicroService B  
  Read B3-X-TraceId from header
  So at this point I want to call Microservice C but I want to create a new span on the same trace
  I just do not see any mechanism to do this and this is where I'm stuck.
  This is what I want to do in pseudo code 
    TraceContext context = tracer.startSpan("myspan2");
    attach the trace id that came in the header to the context
      Call Microservice C over http passing traceId in the B3-X-TraceId header
    tracer.endSpan(context);

希望这对我正在尝试的事情有意义。

2 个答案:

答案 0 :(得分:0)

您提供的代码与Sleuth无关,但与opentracing无关。在侦探中,您可以调用Tracer.createSpan("name"),这样就可以创建当前轨迹的子跨度。

答案 1 :(得分:0)

我还设法通过在创建跨度之前使用云跟踪API来实现它。

SpanContext spanContext = Trace.getSpanContextFactory().fromHeader(traceId);
Trace.getSpanContextHandler().attach(spanContext);

不确定这样做是否消极。