Jaeger客户端初始化后无法动态修改采样率,因Sampler被设计为不可变;应使用RemoteSampler从Agent/Collector动态拉取策略,或自定义DynamicProbabilisticSampler配合外部配置更新。

Jaeger 客户端初始化时无法动态修改采样率
Go 的 jaeger-client-go 在初始化 Tracer 后,采样器(Sampler)是只读的——它被封装进不可变的 tracer 实例里,后续调用 tracer.SetSampler() 或类似方法无效。这不是 bug,而是设计使然:采样决策发生在 span 创建瞬间,必须在 tracer 构建阶段就确定策略和参数。
所以“动态配置”不是运行时替换采样器,而是让采样器本身能响应外部变化。官方推荐方式是使用 RemoteSampler,它会定期从 Jaeger Agent 或 Collector 拉取最新采样策略。
-
RemoteSampler默认每 1 秒轮询一次/sampling端点(Agent 监听在localhost:5778) - 需确保 Jaeger Agent 已启动并启用采样配置服务(默认开启)
- 若用 Collector 直连,需开启
--sampling.strategies-file并暴露 HTTP 接口
用 RemoteSampler 替代 ConstSampler 或 ProbabilisticSampler
硬编码的 ConstSampler(始终采样/不采样)或 ProbabilisticSampler(固定概率)无法响应变化。换成 RemoteSampler 后,采样逻辑由远程策略驱动,本地 tracer 自动适配。
示例初始化片段:
cfg := &config.Configuration{
ServiceName: "my-service",
Sampler: &config.SamplerConfig{
Type: "remote",
Param: 1.0, // 初始采样率(仅首次生效,后续以远程为准)
},
Reporter: &config.ReporterConfig{
LocalAgentHostPort: "127.0.0.1:6831",
},
}
tracer, _, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
if err != nil {
panic(err)
}
注意:Param 这里只是 fallback 值,不是最终采样率;真正生效的是 Agent 返回的 JSON 策略。
如何验证远程策略是否生效
直接访问 Agent 的采样配置接口:curl http://127.0.0.1:5778/sampling?service=my-service。正常返回类似:
{
"strategy_type": "PROBABILISTIC",
"probabilistic_sampling": {"sampling_rate": 0.1}
}
如果返回空或 404,说明 Agent 未运行,或服务名不匹配(大小写、特殊字符需一致)。常见错误:
- Agent 启动时没加
--collector.host-port(导致无法同步策略) - Go 服务注册的
ServiceName和 curl 请求中 service 参数不完全一致 - Agent 日志出现
no sampling strategy for service,表示策略文件未覆盖该服务
自定义策略更新逻辑(绕过 RemoteSampler 限制)
某些场景下你无法依赖 Agent(比如离线环境、多集群隔离),这时可封装一个可热更新的采样器。核心是实现 jaeger.Sampler 接口,并用原子变量或 mutex 控制 IsSampled() 的判断依据:
type DynamicProbabilisticSampler struct {
rate atomic.Float64
}
func (s *DynamicProbabilisticSampler) IsSampled(traceID uint64) bool {
r := s.rate.Load()
return rand.Float64() <p>然后在 tracer 初始化时传入该实例。但注意:此方式要求你在业务代码中显式调用 <code>SetRate()</code>,且需确保所有 goroutine 看到新值——它不自动感知配置中心变更,仍需配合 etcd / consul / file watch 等机制触发更新。</p><p>这种 DIY 方式灵活,但丢失了 Jaeger 生态的统一策略管理能力,调试和审计成本更高。</p><p>真正麻烦的不是换采样器,而是让所有服务实例在同一时刻拿到一致的新采样率——Agent 拉取是最终一致,而自定义方案容易因更新时机不同导致采样倾斜。这点常被忽略。</p>











