将 Spring Cloud Sleuth 中的 traceId 添加到响应中

Ano*_*oop 9 spring-cloud spring-cloud-sleuth

我目前正在我们的项目中实施 Spring Cloud Sleuth。我需要将 traceId 添加到响应标头中。有没有办法做到这一点?

谢谢,
阿努普

小智 10

使用raj-kumar-bhakthavachalam示例但使用 springframework.cloud.sleuth 2.1.1 版,您可以使用以下步骤:

1.自动连线的brave.Tracer

@Autowired
Tracer tracer
Run Code Online (Sandbox Code Playgroud)

2、CurrentSpan返回TraceContext,得到traceIdString

tracer.currentSpan().context().traceIdString()
Run Code Online (Sandbox Code Playgroud)


Mar*_*zak 5

有 2 个选项。一种是提供自定义提取器 - http://cloud.spring.io/spring-cloud-sleuth/1.0.x/#_customizations(使用 1.2.0 版本会更容易)。另一种选择(更快)是创建您自己的过滤器,该过滤器将在执行 TraceFilter 后和关闭之前注册。您可以在那里运行tracer.getCurrentSpan()并向响应添加所需的任何信息。


Vik*_*kar 5

如果您使用球衣,一种方法是添加球衣响应过滤器并使用来自 spring sleuth 的 Trace(自动装配) org.springframework.cloud.sleuth.Tracer


公共类 TraceHeaderInterceptor 实现 ContainerResponseFilter {

    @覆盖
    公共无效过滤器(ContainerRequestContext requestContext,ContainerResponseContext responseContext)抛出IOException {
        val responseHeaders = responseContext.getHeaders();
        if (!responseHeaders.containsKey(TRACE_ID_HEADER_NAME)) {
            val traceId = tracer.getCurrentSpan().context().traceIdString();
            responseHeaders.add(TRACE_ID_HEADER_NAME,traceId);
        }
    }

    私有静态最终字符串TRACE_ID_HEADER_NAME =“X-B3-Traceid”;
    私有最终 Tracer 跟踪器;

    公共TraceHeaderInterceptor(跟踪器跟踪器){
        this.tracer = 跟踪器;
    }
}

我们将其添加到 API 网关中,以避免更改每个微服务


fzy*_*cjy 5

在 Spring Sleuth 3.0.x中,这里是来自官方文档的示例。

@Component
@Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1)
class MyFilter extends GenericFilterBean {

    private final Tracer tracer;

    MyFilter(Tracer tracer) {
        this.tracer = tracer;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        Span currentSpan = this.tracer.currentSpan();
        if (currentSpan == null) {
            chain.doFilter(request, response);
            return;
        }
        // for readability we're returning trace id in a hex form
        ((HttpServletResponse) response).addHeader("ZIPKIN-TRACE-ID",
                currentSpan.context().traceIdString());
        // we can also add some custom tags
        currentSpan.tag("custom", "tag");
        chain.doFilter(request, response);
    }

}
Run Code Online (Sandbox Code Playgroud)