火山引擎在VKE生产链路实施尾部采样
概述
针对「保 R.E.D 指标准确性就要全量采集、全量采集又带来巨大成本」的矛盾,APMPlus 团队在火山引擎 VKE 环境中实现尾采样:O11yAgent Operator 负责自动插桩、配置动态更新与弹性伸缩,O11yAgent Collector 汇聚 Traces/Metrics/Logs,先由 SpanToMetrics 组件把全量 Span 实时转换为 Metrics,使 R.E.D 指标始终基于全量数据计算,再决定保留哪些 Trace 明细,实现指标计算与 Trace 采样解耦。 为在分布式环境下对整条 Trace 统一决策,Collector 按 TraceId 一致性哈希把同一 Trace 的 Span 路由汇聚到同一实例,并通过 ListAndWatch 实时感知其他 Collector 节点增删以维护哈希环、应对 Pod IP 动态变化。采样决策采用多级机制:按优先级从高到低遍历策略并检查 service.name、env 等属性是否命中 MatchRule,命中即执行并停止匹配,未命中或超时则走全局默认策略,示例为全局概率 0.1%、prod 环境 1%、订单等核心服务 100%。 每个策略内部还可组合 status_code(仅采集含 ERROR 的链路)、latency(超过阈值如 1000ms)、probabilistic、always_sample。工程侧以决策前置(收到 Root Span 即决策,不必等 30 秒超时窗口)、快速采样(仅概率采样时用 FNV 哈希直接判定,无需缓存 Span)、决策结果缓存(TraceId -> Sampled,供迟到的异步 Span 复用)降低内存与 CPU 开销,并在采样器各环节埋点监控接收/丢弃/采样/转发 Span 数、缓存 Trace 数、决策次数与耗时分布、各策略命中次数。 受控环境(4 核 CPU、4GB 内存)压测显示:10k spans/s 下基线(不开启采样)CPU 9.5%、内存 2205.6MB,概率采样 50% 为 9.0%/2212.7MB、100% 为 10.9%/2410.5MB,仅状态码采样 8.2%/1992.1MB、延迟采样(>1s)8.1%/1991.5MB。 200k spans/s 高负载下基线 75.6%/3016.5MB、概率采样 50% 为 76.2%/3019.1MB、100% 为 86.9%/3019.5MB。