在 Java 中使用 trace-id 和 span-id 创建一个 open-telemetry 跨度
Create an open-telemetry span using trace-id and span-id in Java
我正在使用 open-telemetry 来跟踪我的应用程序,并且在我的分布式系统中有一些微服务和 Kafka 代理。我正在使用 Java/spring-boot 并在 HTTP Headers 中发送跟踪 parent(例如:00-8652a752089f33e2659dff28d683a18f-7359b90f4355cfd9-01)。
我在服务器(Kafka 消费者)中尝试了以下代码,但这总是会创建一个具有不同跟踪 ID 的跨度。但我需要嵌套到 parent 跟踪的跨度。
@GetMapping(value = "/second")
public String sencondTest(@RequestHeader(value = "traceparent") String traceparent){
try {
Tracer tracer = openTelemetry.getTracer("cloud.events.second");
TextMapGetter<ExtractModel> getter = new TextMapGetter<>() {
@Override
public String get(ExtractModel carrier, String key) {
if (carrier.getHeaders().containsKey(key)) {
return carrier.getHeaders().get(key);
}
return null;
}
@Override
public Iterable<String> keys(ExtractModel carrier) {
return carrier.getHeaders().keySet();
}
};
ExtractModel model = new ExtractModel();
model.addHeader("traceparent", traceparent);
Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator()
.extract(Context.current(), model, getter);
try (Scope scope = extractedContext.makeCurrent()) {
// Automatically use the extracted SpanContext as parent.
Span serverSpan = tracer.spanBuilder("CloudEvents Server")
.setSpanKind(SpanKind.SERVER)
.startSpan();
try {
Thread.sleep(150);
} finally {
serverSpan.end();
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "Server Received!";
}
我读了 documentation 但没有帮助。有什么办法可以做到这一点?任何建议都会有所帮助。
找到解决方案。当我们配置 OpenTelemetrySdk 时需要在 Context Propagators 中设置 W3CTraceContextPropagator。
// Use W3C Propagator(to extract span from HTTP headers) since we use the W3C specifications
TextMapPropagator textMapPropagator = W3CTraceContextPropagator.getInstance();
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setPropagators(ContextPropagators.create(textMapPropagator))
.buildAndRegisterGlobal();
为未来的用户发布了解决方案。;-)
我正在使用 open-telemetry 来跟踪我的应用程序,并且在我的分布式系统中有一些微服务和 Kafka 代理。我正在使用 Java/spring-boot 并在 HTTP Headers 中发送跟踪 parent(例如:00-8652a752089f33e2659dff28d683a18f-7359b90f4355cfd9-01)。
我在服务器(Kafka 消费者)中尝试了以下代码,但这总是会创建一个具有不同跟踪 ID 的跨度。但我需要嵌套到 parent 跟踪的跨度。
@GetMapping(value = "/second")
public String sencondTest(@RequestHeader(value = "traceparent") String traceparent){
try {
Tracer tracer = openTelemetry.getTracer("cloud.events.second");
TextMapGetter<ExtractModel> getter = new TextMapGetter<>() {
@Override
public String get(ExtractModel carrier, String key) {
if (carrier.getHeaders().containsKey(key)) {
return carrier.getHeaders().get(key);
}
return null;
}
@Override
public Iterable<String> keys(ExtractModel carrier) {
return carrier.getHeaders().keySet();
}
};
ExtractModel model = new ExtractModel();
model.addHeader("traceparent", traceparent);
Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator()
.extract(Context.current(), model, getter);
try (Scope scope = extractedContext.makeCurrent()) {
// Automatically use the extracted SpanContext as parent.
Span serverSpan = tracer.spanBuilder("CloudEvents Server")
.setSpanKind(SpanKind.SERVER)
.startSpan();
try {
Thread.sleep(150);
} finally {
serverSpan.end();
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "Server Received!";
}
我读了 documentation 但没有帮助。有什么办法可以做到这一点?任何建议都会有所帮助。
找到解决方案。当我们配置 OpenTelemetrySdk 时需要在 Context Propagators 中设置 W3CTraceContextPropagator。
// Use W3C Propagator(to extract span from HTTP headers) since we use the W3C specifications
TextMapPropagator textMapPropagator = W3CTraceContextPropagator.getInstance();
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setPropagators(ContextPropagators.create(textMapPropagator))
.buildAndRegisterGlobal();
为未来的用户发布了解决方案。;-)