otel.Tracer(name).Start(context.Background(), "Handle")
type TracerOption interface {
apply(TracerConfig) TracerConfig
}
func Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
return GetTracerProvider().Tracer(name, opts...)
}
func (p *tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
p.mtx.Lock()
defer p.mtx.Unlock()
if p.delegate != nil {
return p.delegate.Tracer(name, opts...)
}
// At this moment it is guaranteed that no sdk is installed, save the tracer in the tracers map.
c := trace.NewTracerConfig(opts...)
key := il{
name: name,
version: c.InstrumentationVersion(),
}
if p.tracers == nil {
p.tracers = make(map[il]*tracer)
}
if val, ok := p.tracers[key]; ok {
return val
}
t := &tracer{name: name, opts: opts, provider: p}
p.tracers[key] = t
return t
}
c := trace.NewTracerConfig(opts...)
func NewTracerConfig(options ...TracerOption) TracerConfig {
var config TracerConfig
for _, option := range options {
config = option.apply(config)
}
return config
}
option.apply(config) 这行,这个option是哪个,我没找到啊!
请教各位
又研究了一下源码,发现NewTracerConfig 传的 options 默认其实就是没有值的
看别的地方怎么调用它的
otel.Tracer(name)
otel.Tracer(name)调用的时候压根就没传第二个参数,之所以有这行代码,trace.NewTracerConfig(opts...)
是为了原有参数满足不了的情况下,可以自己进行设置,然后写到第二个参数那里对原参数进行覆盖