Spring Boot 3:如何忽略Liveness/Readiness端点的Jaeger追踪
如何在Spring Boot 3中排除健康检查端点的Jaeger链路追踪记录
根据你使用的链路追踪依赖,有几种不同的实现方式,优先推荐配置化方案:
1. 基于Spring Boot原生OpenTelemetry配置(推荐)
如果你的Spring Boot 3应用使用默认的OpenTelemetry整合Jaeger,直接在配置文件中添加排除规则即可:
application.yml 配置
management: tracing: exclude: - "/context/actuator/health/liveness" - "/context/actuator/health/readiness"
application.properties 配置
management.tracing.exclude[0]=/context/actuator/health/liveness management.tracing.exclude[1]=/context/actuator/health/readiness
注意:如果你的应用没有自定义上下文路径
/context,直接写/actuator/health/liveness即可。
2. 基于Jaeger OpenTracing Starter配置
如果你的项目依赖的是io.opentracing.contrib:opentracing-spring-web-starter这类Jaeger原生整合包,可以通过正则匹配排除路径:
application.yml 配置
opentracing: spring: web: skip-pattern: "/context/actuator/health/.*"
这个正则会匹配所有/context/actuator/health/开头的端点,包括存活和就绪检查。
3. 自定义过滤器拦截健康检查请求
如果上述配置不生效,可以自定义一个Web过滤器,直接跳过健康检查请求的链路追踪:
import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; @Component public class HealthCheckTracingSkipFilter extends OncePerRequestFilter { private static final String[] EXCLUDED_PATHS = { "/context/actuator/health/liveness", "/context/actuator/health/readiness" }; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String requestUri = request.getRequestURI(); for (String excludedPath : EXCLUDED_PATHS) { if (requestUri.equals(excludedPath)) { filterChain.doFilter(request, response); return; } } filterChain.doFilter(request, response); } }
4. 自定义SpanProcessor过滤Span
如果需要更精细的控制,可以自定义SpanProcessor,在Span导出前过滤掉健康检查相关的记录:
import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanProcessor; import org.springframework.stereotype.Component; @Component public class HealthCheckSpanFilterProcessor implements SpanProcessor { private static final String[] EXCLUDED_OP_NAMES = { "GET /context/actuator/health/liveness", "GET /context/actuator/health/readiness" }; @Override public void onStart(Context parentContext, Span span) { String spanName = span.getName(); for (String excludedOp : EXCLUDED_OP_NAMES) { if (spanName.equals(excludedOp)) { span.setAttribute("otel.skip", true); } } } @Override public boolean isStartRequired() { return true; } @Override public void onEnd(SpanData spanData) { String spanName = spanData.getName(); for (String excludedOp : EXCLUDED_OP_NAMES) { if (spanName.equals(excludedOp)) { return; // 不导出该Span } } // 若包装了其他处理器,需调用delegate.onEnd(spanData) } @Override public boolean isEndRequired() { return true; } }
内容的提问来源于stack exchange,提问作者Y.A
相关产品推荐
相关产品推荐

