package observability import ( "context" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" "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.21.0" ) // TracerProvider returns a new OpenTelemetry TracerProvider. func TracerProvider(serviceName, environment string) (*sdktrace.TracerProvider, error) { exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint()) if err != nil { return nil, err } res := resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName), semconv.DeploymentEnvironmentKey.String(environment), ) tp := sdktrace.NewTracerProvider( sdktrace.WithBatcher(exporter), sdktrace.WithResource(res), ) otel.SetTracerProvider(tp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) return tp, nil } // ShutdownTracerProvider gracefully shuts down the tracer provider. func ShutdownTracerProvider(ctx context.Context, tp *sdktrace.TracerProvider) error { return tp.Shutdown(ctx) }