当前位置: 首页 > 知识库问答 >
问题:

将来自Spring Cloud Sleuth的traceId添加到响应

虞博涛
2023-03-14

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

谢谢,
Anoop

共有3个答案

慕祯
2023-03-14

如果您正在使用jersey,一种方法是添加jersey响应过滤器,并使用spring sleuth的跟踪(自动连线)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().context().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网关以避免更改每个微服务

卫景明
2023-03-14

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

宰坚
2023-03-14

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

1、自动连线勇敢追踪器

@Autowired
Tracer tracer

2. TrentSpan返回TraceContext,获取traceIdString

tracer.currentSpan().context().traceIdString()
 类似资料:
  • 问题内容: 每当我对应用程序中的其余控制器发出请求以允许跨源资源共享时,我想将此标头添加到对客户端的每个响应中,目前我正在手动添加每个这样的方法的标头 它的工作,但非常令人沮丧。我在Spring文档中找到了webContentInterceptor,它允许我们修改每个响应的标头 但是当我使用它时,它会引发错误,即找不到名称为Access-Control-Allow-Origin的属性,因此还有其他

  • 我通过使用承载令牌实现了对SpringBoot API的授权,当登录成功时,该令牌被添加到响应的“授权”头中,然后需要通过React项目的登录获取方法读取该令牌,并添加到后续请求的“授权”头中。 不幸的是,虽然我被告知这是不可能使用Fetch,所以我现在试图重构我的登录功能,以便它返回响应正文中的令牌,而不是标题。 我不知道如何做到这一点,目前没有返回JSON正文对象,只有标头,我将不得不更改我的

  • 我有一个应用程序环境,我们使用Instana代理来监控和跟踪应用程序。为了能够将应用程序日志与跟踪相关联,我想将Instana中的traceId添加到我们的日志中。现在我尝试添加sping-cloud d-sleuth,我在日志中看到了一些traceId和spanIds,但这些不是Instana的。跟踪和范围包含在带有和的请求的标头中。但是我看不出有什么方法可以将这些标头注入sping-cloud

  • 我非常确定“Expires”是有效的HTTP响应头类型。但是当我尝试在代码中设置它时:(这是在ActionFilter.OnActionExecuted方法中) 我最后有一个例外: InvalidOperationException:错误使用的标头名称。确保请求头与HttpRequestMessage一起使用,响应头与HttpResponseMessage一起使用,内容头与HttpContent对

  • 我通过Primefaces AJAX调用从SQL操作中获得了一些未捕获异常。有趣的是,这个未捕获的异常在Firebug的JavaScript secion上显示为error: 并在server.log上使用所有stacktrace和所有内容。 但如果不将用户重定向到一个单独的错误页面(并丢失所有输入数据),我就无法引起用户的注意。 正确的处理方法是创建验证器,我会这样做,但总有可能出现没有意识到的

  • 问题内容: 我正在尝试向一些Web服务调用中添加一些响应标头。我使用CXF 2.1.2和JAX- RS编写了Web服务。我需要返回一个对象,我还想向Response添加一些标头。 在不返回javax.ws.rs.core.Response对象的情况下 ,如何在响应中添加标头并仍然返回javabean? 问题答案: 您可以通过Web服务中的@Context注释注入对实际HttpServletResp