我们正在尝试向微服务添加跟踪,以便可以在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);
希望这对我正在尝试的事情有意义。
答案 0 :(得分:0)
您提供的代码与Sleuth无关,但与opentracing无关。在侦探中,您可以调用Tracer.createSpan("name")
,这样就可以创建当前轨迹的子跨度。
答案 1 :(得分:0)
我还设法通过在创建跨度之前使用云跟踪API来实现它。
SpanContext spanContext = Trace.getSpanContextFactory().fromHeader(traceId);
Trace.getSpanContextHandler().attach(spanContext);
不确定这样做是否消极。