在采样率 1% 的情况下,如何确保压测流量被 100% 采样
解读
面试官真正想考察的是:
- 你是否理解“采样率”在链路追踪/监控体系中的含义——它通常由 Trace-ID 哈希值对 100 取模决定,天然带有随机性。
- 你是否知道压测流量与真实业务流量的区别,以及国内主流监控/追踪组件(阿里鹰眼、美团 MTrace、字节跳动 BytedTrace、开源 SkyWalking、Jaeger、OpenTelemetry 等)提供的“强制采样”或“流量染色”机制。
- 你能否把“强制采样”与“压测标识”结合起来,给出可落地的配置或代码级方案,而不是泛泛而谈“调大采样率”。
- 你是否考虑到了全量采样带来的存储与性能副作用,并给出配套降级策略。
一句话:让面试官看到你能“精准染色 + 强制采样 + 可控降级”,而不是简单粗暴地改全局采样率。
知识点
- 采样算法
- 概率哈希采样(Probabilistic Hash Sampling)
- 限速采样(Rate-Limiting Sampling)
- 下游继承采样(Upstream Delegation)
- 压测标识规范
- HTTP Header:X-Perf-Test=true(阿里)、X-MT-Test=1(美团)、X-Request-Type=perf(字节)
- Dubbo Attachment:attachment.set("perf_test","1")
- MQ 属性:properties.put("perf_test","1")
- 强制采样 API
- OpenTelemetry:SpanBuilder.setSampler(Sampler.alwaysOn())
- Jaeger:Tracer.buildSpan().withTag("sampling.priority", 1)
- SkyWalking:@Trace(forceSampling = true) 或 -Dskywalking.trace.ignore_force_sampling=false
- 国内云厂商实现
- 阿里云 ARMS:在“流量规则”里新增一条“Header 包含 X-Perf-Test=true → 采样率 100%”,优先级高于默认 1%。
- 腾讯云 TSW:控制台创建“染色规则”,Key=perf_flag Value=true → 采样策略=100%。
- 副作用与兜底
- 全量采样会放大 Collector/ES 磁盘 IO,需提前评估峰值 QPS * 平均 Span 数 * 存储天数。
- 必须支持“开关 + 热点 Key 限流”两级兜底,防止压测流量突增把 Collector 打挂。
答案
分四步落地,可直接写在简历的“压测可观测性改造”项目里。
第一步:统一压测标识
在 JMeter/Go-Stress/Locust 的 HTTP 采样器里统一加 Header “X-Perf-Test: true”;对 Dubbo 调用,通过 Filter 把同样标识塞到 attachment;对 MQ,把该标识写入消息属性。
第二步:控制台配置强制采样规则
以阿里 ARMS 为例:
- 登录 ARMS 控制台 → 链路追踪 → 流量采样规则 → 新建规则;
- 条件选“Header” Key=X-Perf-Test Value=true,采样率设为 100%,优先级调到最高;
- 保存后 30 秒生效,无需发版。
第三步:代码兜底(可选,但面试加分)
如果公司自研 SDK,可在入口 Filter 里硬编码:
if ("true".equals(request.getHeader("X-Perf-Test"))) {
tracer.buildSpan("entry").withTag("sampling.priority", 1).start();
}
保证即使控制台规则被误删,也能 100% 采样。
第四步:配套降级
- 在 Collector 侧配置“热点 Key 限流”:当带 perf_test 的 Span 数每秒超过 5 w 时,自动降级成 10% 采样,并触发钉钉告警。
- 压测结束后,立即关闭该规则,恢复 1% 默认采样,避免持续占用存储。
通过以上四步,即可在“全局 1% 采样”的生产环境中,让压测流量被 100% 完整追踪,同时不把监控链路打爆。
拓展思考
-
如果公司用的是开源 SkyWalking 8.8 以下版本,不支持动态采样规则,你怎么做?
答:可以写一段 OAP 自定义“SamplingRateWatcher”插件,监听 ZooKeeper 节点 /perf/sampling,当值为 100 时,通过 DynamicConfigurationService 把采样率改为 100%,压测结束后再改回去。 -
压测流量 100% 采样后,发现 ES 磁盘暴涨,如何快速清理?
答:提前给压测 Span 打标签“perf=true”,并在 ES 模板里把 perf 索引设置 1 天 TTL;或者使用 Index Lifecycle Policy,当索引大小超过 50 GB 直接删除,避免影响业务数据。 -
如果压测需要跨 20 个微服务,但其中一个老旧服务未接入链路追踪,如何保证端到端可观测?
答:在该服务前置网关(Nginx/Envoy)里通过 lua 脚本生成 Trace-ID 并打印到 access log,再把 access log 采集到 SLS/ELK,与 Trace 平台做“Trace-ID 关联”,实现“半链路”补全。