otel 源码阅读(三)

Tracer

Tracer的逻辑很简单,Tracer接口就一个Start方法,用来生成新的span。
与之相对于的tracer结构体,可以说是非常简单

type tracer struct {
    provider               *TracerProvider   // 上层的provider
    instrumentationLibrary instrumentation.Library   // 没啥用,可以忽略
}

然后是实现Tracer接口的Start方法

func (tr *tracer) Start(ctx context.Context, name string, options ...trace.SpanStartOption) (context.Context, trace.Span) {
    config := trace.NewSpanStartConfig(options...) // 配置

    // 记录从当前span创建的子span的个数(如果是recordingSpan)
    if p := trace.SpanFromContext(ctx); p != nil {
        if sdkSpan, ok := p.(*recordingSpan); ok {
            sdkSpan.addChild()
        }
    }

    s := tr.newSpan(ctx, name, &config) // 从当前携带span信息的ctx创建新的子span
    if rw, ok := s.(ReadWriteSpan); ok && s.IsRecording() {
        sps, _ := tr.provider.spanProcessors.Load().(spanProcessorStates)
        for _, sp := range sps {
            sp.sp.OnStart(ctx, rw)
        }
    }
    if rtt, ok := s.(runtimeTracer); ok {
        ctx = rtt.runtimeTrace(ctx)
    }

    return trace.ContextWithSpan(ctx, s), s
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容