我目前正在我们的项目中实现 Spring Cloud Sleuth。我需要将 traceId 添加到响应标头中。有没有办法可以做到这一点?
谢谢,
阿努普
我目前正在我们的项目中实现 Spring Cloud Sleuth。我需要将 traceId 添加到响应标头中。有没有办法可以做到这一点?
谢谢,
阿努普
使用raj-kumar-bhakthavachalam示例但使用 springframework.cloud.sleuth 版本 2.1.1,您可以按照以下步骤使用:
1. Autowired勇敢.示踪剂
@Autowired
Tracer tracer
2.CurrentSpan返回TraceContext,获取traceIdString
tracer.currentSpan().context().traceIdString()
有 2 个选项。一种是提供您的自定义提取器 - http://cloud.spring.io/spring-cloud-sleuth/1.0.x/#_customizations(使用 1.2.0 版会容易得多)。另一种选择(更快)是创建您自己的过滤器,该过滤器将在执行 TraceFilter 之后和关闭之前注册。您可以在那里运行tracer.getCurrentSpan()
并将所需的任何信息添加到响应中。
如果您使用 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 网关,以避免不得不更改每个微服务
在 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);
}
}
您可以通过以下步骤获得它。
@Autowired
private SpanAccessor spanAccessor;
spanAccessor.getCurrentSpan().traceIdString() method to get the value.
希望能帮助到你。
使用 spring 5 和 sleuth 2 时,请使用以下示例。
https://github.com/robert07ravikumar/sleuth-sample
脚步 : -
使用以下代码创建一个 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);
}
@ServletComponentScan
在 spring boot 主类中添加注解。
从 sleuth 检索 traceId 的最简单方法是使用 MDC。使用这种方法: MDC.get("traceId") 将返回一个带有值的字符串,并且可以用它做任何你想做的事情。
关于将这些信息放在标题中,上面的答案已经清楚地表明了如何做。