0

我们正在尝试向微服务添加跟踪,以便可以在 google Stackdriver UI 中查看。我们正在使用部署到 Kubernetes 容器中的 Java Springboot 应用程序,每个微服务都通过 http 进行通信。我们已经看到有 Sleuth 和 Zipkin,如果我们将 RestTemplate 移动到一个 bean 上,它们就可以工作。但是,我们真的不想在每个容器中部署 zipkin pod 或创建新的 zipkin 收集器 pod。理想情况下,我们希望仅使用 google cloud tracking sdk 和 sleuth/zipkin 来完成这项工作。使用 sdk,我们可以使用 google cloud grpc 库将数据直接从应用程序发送到 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);

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

4

2 回答 2

0

在创建跨度之前,我还设法通过仅使用云跟踪 api 来使其工作。

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

不确定这样做是否有负面影响。

于 2017-12-28T20:29:13.113 回答
0

您提供的代码与 Sleuth 无关,而是与 opentracing 相关。在 Sleuth 中,您将调用Tracer.createSpan("name"),这样您的当前跟踪的子跨度就会被创建。

于 2017-12-28T10:49:29.320 回答