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

在响应中注入跟踪标头

法烨烨
2023-03-14
INFO [AppName,5dd62861a751e1b0,5dd62861a751e1b0,true]
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

怎么啦?

共有1个答案

颜永怡
2023-03-14

如果您查看它编写的如何自定义HTTP服务器的文档,span-https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/howto.html#how-to-cutomize-http-server-spans,因为您可以访问HttpServletResponseTraceContext,您可以检索跟踪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, context, 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

 类似资料:
  • 我应该创建自己的自定义属性,并将它们记录在insequence和Outsequence中吗?

  • 有没有更好的方法来追踪电话的时间?

  • 问题内容: 我的Python库刚刚将其主模块名称从更改为。对于向后兼容,仍然存在,但是将其导入会引发一些警告。现在,似乎仍然有一些示例程序从旧模块导入,但不是直接导入。 我想找到错误的陈述。有没有什么工具可以让我跟踪导入并找到罪魁祸首而无需费力看所有代码? 问题答案: 使用以下命令启动python解释器: 然后只是grep您的旧模块。

  • 问题内容: 是否有一种简单的方法(即:不使用代理)来访问对使用JAX-WS参考实现(JDK 1.5及更高版本中包含的参考发布)发布的Web服务的原始请求/响应XML的访问?我需要做的是通过代码做到这一点。仅通过巧妙的日志记录配置将其记录到文件中就可以了,但足够了。 我知道可能存在其他更复杂和完整的框架,但是我想使其尽可能地简单,而axis,cxf等都增加了我想避免的大量开销。 谢谢! 问题答案:

  • 使用指南 - 数据报告 - JSApi - 单页应用跟踪 一、概览 单页应用(SPA)是指在首次加载网页时加载浏览整个网站所需全部资源的网络应用或网站,所有的操作都在这张页面上完成,都由JavaScript来控制。 在传统网站上运行百度统计的跟踪代码hm.js没有任何问题,因为每次加载页面都会运行一次。但是对于SPA来说,页面的更新是通过JavaScript更新页面内容,而不是把整个页面重新加载一