如何解决在响应中注入跟踪标头
我已将 Sleuth 集成添加到应用程序中。现在日志显示了 traceId 和 spanId。
INFO [AppName,5dd62861a751e1b0,true]
我可以发送带有开放跟踪标头的 HTTP 请求
X-B3-TraceId
X-B3-SpanId
跟踪器使用的,我可以在日志中看到。 但是我想在响应中返回它们。
我有过滤器,我想在响应中添加这些标头
public class RequestResponseFilter implements Filter {
private final Tracer tracer;
private final Injector<HttpServletResponse> tracingInjector;
public RequestResponseFilter(final Tracing tracing,final Tracer tracer) {
this.tracer = tracer;
this.tracingInjector = tracing.propagation().injector(HttpServletResponse::addHeader);
}
@Override
public void doFilter(final ServletRequest request,final ServletResponse response,final FilterChain chain) throws IOException,ServletException {
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
....
// inject tracing header
Span currentSpan = tracer.currentSpan();
tracingInjector.inject(currentSpan.context(),httpServletResponse);
chain.doFilter(httpServletRequest,httpServletResponse);
}
}
但它们并没有以我预期的方式添加。在回复中我看到
b3: 5dd62861a751e1b0,5dd62861a751e1b0-1
怎么了?
解决方法
如果您查看文档,您将如何自定义 HTTP 服务器跨度 - https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/howto.html#how-to-cutomize-http-server-spans 因为您可以访问 HttpServletResponse
和 TraceContext
,您可以检索跟踪 ID / span id 并将其放入响应中。
侦探 3.x
@Configuration(proxyBeanMethods = false)
public static class ServerParserConfiguration {
@Bean(name = HttpServerRequestParser.NAME)
HttpRequestParser myHttpRequestParser() {
return (request,context,span) -> {
// Span customization
span.tag("ServerRequest","Tag");
Object unwrap = request.unwrap();
if (unwrap instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest) unwrap;
// Span customization
span.tag("ServerRequestServlet",req.getMethod());
}
};
}
@Bean(name = HttpServerResponseParser.NAME)
HttpResponseParser myHttpResponseParser() {
return (response,span) -> {
// Span customization
span.tag("ServerResponse","Tag");
Object unwrap = response.unwrap();
if (unwrap instanceof HttpServletResponse) {
HttpServletResponse resp = (HttpServletResponse) unwrap;
// Span customization
span.tag("ServerResponseServlet",String.valueOf(resp.getStatus()));
}
};
}
}
Sleuth 2.x(几乎完全相同)-https://docs.spring.io/spring-cloud-sleuth/docs/2.2.x/reference/html/#data-policy
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。