Opentelemetry SDK的简单用法
概述
Opentelemetry trace的简单架构图如下,客户端和服务端都需要启动一个traceProvider,主要用于将trace数据传输到registry(如jaeger、opencensus等)。client和server通过context将整个链路串起来。
traceProvider会周期性的将数据推送到Registry,默认是5s
func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorOption) SpanProcessor { ... o := BatchSpanProcessorOptions{ BatchTimeout: time.Duration(env.BatchSpanProcessorScheduleDelay(DefaultScheduleDelay)) * time.Millisecond, ExportTimeout: time.Duration(env.BatchSpanProcessorExportTimeout(DefaultExportTimeout)) * time.Millisecond, MaxQueueSize: maxQueueSize, MaxExportBatchSize: maxExportBatchSize, } ... }
下面是官方提供的SDK,它实现了opentelemetry的API,也是操作opentelemetry所使用的基本库:
tracesdk "go.opentelemetry.io/otel/sdk/trace"
创建 TracerProvider
要使用trace,首先要创建一个TracerProvider,定义exporter以及相关属性。
参数表示应用名称或代码库名称
var tracer = otel.Tracer("app_or_package_name")
创建TracerProvider
下面展示了使用 Jaeger 作为exporter的tracerProvider,其中包含两个概念: exporter 和resource。前者为发送遥测数据的目的地,如jaeger、zepkin、opencensus等;后者通常用于添加非临时的底层元数据信息,如主机名,实例ID等。
// tracerProvider returns an OpenTelemetry TracerProvider configured to use // the Jaeger exporter that will send spans to the provided url. The returned // TracerProvider will also use a Resource configured with all the information // about the application. 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 }
可以使用如下方式创建resource, semconv
包可以为资源属性提供规范化的名称。
// newResource returns a resource describing this application. func newResource() *resource.Resource { r, _ := resource.Merge( resource.Default(), resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String("fib"), semconv.ServiceVersionKey.String("v0.1.0"), attribute.String("environment", "demo"), ), ) return r }
注册tracerProvider
如果使用自定义的tracerProvider,需要将其注册为全局tracerProvider:
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)
启动tracerProvider
tr := tp.Tracer("component-main") ctx, span := tr.Start(ctx, "foo") defer span.End()
关闭tracerProvider
当程序退出前,需要关闭tracerProvider,执行数据清理工作:
ct