这里主要讲一下 TracerProvider
先来看看New方法
func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider {
o := tracerProviderConfig{}
o.spanLimits.parsePotentialEnvConfigs() // 通过环境变量获取span的一些限制等
for _, opt := range opts { // 自定义配置
o = opt.apply(o)
}
o = ensureValidTracerProviderConfig(o) // 如果没有自定义配置,则使用默认配置
tp := &TracerProvider{
namedTracer: make(map[instrumentation.Library]*tracer),
sampler: o.sampler, // 采样方法
idGenerator: o.idGenerator, // id生成器
spanLimits: o.spanLimits,
resource: o.resource, // 可以忽略
}
global.Info("TracerProvider created", "config", o)
for _, sp := range o.processors {
tp.RegisterSpanProcessor(sp)
}
return tp
}
可以看到tp里面重要的功能就这些:
- sampler取样器;
- idGenerator ID生成器,用于生成TraceID和SpanID
- spanProcessors 用于处理span
至于spanLimits等只是一个限制作用,没有什么大的用处。后续生成的Tracer、Span等都会用到tp中的上述三样功能。
除次之外,官方提供了WithSampler/WithIDGenerator等方法用于自定义自己的方法。
tp中的namedTracer,用于保存当前系统中的已经生成的Tracer信息,当下次调用的使用,同一个Tracer会返回map中已经存在的Tracer而不用再次生成。
网友评论