如何指定Sleuth结合Zipkin需要进行链路追踪的路径?
Spring Cloud Sleuth 指定需追踪端点的配置方案
核心实现逻辑
Spring Cloud Sleuth 默认会对所有接入的请求端点进行链路追踪,官方没有直接提供「仅追踪指定端点」的配置属性,但可以通过组合采样器自定义 + 请求过滤规则的方式实现需求,常用的实现方案有两种:
方案1:自定义Sampler采样规则
你可以通过实现SamplerFunction<HttpServletRequest>接口,自定义请求的采样逻辑,仅让符合路径匹配规则的请求被追踪:
import org.springframework.cloud.sleuth.http.HttpRequestSampler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; @Configuration public class SleuthTraceConfig { // 配置需要追踪的端点路径列表 private static final List<String> ALLOWED_TRACE_PATHS = List.of("/api/order/**", "/api/pay/**"); @Bean public HttpRequestSampler httpRequestSampler() { return request -> { String requestPath = request.getUri().getPath(); // 匹配指定路径的请求才会被采样追踪 return ALLOWED_TRACE_PATHS.stream().anyMatch(pattern -> org.springframework.util.AntPathMatcher.match(pattern, requestPath) ); }; } }
方案2:配合sleuth.web.additional-skip-pattern反向实现
如果需要追踪的端点数量远少于不需要追踪的端点,也可以先通过正则表达式将所有请求默认设置为跳过,再把不需要跳过的(即需要追踪的)端点排除在skip规则之外:
配置文件(以application.yml为例):
spring: sleuth: web: # 正则规则:所有请求默认跳过,仅/api/user/、/api/product/开头的请求不跳过 additional-skip-pattern: ^(?!(/api/user/|/api/product/)).*$
注意该方案的正则规则需要根据你的实际端点路径调整,
?!为正则的负向先行断言,匹配不符合括号内路径的所有请求,将这类请求全部加入跳过追踪列表,反向实现仅追踪指定端点的效果。
注意事项
- 两种方案可以独立使用也可以组合使用,自定义采样器的优先级高于配置文件的skip规则
- 如果使用的是Spring Cloud Sleuth 3.x以上版本,部分配置属性前缀和接口类名和2.x版本存在差异,需对应调整类路径引用
内容的提问来源于stack exchange,提问作者Miguel Rodrigues
相关产品推荐
相关产品推荐

