package tracer import ( "context" "log/slog" "time" "github.com/spf13/viper" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" ) func Init(ctx context.Context) func(context.Context) error { endpoint := viper.GetString("tracer.otel_controller_endpoint") if endpoint == "" { endpoint = "localhost:4317" } clientCtx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() exporter, err := otlptracegrpc.New(clientCtx, otlptracegrpc.WithEndpoint(endpoint), otlptracegrpc.WithInsecure(), ) if err != nil { slog.Error("[Tracer] Failed to create trace exporter", "err", err) return func(context.Context) error { return nil } } res, err := resource.New(ctx, resource.WithAttributes( semconv.ServiceNameKey.String("nixcn-cms-backend"), ), ) if err != nil { slog.Error("[Tracer] Failed to create resource", "err", err) } tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithResource(res), sdktrace.WithSampler(sdktrace.AlwaysSample()), ) otel.SetTracerProvider(tp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, )) return tp.Shutdown }