otel 源码阅读(二)

2022-03-07  本文已影响0人  迪克dike

这里主要讲一下 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里面重要的功能就这些:

  1. sampler取样器;
  2. idGenerator ID生成器,用于生成TraceID和SpanID
  3. spanProcessors 用于处理span

至于spanLimits等只是一个限制作用,没有什么大的用处。后续生成的Tracer、Span等都会用到tp中的上述三样功能。

除次之外,官方提供了WithSampler/WithIDGenerator等方法用于自定义自己的方法。

tp中的namedTracer,用于保存当前系统中的已经生成的Tracer信息,当下次调用的使用,同一个Tracer会返回map中已经存在的Tracer而不用再次生成。

上一篇下一篇

猜你喜欢

热点阅读