【问题标题】:Adding the traceId from Spring Cloud Sleuth to response将来自 Spring Cloud Sleuth 的 traceId 添加到响应
【发布时间】:2017-05-04 11:51:13
【问题描述】:

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

谢谢,
阿努普

【问题讨论】:

标签: spring-cloud spring-cloud-sleuth


【解决方案1】:

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

1. 自动布线的勇敢.Tracer

@Autowired
Tracer tracer

2.CurrentSpan返回TraceContext,获取traceIdString

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢@marcin-grzejszczak。我采用了第二种方法。
    • 嗨!对此有任何可行的解决方案吗?你能提供一些关于如何做的代码sn-ps吗?
    • @SergeiSirik blog.michaelstrasser.com/2017/07/using-sleuth-trace-id(tracer.getCurrentSpan().traceIdString() 应该可以帮助您在需要的地方使用跟踪 ID)。
    • 在 Sleuth 2.0 中获取 traceId 的方法签名已更改为:tracer.currentSpan().context().traceId();
    • @MasterDrools for me Trace id 是 4ed6e46b52f869f7 但 tracer.currentSpan().context().traceId() 返回 5680979129579104759 有什么线索吗?
    【解决方案3】:

    如果您使用的是运动衫 一种方法是添加球衣响应过滤器 并使用来自 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 网关,以避免不得不更改每个微服务

    【讨论】:

      【解决方案4】:

      在 Spring 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);
          }
      
      }
      

      【讨论】:

      • 这不再起作用了。 Spring Boot 2.5.0 中不存在类 TraceWebServletAutoConfiguration 现在有人知道最好的方法吗?
      • @MunishChandel 如何查看 TRACING_FILTER_ORDER 的值并手动将其放在那里
      【解决方案5】:

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

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

      希望对你有帮助。

      【讨论】:

        【解决方案6】:

        当使用 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. 在spring boot主类中添加注解@ServletComponentScan

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 2019-12-17
            • 2021-09-26
            • 1970-01-01
            • 2021-07-28
            • 2021-06-07
            • 1970-01-01
            • 1970-01-01
            • 2021-04-27
            • 2017-08-03
            相关资源
            最近更新 更多