簡體   English   中英

Spring Boot Jaeger 為給定的 TraceId 創建新的 Span

[英]Spring Boot Jaeger create new Span for given TraceId

所以我在玩 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 的請求。 然后應將這些信息作為附加跨度添加到已經完成的跟蹤中。

現在我的問題。 有沒有辦法創建一個跨度並將其添加到跟蹤中,並且只將跟蹤 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),我將在此處列出一種實現實際工作代碼的方法。

首先,您需要從 service1 的 span 中獲取 span-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-trace-id”關聯的值應該是context().toString()而不是context().toTraceId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM