如何通过断点获取Reactor Netty客户端请求的Sleuth HTTP头
WebClient原始线程断点方案(SSL加密前获取HTTP头)
针对你无法修改代码、需要在原始请求线程获取包含Sleuth Span ID在内的HTTP头的需求,推荐以下两个断点位置:
断点位置1:
org.springframework.web.reactive.function.client.ExchangeFunctions$DefaultExchangeFunction.exchange
这是WebClient请求交换的核心入口方法,完全在你调用.block()的原始线程执行。此时Sleuth已完成Span头注入,所有HTTP头组装完毕,且尚未进入Reactor Netty的异步IO流程,更未触发SSL加密。
脚本化断点示例(以Groovy为例,适用于IDEA等调试工具):// 获取请求对象,提取头信息 def clientRequest = args[0] def headers = clientRequest.headers() println("请求头信息:" + headers) println("Span ID:" + headers.getFirst("X-B3-SpanId")) return false // 仅打印信息,不暂停线程断点位置2:
reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange
该方法在请求即将发送前触发,同步调用.block()时会在原始线程执行。可直接拿到HttpClientRequest对象,此时SSL握手尚未启动,能完整获取所有请求头。
脚本化断点示例:def state = args[1] if (state instanceof reactor.netty.http.client.HttpClientRequest) { def request = (reactor.netty.http.client.HttpClientRequest) state def headers = request.requestHeaders() println("SSL加密前请求头:" + headers) println("Trace ID:" + headers.get("X-B3-TraceId")) } return false
验证方式:触发WebClient请求后,查看断点命中的线程名称,会与调用.block()的线程完全一致,不会混入其他异步请求的线程。
内容的提问来源于stack exchange,提问作者Dave Griffiths
相关产品推荐
相关产品推荐

