12

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

谢谢,
阿努普

4

7 回答 7

12

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

1. Autowired勇敢.示踪剂

@Autowired
Tracer tracer

2.CurrentSpan返回TraceContext,获取traceIdString

tracer.currentSpan().context().traceIdString()
于 2019-11-03T22:04:48.123 回答
5

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

于 2016-12-19T12:22:08.637 回答
5

如果您使用 jersey 一种方法是添加 jersey 响应过滤器并使用来自 spring sleuth 的 Trace (autowired) 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";
    私人最终示踪剂示踪剂;

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

我们将此添加到我们的 API 网关,以避免不得不更改每个微服务

于 2018-12-03T13:58:50.590 回答
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);
    }

}
于 2020-08-24T14:21:03.227 回答
1

您可以通过以下步骤获得它。

  1. 自动接线 SpanAccessor。
 @Autowired
private SpanAccessor spanAccessor;
  1. 并在需要的地方添加此行。
spanAccessor.getCurrentSpan().traceIdString() method to get the value.

希望能帮助到你。

于 2019-07-02T06:55:16.850 回答
1

使用 spring 5 和 sleuth 2 时,请使用以下示例。

https://github.com/robert07ravikumar/sleuth-sample

脚步 : -

  1. 使用以下代码创建一个 webfilter,并从跟踪器对象中添加跟踪器 ID。

            @Autowired
            Tracer tracer;
    
            @Override
            public void doFilter(ServletRequest request, ServletResponse response, 
              FilterChain chain) throws IOException, ServletException {
                HttpServletResponse httpServletResponse = (HttpServletResponse) response;
                httpServletResponse.setHeader("tracer-id", tracer.currentSpan().context().traceIdString());
                chain.doFilter(request, response);
            }
    
    
  2. @ServletComponentScan在 spring boot 主类中添加注解。

于 2019-12-02T16:41:15.147 回答
0

从 sleuth 检索 traceId 的最简单方法是使用 MDC。使用这种方法: MDC.get("traceId") 将返回一个带有值的字符串,并且可以用它做任何你想做的事情。

关于将这些信息放在标题中,上面的答案已经清楚地表明了如何做。

于 2021-02-10T17:28:05.240 回答