You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Sleuth集成OpenTelemetry如何自定义TraceId(跨Pub/Sub场景)

实现Spring Sleuth集成OpenTelemetry复用TraceId的方案

可以实现,核心是通过OpenTelemetry的TraceContext和SpanBuilder手动构建上下文,复用指定的TraceId,具体实现如下:

1. 核心代码实现

在进程B中,读取进程A传递的TraceId后,用以下代码创建复用该TraceId的新Span:

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.SpanId;

private Span createNewSpan(String traceId) {
    // 校验TraceId格式(OpenTelemetry要求为32位十六进制字符串)
    if (!TraceId.isValid(traceId)) {
        throw new IllegalArgumentException("无效的TraceId格式");
    }
    // 生成新的SpanId
    String spanId = SpanId.generateRandomId();
    // 构建包含目标TraceId的上下文
    Context traceContext = Context.current()
            .with(Span.wrap(io.opentelemetry.api.trace.TraceContext.create(
                    traceId,
                    spanId,
                    io.opentelemetry.api.trace.TraceFlags.getSampled(),
                    io.opentelemetry.api.trace.TraceState.getDefault()
            )));
    // 获取Spring注入的Tracer实例
    Tracer tracer = // 通过@Autowired注入或从OpenTelemetry实例获取
    // 在指定上下文启动新Span
    try (Scope ignored = traceContext.makeCurrent()) {
        return tracer.spanBuilder("process-b-business-span")
                .setParent(traceContext)
                .startSpan();
    }
}

2. 关键注意事项

  • TraceId格式转换:OpenTelemetry的TraceId是32位十六进制字符串(对应16字节),和Brave的long类型TraceId不同。如果进程A使用的是Brave的64位TraceId,需要将其转换为补前导零的32位十六进制字符串后再传递。
  • Spring Sleuth适配:Spring Cloud Sleuth OTel底层基于OpenTelemetry,上述代码可直接在Sleuth OTel环境中使用,Tracer可通过@Autowired直接注入。
  • 消息传递适配:在GCP Pub/Sub场景中,需将进程A的TraceId作为消息属性传入,进程B读取该属性后传入上述方法即可复用链路ID。

参考文档核心内容翻译

如何将Sleuth与OpenTelemetry集成

  1. 依赖配置
    在pom.xml中添加Sleuth OTel starter依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth-otel</artifactId>
</dependency>
  1. 自动配置
    Sleuth OTel会自动初始化OpenTelemetry核心组件(Tracer、Exporter等),可通过配置文件调整参数,例如设置采样率:
spring.sleuth.otel.sampler.probability=1.0
  1. 上下文传播
    默认支持W3C Trace Context协议,在HTTP、标准消息队列场景中自动传播链路上下文;自定义消息场景(如GCP Pub/Sub)需手动提取和注入Trace属性。

内容的提问来源于stack exchange,提问作者suraj bahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:19:02