diff --git a/acp/cmd/main.go b/acp/cmd/main.go index a73d627..2661e70 100644 --- a/acp/cmd/main.go +++ b/acp/cmd/main.go @@ -105,14 +105,18 @@ func main() { setupLog.Error(err, "failed to initialize opentelemetry tracer") os.Exit(1) } - defer func() { _ = tracerProvider.Shutdown(ctx) }() - meterProvider, err := acpotel.InitMeter(ctx) if err != nil { setupLog.Error(err, "failed to initialize opentelemetry meter") os.Exit(1) } - defer func() { _ = meterProvider.Shutdown(ctx) }() + + // Ensure proper shutdown of OpenTelemetry providers + defer func() { + if err := acpotel.Shutdown(ctx, tracerProvider, meterProvider); err != nil { + setupLog.Error(err, "failed to shutdown opentelemetry providers") + } + }() ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) diff --git a/acp/internal/otel/otel.go b/acp/internal/otel/otel.go index 48d7232..c102853 100644 --- a/acp/internal/otel/otel.go +++ b/acp/internal/otel/otel.go @@ -56,3 +56,24 @@ func InitMeter(ctx context.Context) (*sdkmetric.MeterProvider, error) { otel.SetMeterProvider(mp) return mp, nil } + +// Shutdown gracefully shuts down the OpenTelemetry tracer and meter providers. +// It ensures all telemetry data is flushed before the application terminates. +// Returns an error if either the tracer or meter provider fails to shut down properly. +func Shutdown(ctx context.Context, tp *sdktrace.TracerProvider, mp *sdkmetric.MeterProvider) error { + // First shut down the tracer provider + if tp != nil { + if err := tp.Shutdown(ctx); err != nil { + return err + } + } + + // Then shut down the meter provider + if mp != nil { + if err := mp.Shutdown(ctx); err != nil { + return err + } + } + + return nil +}