otel.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package otel
  2. import (
  3. "context"
  4. "errors"
  5. "go.opentelemetry.io/otel"
  6. "go.opentelemetry.io/otel/exporters/jaeger"
  7. "go.opentelemetry.io/otel/propagation"
  8. "go.opentelemetry.io/otel/sdk/resource"
  9. "go.opentelemetry.io/otel/sdk/trace"
  10. semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
  11. )
  12. // SetupOTelSDK 初始化 OpenTelemetry SDK,配置 Jaeger 作为追踪数据的后端
  13. func SetupOTelSDK(ctx context.Context, serviceName string, jaegerEndpoint string) (shutdown func(context.Context) error, err error) {
  14. var shutdownFuncs []func(context.Context) error
  15. // 定义关闭函数,用于在程序退出时关闭 OpenTelemetry SDK
  16. shutdown = func(ctx context.Context) error {
  17. var err error
  18. for _, fn := range shutdownFuncs {
  19. err = errors.Join(err, fn(ctx))
  20. }
  21. shutdownFuncs = nil
  22. return err
  23. }
  24. // 处理错误,如果发生错误,调用关闭函数并返回错误
  25. handleErr := func(inErr error) {
  26. err = errors.Join(inErr, shutdown(ctx))
  27. }
  28. // 创建 Jaeger Exporter,用于将追踪数据发送到 Jaeger 后端
  29. exporter, err := jaeger.New(
  30. jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(jaegerEndpoint)), // 指定 Jaeger 的 Collector Endpoint
  31. )
  32. if err != nil {
  33. handleErr(err)
  34. return
  35. }
  36. shutdownFuncs = append(shutdownFuncs, exporter.Shutdown)
  37. // 创建 TracerProvider,配置 Jaeger Exporter 和服务资源信息
  38. tp := trace.NewTracerProvider(
  39. trace.WithBatcher(exporter), // 使用 Jaeger Exporter
  40. trace.WithResource(resource.NewSchemaless(
  41. semconv.ServiceNameKey.String(serviceName), // 设置服务名称
  42. )),
  43. )
  44. shutdownFuncs = append(shutdownFuncs, tp.Shutdown)
  45. otel.SetTracerProvider(tp) // 设置全局 TracerProvider
  46. // 设置全局 TextMapPropagator
  47. otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
  48. return
  49. }