我目前正在项目中实施Spring Cloud Sleuth。我需要将traceId添加到响应头。有没有办法可以实现这一目标?
谢谢,
Anoop
答案 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)
您可以通过以下步骤获取它。
@Autowired
private SpanAccessor spanAccessor;
spanAccessor.getCurrentSpan().traceIdString() method to get the value.
希望有帮助。
答案 5 :(得分:0)
使用弹簧5和sleuth 2时,请使用以下示例。
https://github.com/robert07ravikumar/sleuth-sample
步骤:-
使用以下代码创建一个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);
}
将注释@ServletComponentScan添加到spring boot主类中。
答案 6 :(得分:0)
从侦探检索 traceId 的最简单方法是使用 MDC。 使用这个方法: MDC.get("traceId") 将返回一个带有值的字符串,并且可以用它做任何你想做的事情。
关于将这些信息放在标题中,上面的答案已经清楚地说明了如何做。