美文网首页
otel 源码阅读(一)

otel 源码阅读(一)

作者: 迪克dike | 来源:发表于2022-03-07 17:54 被阅读0次

先看官方例子:

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等对象,接下来主要来讲讲这几个对象。

相关文章

网友评论

      本文标题:otel 源码阅读(一)

      本文链接:https://www.haomeiwen.com/subject/pfunrrtx.html