package globals import ( "context" "fmt" "log/slog" "platform/pkg/env" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.21.0" ) var tp *trace.TracerProvider func initOtel(ctx context.Context) error { addr := env.OtelHost + ":" + env.OtelPort name := "lanhu-platform" if env.OtelNameSuffix != "" { name += "-" + env.OtelNameSuffix } slog.Info("初始化 otel", "endpoint", addr, "service_suffix", name) if env.OtelHost == "" || env.OtelPort == "" { return nil } exporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithEndpoint(addr), otlptracegrpc.WithInsecure(), ) if err != nil { return fmt.Errorf("初始化 trace exporter 失败: %w", err) } tp = trace.NewTracerProvider( trace.WithBatcher(exporter), trace.WithSampler(trace.AlwaysSample()), trace.WithResource( resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String(name), ), ), ) otel.SetTracerProvider(tp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) return nil } func closeOtel() error { err := tp.Shutdown(context.Background()) if err != nil { return fmt.Errorf("关闭 trace provider 失败: %v", err) } return nil }