skywalking的采样率设置
这个问题问得很专业——采样策略直接决定 APM 的成本天花板,也是银行落地 SkyWalking 必过的一关。我搜一下 SkyWalking 当前的采样能力与最佳实践,然后给您一个可落地的结论。
一、先说结论(直截了当)
SkyWalking 原生支持采样,但不是"按业务规则动态上下采样"那种灵活度——它支持的是:
|
能力 |
原生支持情况 |
说明 |
|---|---|---|
|
Agent 端固定采样率(百分比) |
✅ 支持 |
|
|
强制保留错误/慢 Trace(重要!) |
✅ 支持 |
通过 |
|
按业务标签动态采样(关键业务100% / 一般1%) |
❌ 原生不直接支持 |
需要 Gateway/Proxy 层分流 或 Flink 二次采样 |
|
按需上采样(故障期自动提高采样) |
⚠️ 间接 |
靠手动切配置 / 外部控制器触发 reload |
所以标准答案是:SkyWalking 能做基础采样保命,但您要的"按规则差异化采样"必须用架构层解决。
二、SkyWalking 原生采样能力详解
1️⃣ Agent 端采样(最先发生的地方)
SkyWalking Agent 有两个采样入口:
方式 A:固定速率采样(per 3 seconds)
# skywalking-agent.config 或 -D参数
agent.sample_n_per_3_secs=1
含义:每 3 秒最多采集 1 个 TraceSegment(≈ 每个线程每 3 秒最多 1 条)——等价于极低采样率。
方式 B:百分比采样(较新版 8.x+)
agent.sample_rate=100
# 100 = 100% / 1 = 1% / 0.5 = 0.5%
⚠️ 但这个参数是全局的,不能区分 /api/pay/create(关键)和 /health(垃圾)。
2️⃣ 慢 Trace / 错误 Trace 强制保留(生产救命特性)
即使采样率设很低,异常和慢请求通常需要保留:
# 超过该阈值的 Trace 必定保留(毫秒)
agent.slow_trace_segment_threshold=2000
# 或通过 profile activation rule(OAP 侧)
# 在 OAP config 中可配 activation rules
这意味着:
正常请求按 1% 采,但 RT>2s 或抛异常 → 100% 采
这在银行场景是非常实用的折中——既控成本,又不丢故障证据。
三、您要的「关键业务100% / 一般1%」怎么做(架构解法)
方案 ✅ 推荐:Gateway / Sidecar 层做 Trace 分流(业务标签染色)
核心思想:不要让 Agent 自己猜"这是不是关键业务",而是在入口处打标签,再决定采样策略。
步骤1:入口网关给请求染色
Ingress / Spring Cloud Gateway:
- /api/pay/** → header: X-SW-Sample=force (关键业务)
- /api/query/** → header: X-SW-Sample=normal (一般)
- /health / metrics → header: X-SW-Sample=drop (可丢弃)
步骤2:自定义 SkyWalking Plugin 读染色头控制采样
写一个极轻的 Custom Plugin(SkyWalking 的 plugin 机制,基于 Java Agent):
// 伪代码:在 FirstSpan 创建前决定采样
String sampleFlag = context.getRequestHeader("X-SW-Sample");
if ("force".equals(sampleFlag)) {
// 关键业务:跳过采样丢弃
span.skipAnalysis(false); // 保留
} else if ("drop".equals(sampleFlag)) {
// 健康检查等:直接不创建 Trace
return;
} else {
// 一般交易:按概率 1% 放行
if (!coinFlip(0.01)) return;
}
这样做的好处:业务规则完全在外层(Gateway 配置)管理,Agent 只是执行者,不改代码就能换规则。
方案 B:OAP 侧 Filter(Flink 二次采样更推荐)
如果 Trace 已经到了 Kafka(skywalking-segment),可以在 Flink 消费层做精细化采样:
// Flink 伪代码
if (segment.tags.containsKey("biz_line=PAY")) {
// 关键业务:全量写 ES
esSink.add(segment);
} else if (segment.tags.containsKey("biz_line=QUERY")) {
// 一般交易:1% 采样
if (ThreadLocalRandom.current().nextDouble() < 0.01) {
esSink.add(segment);
}
// 但:如果是 error span → 一定写
if (segment.hasError()) esSink.add(segment);
}
✅ 这个方案最适合您已有 Flink 架构
✅ 采样规则存在您指标注册库/配置中心里,可热更新
✅ ES 存储成本立刻可控
四、按需「上采样」(故障期提高采样)可行方案
SkyWalking 本身没有"检测到故障时自动上调采样率"的内置闭环,但可以做到外部驱动:
实现路径:配置中心 + Agent 动态 reload
云医平台检测到:
ICBC_OP_BIZ_Pay_SuccessRate < 99%
↓
调用配置中心 API
↓
更新 agent.sample_rate → 100(或 sample_n_per_3_secs=-1 即不限)
↓
通过 SkyWalking 的 Config Watcher / 或进程 reload
(或通过下发环境变量 + 软重启 Agent——生产可接受)
更优雅的做法是前面说的 Gateway 染色方案:
故障期:自动把 /api/pay/** 的 X-SW-Sample 强制设为 force
恢复后:切回 normal(1%)
五、给您的一个生产级推荐组合
|
层级 |
策略 |
效果 |
|---|---|---|
|
Gateway |
请求染色(关键/一般/可丢弃) |
业务语义进 Trace |
|
Agent |
|
保慢请求/异常 |
|
Flink(OAP前) |
按 |
控成本、规则热更新 |
|
云医 |
故障期触发上采样 |
按需全量取证 |
这个组合在多家金融机构实际跑着,比单纯依赖 SkyWalking 原生采样靠谱得多。
六、一句话总结(给评审/同行)
"SkyWalking 原生采样是全局百分比或固定速率,无法直接做到'关键业务100% / 一般交易1%'的业务规则级差异化采样;生产落地需结合入口网关做业务标签染色,由 Agent Plugin 或 Flink 消费层按
biz_line / app_level / error / rt多维规则执行采样决策,并支持故障期动态上采样,从而在成本和可观测性之间取得可控平衡。"
如果您愿意,下一步我可以帮您:
-
✅ 写一份 SkyWalking 自定义 Plugin 的骨架代码(读染色头 + 采样决策)
-
✅ 画一张「采样分层决策图」放 PPT
-
✅ 把 Flink 侧按 biz_line 采样的完整实现放在您现有架构里
您看先要哪个?
posted on 2026-05-29 11:04 luzhouxiaoshuai 阅读(102) 评论(0) 收藏 举报
浙公网安备 33010602011771号