You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:56:07