otel 源碼閱讀(三)

Tracer

Tracer的邏輯很簡單,Tracer接口就一個Start方法,用來生成新的span。
與之相對于的tracer結(jié)構(gòu)體,可以說是非常簡單

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

然后是實現(xiàn)Tracer接口的Start方法

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

    // 記錄從當(dāng)前span創(chuàng)建的子span的個數(shù)(如果是recordingSpan)
    if p := trace.SpanFromContext(ctx); p != nil {
        if sdkSpan, ok := p.(*recordingSpan); ok {
            sdkSpan.addChild()
        }
    }

    s := tr.newSpan(ctx, name, &config) // 從當(dāng)前攜帶span信息的ctx創(chuàng)建新的子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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容