在采样率 1% 的情况下,如何确保压测流量被 100% 采样

解读

面试官真正想考察的是:

  1. 你是否理解“采样率”在链路追踪/监控体系中的含义——它通常由 Trace-ID 哈希值对 100 取模决定,天然带有随机性。
  2. 你是否知道压测流量与真实业务流量的区别,以及国内主流监控/追踪组件(阿里鹰眼、美团 MTrace、字节跳动 BytedTrace、开源 SkyWalking、Jaeger、OpenTelemetry 等)提供的“强制采样”或“流量染色”机制。
  3. 你能否把“强制采样”与“压测标识”结合起来,给出可落地的配置或代码级方案,而不是泛泛而谈“调大采样率”。
  4. 你是否考虑到了全量采样带来的存储与性能副作用,并给出配套降级策略。

一句话:让面试官看到你能“精准染色 + 强制采样 + 可控降级”,而不是简单粗暴地改全局采样率。

知识点

  1. 采样算法
    • 概率哈希采样(Probabilistic Hash Sampling)
    • 限速采样(Rate-Limiting Sampling)
    • 下游继承采样(Upstream Delegation)
  2. 压测标识规范
    • 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")
  3. 强制采样 API
    • OpenTelemetry:SpanBuilder.setSampler(Sampler.alwaysOn())
    • Jaeger:Tracer.buildSpan().withTag("sampling.priority", 1)
    • SkyWalking:@Trace(forceSampling = true) 或 -Dskywalking.trace.ignore_force_sampling=false
  4. 国内云厂商实现
    • 阿里云 ARMS:在“流量规则”里新增一条“Header 包含 X-Perf-Test=true → 采样率 100%”,优先级高于默认 1%。
    • 腾讯云 TSW:控制台创建“染色规则”,Key=perf_flag Value=true → 采样策略=100%。
  5. 副作用与兜底
    • 全量采样会放大 Collector/ES 磁盘 IO,需提前评估峰值 QPS * 平均 Span 数 * 存储天数。
    • 必须支持“开关 + 热点 Key 限流”两级兜底,防止压测流量突增把 Collector 打挂。

答案

分四步落地,可直接写在简历的“压测可观测性改造”项目里。

第一步:统一压测标识
在 JMeter/Go-Stress/Locust 的 HTTP 采样器里统一加 Header “X-Perf-Test: true”;对 Dubbo 调用,通过 Filter 把同样标识塞到 attachment;对 MQ,把该标识写入消息属性。

第二步:控制台配置强制采样规则
以阿里 ARMS 为例:

  1. 登录 ARMS 控制台 → 链路追踪 → 流量采样规则 → 新建规则;
  2. 条件选“Header” Key=X-Perf-Test Value=true,采样率设为 100%,优先级调到最高;
  3. 保存后 30 秒生效,无需发版。

第三步:代码兜底(可选,但面试加分)
如果公司自研 SDK,可在入口 Filter 里硬编码:

if ("true".equals(request.getHeader("X-Perf-Test"))) {
    tracer.buildSpan("entry").withTag("sampling.priority", 1).start();
}

保证即使控制台规则被误删,也能 100% 采样。

第四步:配套降级

  1. 在 Collector 侧配置“热点 Key 限流”:当带 perf_test 的 Span 数每秒超过 5 w 时,自动降级成 10% 采样,并触发钉钉告警。
  2. 压测结束后,立即关闭该规则,恢复 1% 默认采样,避免持续占用存储。

通过以上四步,即可在“全局 1% 采样”的生产环境中,让压测流量被 100% 完整追踪,同时不把监控链路打爆。

拓展思考

  1. 如果公司用的是开源 SkyWalking 8.8 以下版本,不支持动态采样规则,你怎么做?
    答:可以写一段 OAP 自定义“SamplingRateWatcher”插件,监听 ZooKeeper 节点 /perf/sampling,当值为 100 时,通过 DynamicConfigurationService 把采样率改为 100%,压测结束后再改回去。

  2. 压测流量 100% 采样后,发现 ES 磁盘暴涨,如何快速清理?
    答:提前给压测 Span 打标签“perf=true”,并在 ES 模板里把 perf 索引设置 1 天 TTL;或者使用 Index Lifecycle Policy,当索引大小超过 50 GB 直接删除,避免影响业务数据。

  3. 如果压测需要跨 20 个微服务,但其中一个老旧服务未接入链路追踪,如何保证端到端可观测?
    答:在该服务前置网关(Nginx/Envoy)里通过 lua 脚本生成 Trace-ID 并打印到 access log,再把 access log 采集到 SLS/ELK,与 Trace 平台做“Trace-ID 关联”,实现“半链路”补全。