Spring Boot 3中如何跳过含敏感信息的外部GET调用链路追踪?
Spring Boot 3 排除特定外部GET调用的链路追踪方案
你之前用ServerRequestObservationContext找错了方向——这个上下文是处理服务端收到的请求的,而你要排除的是客户端发起的外部GET调用,得针对客户端的观测上下文来配置。
下面分两种常用客户端场景给出具体解决方案:
场景1:使用RestTemplate发起外部调用
需要自定义ObservationPredicate,关联到RestTemplate对应的客户端观测上下文ClientRequestObservationContext:
- 编写自定义Predicate:
import io.micrometer.observation.ObservationPredicate; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.web.client.RestTemplate; public class SensitiveRequestObservationPredicate implements ObservationPredicate { @Override public boolean test(String name, Context context) { // 判断是否为客户端请求上下文,同时匹配GET请求及敏感特征 if (context instanceof ClientRequestObservationContext clientContext) { String method = clientContext.getRequest().getMethod().name(); String uri = clientContext.getRequest().getURI().toString(); // 替换为你的敏感请求判断逻辑,比如包含特定路径/参数 return !("GET".equals(method) && uri.contains("/sensitive-data")); } // 其他观测场景正常追踪 return true; } }
- 配置RestTemplate时注册该Predicate:
import io.micrometer.observation.ObservationRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate sensitiveAwareRestTemplate(ObservationRegistry observationRegistry) { RestTemplate restTemplate = new RestTemplate(); // 将自定义Predicate注册到观测注册表 observationRegistry.observationConfig().observationPredicate(new SensitiveRequestObservationPredicate()); return restTemplate; } }
场景2:使用WebClient发起外部调用
核心逻辑和RestTemplate一致,同样针对ClientRequestObservationContext做过滤,只需将Predicate注册到ObservationRegistry:
复用上面的
SensitiveRequestObservationPredicate即可。配置WebClient:
import io.micrometer.observation.ObservationRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @Configuration public class WebClientConfig { @Bean public WebClient sensitiveAwareWebClient(ObservationRegistry observationRegistry) { observationRegistry.observationConfig().observationPredicate(new SensitiveRequestObservationPredicate()); return WebClient.builder().build(); } }
关键注意事项
- 区分服务端上下文与客户端上下文:排除外部请求必须用
ClientRequestObservationContext,而非处理入站请求的ServerRequestObservationContext。 - 敏感请求判断逻辑可灵活调整:比如检查URI中的敏感参数、特定路径,或是请求头标识等。
- 其他客户端工具(如OpenFeign)适配逻辑一致:找到对应客户端的观测上下文,编写Predicate过滤即可。
内容的提问来源于stack exchange,提问作者SANN3
相关产品推荐
相关产品推荐

