如何用Micrometer Tracing埋点Apache HttpClient?请求未加追踪头
问题原因与解决方案
你当前使用的MicrometerHttpClientInterceptor仅负责收集HTTP客户端的指标数据(如请求次数、响应耗时等),不具备分布式追踪上下文传递的能力,因此不会自动添加traceparent这类追踪头。以下是两种可行的解决方案:
方案一:基于Micrometer Tracing实现追踪头传递
Micrometer Tracing是专门用于分布式追踪的模块,它可以和Apache HttpClient结合,自动为请求添加追踪头并传递上下文。
1. 引入必要依赖
如果使用Maven,添加以下依赖(版本请使用对应Spring Boot版本适配的稳定版):
<!-- Micrometer Tracing核心依赖 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <!-- 桥接Brave作为追踪实现 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> <!-- Brave的Apache HttpClient适配 --> <dependency> <groupId>io.zipkin.reporter2</groupId> <artifactId>zipkin-reporter-brave</artifactId> </dependency>
2. 配置带追踪的HttpClient
使用Brave提供的TracingHttpClientBuilder构建客户端,它会自动添加追踪拦截器:
import brave.http.HttpTracing; import brave.apache.http.TracingHttpClientBuilder; import org.apache.http.client.HttpClient; // Spring环境下HttpTracing会被自动注入,非Spring环境可手动构建Tracing实例 public HttpClient createTracedHttpClient(HttpTracing httpTracing) { // 构建带追踪的HttpClient return TracingHttpClientBuilder.create(httpTracing) // 若需要保留原有指标收集,可继续添加Micrometer指标拦截器 .addInterceptorFirst(new MicrometerHttpClientInterceptor( new SimpleMeterRegistry(), x -> x.getRequestLine().getUri(), Tags.empty(), false ).getRequestInterceptor()) .addInterceptorLast(new MicrometerHttpClientInterceptor( new SimpleMeterRegistry(), x -> x.getRequestLine().getUri(), Tags.empty(), false ).getResponseInterceptor()) .build(); }
方案二:单独使用Brave的HttpClient拦截器
如果你更倾向于原生Brave的实现,也可以直接使用Brave的TracingHttpClientInterceptor,效果和上述方案一致:
import brave.Tracing; import brave.apache.http.TracingHttpClientInterceptor; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClients; public HttpClient createBraveTracedHttpClient(Tracing tracing) { TracingHttpClientInterceptor interceptor = TracingHttpClientInterceptor.create(tracing); return HttpClients.custom() .addInterceptorFirst(interceptor) // 保留指标拦截器 .addInterceptorFirst(interceptorProvider.getRequestInterceptor()) .addInterceptorLast(interceptorProvider.getResponseInterceptor()) .build(); }
关键提示
- 指标收集和分布式追踪是两个独立的功能:
MicrometerHttpClientInterceptor负责指标,追踪头传递需要依赖Micrometer Tracing或Brave的拦截器。 - Spring Boot环境下,只要引入上述依赖,
HttpTracing和Tracing实例会被自动配置,无需手动初始化。
内容的提问来源于stack exchange,提问作者Arun Gowda
相关产品推荐
相关产品推荐

