1. 这个需求是怎么冒出来的:健康检查与静态资源正在污染你的链路数据
先聊一个我碰到过很多次的场景。
接入SkyWalking之后,打开拓扑图和链路查询页面,发现请求量最大的不是业务接口,而是GET /actuator/health、GET /favicon.ico、GET /js/app.js这一串。在Kubernetes环境里更夸张,Pod的readinessProbe和livenessProbe默认几秒就探一次,多个副本叠加下来,健康检查的trace数量直接占据整个链路的30%以上。加上前端静态资源在未做单独域名拆分时也会走应用容器,SkyWalking上报的数据量很快就上去了。
这时候最尴尬的是,当你想排查一个真实的慢接口时,搜索链路列表,前几页全是health check的记录。虽然SkyWalking提供了端点维度筛选,但在“所有端点”视角下噪音量还是太大了。更现实的问题是,上报数据量直接关联存储成本和ES查询性能,大量无效trace会拖慢查询响应。
所以“忽略特定接口”这个需求,本质上不是为了节省那一点点探针开销,而是解决三个问题:
- 数据清洗:让链路数据聚焦到业务接口,避免健康检查掩盖真实异常
- 存储成本:无效trace持续写入ES,索引膨胀之后查询性能和磁盘占用都会出问题
- 排障效率:保留有效链路样本,避免搜索全链路时被无效请求刷屏
这个需求在Spring Boot应用里最常见,因为Spring Boot Actuator默认暴露health、info端点,而且每年都有团队在没有任何防护的情况下把静态资源也放进了监控范围。但在非Spring生态里,比如Kong网关、Go服务、Node.js应用,一样会碰到这个问题——只要有心跳检测、健康探测、资源请求这类高频低价值流量,你就需要一套统一的忽略策略。
下面的内容主要围绕SkyWalking Java Agent来展开,同时会补充一些通用处理思路,适配Kong、Spring Cloud Gateway等场景。你不需要看完整个SkyWalking源码,跟着实操就能把“忽略特定接口”这件事做干净。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 清楚要过滤什么,才能真正把规则写对
很多人的第一反应是:直接用trace.ignore_path把所有健康检查的URL写进去,搞定了。但这个思路如果只做到这一步,后面大概率会踩坑。要先想清楚两个问题:忽略哪些请求是合理的,以及忽略请求和忽略端点有什么区别。
先给一个通用的判断标准:一个接口如果满足“高频调用、低信息量、无业务语义”,就值得被排除。高频意味着它会把trace数据量拉起来;低信息量意味着即使出问题,你也无法通过这些链路定位业务故障;无业务语义意味着它不代表用户的实际操作路径。
最常见的几类:
- 健康检查类:/health、/healthz、/actuator/health、/ping、/ready、/live,Kubernetes探针里面配置的那些路径,路径还可能是自定义的
- 静态资源类:/static/、/js/、/css/、/images/、/favicon.ico、/.js、/.css、/.png、/.jpg
- 系统信息类:/info、/metrics、/actuator/prometheus(如果是抓取指标用的,也应该忽略)
- 定时任务/后台批处理:这类不一定全部忽略,但要考虑是否需要采样而不是全量上报
关于“忽略请求”和“忽略端点”的区别,这里要特别说明。SkyWalking的链路追踪是以Segment(一段分布式链路在单个服务内的执行片段)为基本单位的,一个HTTP请求从进入到响应结束,会形成一个Segment。默认情况下,SkyWalking的采样器是100%采样——每个Segment都会被采集并上报,除非你配置了采样率。
trace.ignore_path这个配置项的作用是:当Agent收到一个HTTP请求时,在创建Segment之前先检查请求路径是否匹配ignore规则。如果匹配,则整条Segment都不会被创建,也就不会产生任何上报数据。也就是说,它做的是“源头忽略”,不是“上报时过滤”——这一点很关键,因为如果你试图用后置过滤的方式做这件事(比如写个脚本定期清理ES里的无效trace),成本反而会更高。
端点(Endpoint)是SkyWalking在Segment之上抽象出的概念,一个HTTP请求的URI对应一个端点。如果你只是某些端点不想展示在拓扑和端点列表里,又不想完全不收集trace,那就不应该用trace.ignore_path,而是考虑端点检测规则或者在上报端做别名/删除处理。
理清这层之后,我们再来看具体的配置方法。
3. 配置文件里的关键参数:trace.ignore_path完整拆解
我先说结论:Java Agent场景下,忽略特定
