Spring Cloud Sleuth+Gateway:仅日志TraceId/SpanId不传递请求头
解决Spring Cloud Gateway不传递X-B3追踪字段到下游的问题
一、优先通过配置项实现
Spring Cloud Sleuth自带控制追踪头传播的配置开关,直接在配置文件中添加以下配置即可实现需求:
YAML格式(application.yml)
spring: sleuth: propagation: enabled: false baggage: remote-fields: "" remote-fields-prefix: ""
Properties格式(application.properties)
spring.sleuth.propagation.enabled=false spring.sleuth.baggage.remote-fields= spring.sleuth.baggage.remote-fields-prefix=
配置说明:
spring.sleuth.propagation.enabled=false:关闭跨服务的追踪上下文传播,直接阻止X-B3-*系列头(如X-B3-TraceId、X-B3-SpanId等)被添加到下游请求中。- 清空
remote-fields和remote-fields-prefix:防止自定义的追踪 baggage 字段被传递到下游。
配置后,Gateway内部仍会生成TraceId和SpanId用于日志记录,但不会将这类字段通过HTTP头下发给下游服务。
二、配置不生效时,自定义过滤器处理
如果上述配置未达到预期,可以自定义GatewayFilter强制移除追踪相关请求头:
import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; @Component public class RemoveTraceHeadersFilter extends AbstractGatewayFilterFactory<RemoveTraceHeadersFilter.Config> { private static final String[] TRACE_RELATED_HEADERS = { "X-B3-TraceId", "X-B3-SpanId", "X-B3-ParentSpanId", "X-B3-Sampled", "X-B3-Flags", "baggage" }; public RemoveTraceHeadersFilter() { super(Config.class); } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { ServerWebExchange modifiedExchange = exchange.mutate() .request(request -> { // 遍历移除所有追踪相关请求头 for (String header : TRACE_RELATED_HEADERS) { request.headers(headers -> headers.remove(header)); } }) .build(); return chain.filter(modifiedExchange); }; } public static class Config { // 可在此扩展自定义配置参数,比如新增需要移除的额外头字段 } }
随后在路由配置中引用该过滤器:
spring: cloud: gateway: routes: - id: your_route_id uri: lb://your-target-service predicates: - Path=/your/path/** filters: - RemoveTraceHeadersFilter
这种方式能强制清除所有发往下游请求中的追踪头,同时不影响Gateway内部的TraceId、SpanId日志记录。
内容的提问来源于stack exchange,提问作者obe6
相关产品推荐
相关产品推荐

