package tracer import ( "context" "log/slog" "time" "github.com/spf13/viper" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/log/global" "go.opentelemetry.io/otel/propagation" sdklog "go.opentelemetry.io/otel/sdk/log" sdkmetric "go.opentelemetry.io/otel/sdk/metric" "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" } res, err := resource.New(ctx, resource.WithAttributes( semconv.ServiceNameKey.String(viper.GetString("server.service_name")), ), ) if err != nil { slog.Error("[OTEL] Failed to create resource", "err", err) } traceExporter, _ := otlptracegrpc.New(ctx, otlptracegrpc.WithEndpoint(endpoint), otlptracegrpc.WithInsecure(), ) tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(res), sdktrace.WithSampler(sdktrace.AlwaysSample()), ) otel.SetTracerProvider(tp) metricExporter, _ := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithEndpoint(endpoint), otlpmetricgrpc.WithInsecure(), ) mp := sdkmetric.NewMeterProvider( sdkmetric.WithResource(res), sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter, sdkmetric.WithInterval(5*time.Second))), ) otel.SetMeterProvider(mp) logExporter, _ := otlploggrpc.New(ctx, otlploggrpc.WithEndpoint(endpoint), otlploggrpc.WithInsecure(), ) lp := sdklog.NewLoggerProvider( sdklog.WithResource(res), sdklog.WithProcessor(sdklog.NewBatchProcessor(logExporter)), ) global.SetLoggerProvider(lp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, )) return func(shutCtx context.Context) error { var errs []error if err := tp.Shutdown(shutCtx); err != nil { errs = append(errs, err) } if err := mp.Shutdown(shutCtx); err != nil { errs = append(errs, err) } if err := lp.Shutdown(shutCtx); err != nil { errs = append(errs, err) } if len(errs) > 0 { return errs[0] } return nil } }