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

在响应中注入跟踪标头

法烨烨
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等都增加了我想避免的大量开销。 谢谢! 问题答案:

  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。