所以我正在尝试使用Jaeger和OpenTracing来跟踪Spring Boot微服务之间的请求。我已经设置了所有必要的配置,并添加了依赖项:
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-web-starter</artifactId>
<version>2.0.3</version>
</dependency>
到目前为止一切都很好。我在Jaeger UI中看到了所有的痕迹和跨度,没问题。
但现在我面临的挑战是为特定的轨迹添加新的跨度,这已经完成了。这样想吧。客户端调用其中一个服务并开始跟踪。工作完成后,我在Jaeger UI中看到了痕迹。但是现在调用客户端想要向特定的跟踪添加一些额外的跟踪数据。就像跟踪来自其他服务的信息一样,这些信息不在我的微服务范围内。我添加了一个过滤器,这样我就可以提取跟踪id并将其发送到客户端。现在,客户端执行一个包含附加跟踪信息和跟踪id的请求。然后,这些信息a应该作为附加跨度添加到已经完成的跟踪中。
现在来回答我的问题。有没有一种方法可以创建一个跨度并将其添加到只将跟踪id作为字符串的跟踪中?
我试过Zipkin,我可以做:
Span span = new SpanBuilder()
.name(someName)
.traceId(traceId)
.parentId(traceId)
.id(someId)
.kind(Kind.CLIENT)
.build()
然后,可以通过向9411端口上的zipkin服务器发出POST请求来添加该跨度,该服务器神奇地将该跨度添加到具有给定id的跟踪中。
使用OpenTracing我可以做:
Span span = tracer.buildSpan(someName)
.asChildOf(**traceSpan**)
.withStartTimestamp(someTime)
.ignoreActiveSpan()
.start();
不幸的是,这种方法需要跨度形式的跟踪来创建新的跨度作为该跟踪的子级。鉴于我只能提供跟踪id,我不知道如何获得该跟踪所需的跨度。我真的需要调用我的Jaeger查询来获得所需的跟踪跨度吗?或者还有其他我没有想到的方法吗?
我真的很想在这方面得到一些帮助。
干杯!
您需要将跟踪id从一台服务器发送到另一台服务器。我将在这里列出一种实现代码的方法,假设您已经在服务1中创建了一个原始跨度并创建了跟踪程序实例(JaegerTracer(,那么该代码实际上是有效的。
首先,您需要从服务1:的跨度中获取跨度id
JaegerSpan span = tracer.buildSpan("service1")
String spanId = span.context().toTraceId()
现在,您可以将此字符串(spanId(传播到其他服务。例如:如果您使用的是http://post或kafka,则需要遵循一些协议,例如:w3c。但从根本上讲
import io.jaegertracing.internal.JaegerSpan;
import io.jaegertracing.internal.JaegerSpanContext;
import io.jaegertracing.internal.propagation.TextMapCodec;
import io.jaegertracing.internal.propagation.TextMapCodec.Builder;
//...
// assuming you've extracted your trace-id as string from your messaging system
// kafka header, http header, grpc metadata, wherever...
TextMap carrier = new TextMapAdapter(Map.of("uber-trace-id", traceId));
TextMapCodec codec = New Builder().build();
// I guess this line answer your question (get spanContext from trace-id)
JaegerSpanContext sc = codec.extract(carrier);
JaegerSpan sp = tracer.buildSpan("service2").asChildOf(sc).start();
就像@Totalys所说的,但需要对与键关联的值进行一些修改"uber跟踪id";应该是context().toString()
而不是context().toTraceId