From b530db5f94b3d71a6862c9da167d463a7651c3c8 Mon Sep 17 00:00:00 2001 From: "bismuthdev[bot]" Date: Thu, 17 Apr 2025 22:55:08 +0000 Subject: [PATCH 1/2] Add a shutdown function to the OpenTelemetry integration to properly close tracer and meter providers when the application terminates. The current implementation in acp/internal/otel/otel.go lacks a graceful shutdown mechanism, which could lead to data loss or incomplete telemetry data being sent. --- acp/cmd/main.go | 12 ++++++++---- acp/internal/otel/otel.go | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/acp/cmd/main.go b/acp/cmd/main.go index a73d627..f92c42a 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))) @@ -323,4 +327,4 @@ func main() { setupLog.Error(err, "problem running manager") os.Exit(1) } -} +} \ No newline at end of file diff --git a/acp/internal/otel/otel.go b/acp/internal/otel/otel.go index 48d7232..50d33a6 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 +} \ No newline at end of file From 859f248e6e01d8bcfb57879fa78c3c7396b60ff6 Mon Sep 17 00:00:00 2001 From: Allison Durham Date: Fri, 18 Apr 2025 11:58:08 -0700 Subject: [PATCH 2/2] linting --- acp/cmd/main.go | 4 ++-- acp/internal/otel/otel.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/acp/cmd/main.go b/acp/cmd/main.go index f92c42a..2661e70 100644 --- a/acp/cmd/main.go +++ b/acp/cmd/main.go @@ -110,7 +110,7 @@ func main() { setupLog.Error(err, "failed to initialize opentelemetry meter") os.Exit(1) } - + // Ensure proper shutdown of OpenTelemetry providers defer func() { if err := acpotel.Shutdown(ctx, tracerProvider, meterProvider); err != nil { @@ -327,4 +327,4 @@ func main() { setupLog.Error(err, "problem running manager") os.Exit(1) } -} \ No newline at end of file +} diff --git a/acp/internal/otel/otel.go b/acp/internal/otel/otel.go index 50d33a6..c102853 100644 --- a/acp/internal/otel/otel.go +++ b/acp/internal/otel/otel.go @@ -76,4 +76,4 @@ func Shutdown(ctx context.Context, tp *sdktrace.TracerProvider, mp *sdkmetric.Me } return nil -} \ No newline at end of file +}