如何在Spring Boot 3.2中排除Actuator端点向Jaeger导出Span
解决Spring Boot 3.2中OtlpHttpSpanExporter导出Actuator端点Span的问题
下面提供几种实用方案来排除Actuator端点的Span导出:
方法一:通过配置属性快速排除
Spring Boot 3.2的Micrometer Tracing原生支持通过配置排除特定路径,直接在application.yml或application.properties中添加规则:
YAML格式
management: tracing: sampling: probability: 1.0 # 保持正常业务请求的采样率,按需调整 exclude: "/actuator/**" # 匹配所有Actuator端点路径
Properties格式
management.tracing.exclude=/actuator/** management.tracing.sampling.probability=1.0
如果只需要排除特定Actuator端点,可指定多个路径用逗号分隔:
management.tracing.exclude: "/actuator/health,/actuator/info"
方法二:自定义SpanProcessor实现复杂过滤
如果需要更灵活的过滤逻辑(比如根据请求方法、Header等判断),可以自定义SpanProcessor拦截并跳过Actuator相关Span:
import io.micrometer.tracing.Span; import io.micrometer.tracing.SpanProcessor; import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; public class ActuatorSpanExclusionProcessor implements SpanProcessor { private final SpanProcessor delegate; public ActuatorSpanExclusionProcessor(SpanProcessor delegate) { this.delegate = delegate; } @Override public void onStart(Span span) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); String path = request.getRequestURI(); if (path.startsWith("/actuator/")) { span.context().sampled(false); return; } } delegate.onStart(span); } @Override public void onEnd(Span span) { if (!span.context().sampled()) { return; } delegate.onEnd(span); } @Override public boolean isStartBatchSupported() { return delegate.isStartBatchSupported(); } @Override public void onStartBatch(Iterable<Span> spans) { delegate.onStartBatch(spans); } }
然后将该处理器注册到Spring容器:
import io.micrometer.tracing.SpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TracingConfig { @Bean public SpanProcessor actuatorSpanExclusionProcessor(SpanProcessor delegate) { return new ActuatorSpanExclusionProcessor(delegate); } }
方法三:自定义Brave Sampler(默认实现为Brave时适用)
如果底层使用Brave作为Tracing实现,可通过自定义Sampler过滤Actuator请求:
import brave.sampler.Sampler; import jakarta.servlet.http.HttpServletRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Configuration public class BraveSamplerConfig { @Bean public Sampler actuatorExcludingSampler() { return (traceId) -> { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); String path = request.getRequestURI(); return !path.startsWith("/actuator/"); } return true; }; } }
内容的提问来源于stack exchange,提问作者user2413412
相关产品推荐
相关产品推荐

