package telemetry import ( "context" "errors" "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, serviceName string, version string) (func(context.Context) error, error) { var shutdownFns []func(context.Context) error shutdown := func(ctx context.Context) error { var err error for _, fn := range shutdownFns { err = errors.Join(err, fn(ctx)) } shutdownFns = nil return err } res, err := resource.New(ctx, resource.WithAttributes( semconv.ServiceName(serviceName), semconv.ServiceVersion(version), ), ) if err != nil { return shutdown, err } otel.SetTextMapPropagator( propagation.NewCompositeTextMapPropagator( propagation.TraceContext{}, propagation.Baggage{}, ), ) traceExporter, err := otlptracegrpc.New(ctx) if err != nil { return shutdown, err } tracerProvider := sdktrace.NewTracerProvider( sdktrace.WithBatcher(traceExporter), sdktrace.WithResource(res), ) otel.SetTracerProvider(tracerProvider) shutdownFns = append(shutdownFns, tracerProvider.Shutdown) return shutdown, nil }