otel 源码阅读(一)

先看官方例子:

func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
    // Create the Jaeger exporter
    exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
    if err != nil {
        return nil, err
    }
    tp := tracesdk.NewTracerProvider(
        // Always be sure to batch in production.
        tracesdk.WithBatcher(exp),
        // Record information about this application in a Resource.
        tracesdk.WithResource(resource.NewWithAttributes(
            semconv.SchemaURL,
            semconv.ServiceNameKey.String(service),
            attribute.String("environment", environment),
            attribute.Int64("ID", id),
        )),
    )
    return tp, nil
}

func main() {
    tp, err := tracerProvider("http://localhost:14268/api/traces")
    if err != nil {
        log.Fatal(err)
    }

    // Register our TracerProvider as the global so any imported
    // instrumentation in the future will default to using it.
    otel.SetTracerProvider(tp)

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // Cleanly shutdown and flush telemetry when the application exits.
    defer func(ctx context.Context) {
        // Do not make the application hang when it is shutdown.
        ctx, cancel = context.WithTimeout(ctx, time.Second*5)
        defer cancel()
        if err := tp.Shutdown(ctx); err != nil {
            log.Fatal(err)
        }
    }(ctx)

    tr := tp.Tracer("component-main")

    ctx, span := tr.Start(ctx, "foo")

    defer span.End()

    bar(ctx)
}

func bar(ctx context.Context) {
    // Use the global TracerProvider.
    tr := otel.Tracer("component-bar")
    _, span := tr.Start(ctx, "bar")
    span.SetAttributes(attribute.Key("testset").String("value"))
    defer span.End()

    // Do bar...
}

在tracerProvider函数中我们可以看到通过jaeger.New生成了一个Exporter, 之后通过tracesdk.NewTracerProvider生成了TracerProvider,里面包含了jaeger的exporter。
随后我们设置全局tracerProvider变量otel.SetTracerProvider(tp)。之后我们就可以愉快的使用tp来生成tracer了。

span是通过tr.Start来生成的,这里每次调用tr.Start都会生成一个新的traceId,除非能从ctx里面拿到上一个span信息。

这里面主要出现了Exporter、TracerProvider、Tracer、Span等对象,接下来主要来讲讲这几个对象。

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

相关阅读更多精彩内容

友情链接更多精彩内容