opentelemetry源码 otel.Tracer(name)这块有点看不懂?

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是哪个,我没找到啊!
请教各位

阅读 1.8k
2 个回答

又研究了一下源码,发现NewTracerConfig 传的 options 默认其实就是没有值的

func NewTracerConfig(options ...TracerOption) TracerConfig {
    var config TracerConfig
    for _, option := range options {
        config = option.apply(config)
    }
    return config
}

看别的地方怎么调用它的
otel.Tracer(name)

func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer {
    c := trace.NewTracerConfig(opts...)
        ........

otel.Tracer(name)调用的时候压根就没传第二个参数,之所以有这行代码,trace.NewTracerConfig(opts...)
是为了原有参数满足不了的情况下,可以自己进行设置,然后写到第二个参数那里对原参数进行覆盖

image.png

这个 option 不就是 for-range 来的么……

P.S. 这段代码看起来是为了基于传入的 options 来给 config 初始化默认值的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题