如何配置AWS X-Ray不追踪健康检查GET端点?
如何排除AWS X-Ray对健康检查端点的监控?
我有一个使用AWS X-Ray的Spring应用,其中/sqs/health这个GET健康检查端点不需要被X-Ray监控。原有的X-Ray配置如下:
package com.poc.clientserviceapi.config; import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.AWSXRayRecorderBuilder; import com.amazonaws.xray.jakarta.servlet.AWSXRayServletFilter; import com.amazonaws.xray.strategy.jakarta.SegmentNamingStrategy; import com.amazonaws.xray.strategy.sampling.LocalizedSamplingStrategy; import jakarta.servlet.Filter; import com.amazonaws.xray.slf4j.SLF4JSegmentListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.net.URL; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder .standard().withSegmentListener(new SLF4JSegmentListener("CUSTOM-PREFIX")); URL ruleFile = WebConfig.class.getResource("/sampling-rules.json"); builder.withSamplingStrategy(new LocalizedSamplingStrategy(ruleFile)); AWSXRay.setGlobalRecorder(builder.build()); return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic("Scorekeep")); } }
我尝试自定义Filter来跳过该端点,但遇到了错误:
java.lang.RuntimeException: The AWSXRayServletFilter requires either a fixedName init-param or an instance of SegmentNamingStrategy. Add an init-param tag to the AWSXRayServletFilter's declaration in web.xml, using param-name: 'fixedName'. Alternatively, pass an instance of SegmentNamingStrategy to the AWSXRayServletFilter constructor.
错误原因
自定义Filter中创建AWSXRayServletFilter实例时使用了无参构造函数,但X-Ray的ServletFilter必须指定SegmentNamingStrategy或者通过init参数设置固定名称,否则会抛出上述异常。
解决方案
方案一:修复自定义Filter的实现
修改自定义Filter,预先初始化配置好的AWSXRayServletFilter实例,避免每次请求都创建新实例,同时传入正确的SegmentNamingStrategy:
package com.poc.clientserviceapi.config; import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.AWSXRayRecorderBuilder; import com.amazonaws.xray.jakarta.servlet.AWSXRayServletFilter; import com.amazonaws.xray.strategy.jakarta.SegmentNamingStrategy; import com.amazonaws.xray.strategy.sampling.LocalizedSamplingStrategy; import jakarta.servlet.*; import com.amazonaws.xray.slf4j.SLF4JSegmentListener; import jakarta.servlet.http.HttpServletRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; import java.net.URL; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder .standard().withSegmentListener(new SLF4JSegmentListener("CUSTOM-PREFIX")); URL ruleFile = WebConfig.class.getResource("/sampling-rules.json"); builder.withSamplingStrategy(new LocalizedSamplingStrategy(ruleFile)); AWSXRay.setGlobalRecorder(builder.build()); // 传入SegmentNamingStrategy初始化自定义Filter return new MyAWSXRayServletFilter(SegmentNamingStrategy.dynamic("Scorekeep")); } public static class MyAWSXRayServletFilter implements Filter { private final String ignoredEndpointPath = "/sqs/health"; private final AWSXRayServletFilter xRayFilter; // 通过构造函数传入配置好的SegmentNamingStrategy public MyAWSXRayServletFilter(SegmentNamingStrategy segmentNamingStrategy) { this.xRayFilter = new AWSXRayServletFilter(segmentNamingStrategy); } @Override public void init(FilterConfig filterConfig) throws ServletException { xRayFilter.init(filterConfig); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; // 跳过健康检查端点的X-Ray监控 if (!request.getRequestURI().equals(ignoredEndpointPath)) { xRayFilter.doFilter(servletRequest, servletResponse, filterChain); } else { filterChain.doFilter(servletRequest, servletResponse); } } @Override public void destroy() { xRayFilter.destroy(); } } }
方案二:使用X-Ray采样规则(推荐)
不需要修改代码,直接在sampling-rules.json中添加一条规则,将健康检查端点的采样率设为0,从根源上阻止X-Ray为该端点创建Segment:
{ "version": 2, "rules": [ { "description": "Skip health check endpoint", "host": "*", "http_method": "GET", "url_path": "/sqs/health", "fixed_target": 0, "rate": 0.0 }, { "description": "Default rule", "host": "*", "http_method": "*", "url_path": "*", "fixed_target": 10, "rate": 0.1 } ], "default": { "fixed_target": 10, "rate": 0.1 } }
这个方法更符合X-Ray的设计理念,无需自定义Filter,配置更灵活,后续修改排除端点只需调整采样规则即可。
内容的提问来源于stack exchange,提问作者lari
相关产品推荐
相关产品推荐

