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

如何为Spring Cloud Sleuth实现自定义传输以在Dapr上传播W3C链路追踪信息

Spring Cloud Sleuth 与 Dapr 链路传播解决方案

你可以通过手动提取Sleuth链路元数据并注入Dapr请求的方式实现W3C标准链路传播,无需依赖Spring托管的传输链路,具体步骤如下:

1. 注入Sleuth核心依赖组件

在Spring托管的Bean中注入两个核心对象,你配置完W3C传播规则后这两个对象会自动适配W3C规范:

  • Tracer:用于获取当前请求上下文的活跃Span
  • Propagation.Factory:用于生成符合配置规范的链路传播字段

注入示例:

import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.propagation.Propagation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class DaprTraceHandler {
    @Autowired
    private Tracer tracer;
    @Autowired
    private Propagation.Factory propagationFactory;
}

2. 提取W3C标准链路元数据

通过上述组件提取当前链路的传播头,核心为traceparent、tracestate两个W3C规定字段:

public Map<String, String> getW3cTraceHeaders() {
    // 获取当前活跃Span,无活跃Span时可按需创建新Span
    Span currentSpan = tracer.currentSpan();
    if (currentSpan == null) {
        currentSpan = tracer.nextSpan().start();
    }

    // 生成W3C标准链路头
    Map<String, String> w3cTraceHeaders = new HashMap<>();
    propagationFactory.create().injector((carrier, key, value) -> {
        if (carrier != null && key != null && value != null) {
            carrier.put(key, value);
        }
    }).inject(currentSpan.context(), w3cTraceHeaders);
    return w3cTraceHeaders;
}

3. 注入Dapr请求完成传播

根据你使用的通信协议做对应处理即可:

  • HTTP协议场景:调用Dapr HTTP客户端时,将生成的w3cTraceHeaders全部添加到请求头中,Dapr Sidecar会自动识别并完成跨进程链路传播
  • gRPC协议场景:调用Dapr gRPC客户端时,将w3cTraceHeaders中的键值对全部写入gRPC请求的Metadata中即可,注意gRPC元数据的键名需统一转为小写

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:07