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

时间:2016-12-19 12:16:52

标签: spring-cloud spring-cloud-sleuth

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

谢谢,
Anoop

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

1. Autowired brave.Tracer

@Autowired
Tracer tracer

2. CurrentSpan返回TraceContext,获取traceIdString

tracer.currentSpan().context().traceIdString()

答案 2 :(得分:1)

在春季 Sleuth 3.0.x 中,以下是the official doc中的示例。

@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);
    }

}

答案 3 :(得分:0)

如果您使用球衣 一种方法是添加球衣响应过滤器 并使用弹簧侦听器中的Trace(自动接线) org.springframework.cloud.sleuth.Tracer



public class TraceHeaderInterceptor implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        val responseHeaders = responseContext.getHeaders();
        if (!responseHeaders.containsKey(TRACE_ID_HEADER_NAME)) {
            val traceId = tracer.getCurrentSpan().traceIdString();
            responseHeaders.add(TRACE_ID_HEADER_NAME, traceId);
        }
    }

    private static final String TRACE_ID_HEADER_NAME = "X-B3-Traceid";
    private final Tracer tracer;

    public TraceHeaderInterceptor(Tracer tracer) {
        this.tracer = tracer;
    }
}

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

答案 4 :(得分:0)

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

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

希望有帮助。

答案 5 :(得分:0)

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

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

步骤:-

  1. 使用以下代码创建一个webfilter,并从tracer对象添加tracer id。

    @自动连线         示踪剂示踪剂;

        @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主类中。

答案 6 :(得分:0)

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

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