From 5165b0f8140fbf8857987a63e28bacd6971510b3 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 22 Aug 2025 16:26:44 +0200 Subject: [PATCH] internal/tracing: replace go-multierror.Group with sync.WaitGroup The go-multierror Group is just a shallow wrapper around sync.WaitGroup; https://github.com/hashicorp/go-multierror/blob/v1.1.1/group.go#L5-L38 This patch replaces the go-multierror.Group for a sync.WaitGroup (we probably don't need to limit concurrency for this one) and stdlib multi- errors. Signed-off-by: Sebastiaan van Stijn --- internal/tracing/mux.go | 53 +++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/internal/tracing/mux.go b/internal/tracing/mux.go index ad5cd1b2e..1a09ef1d9 100644 --- a/internal/tracing/mux.go +++ b/internal/tracing/mux.go @@ -18,8 +18,9 @@ package tracing import ( "context" + "errors" + "sync" - "github.com/hashicorp/go-multierror" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) @@ -28,23 +29,45 @@ type MuxExporter struct { } func (m MuxExporter) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error { - var eg multierror.Group - for i := range m.exporters { - exporter := m.exporters[i] - eg.Go(func() error { - return exporter.ExportSpans(ctx, spans) - }) + var ( + wg sync.WaitGroup + errMu sync.Mutex + errs = make([]error, 0, len(m.exporters)) + ) + + for _, exporter := range m.exporters { + wg.Add(1) + go func() { + defer wg.Done() + if err := exporter.ExportSpans(ctx, spans); err != nil { + errMu.Lock() + errs = append(errs, err) + errMu.Unlock() + } + }() } - return eg.Wait() + wg.Wait() + return errors.Join(errs...) } func (m MuxExporter) Shutdown(ctx context.Context) error { - var eg multierror.Group - for i := range m.exporters { - exporter := m.exporters[i] - eg.Go(func() error { - return exporter.Shutdown(ctx) - }) + var ( + wg sync.WaitGroup + errMu sync.Mutex + errs = make([]error, 0, len(m.exporters)) + ) + + for _, exporter := range m.exporters { + wg.Add(1) + go func() { + defer wg.Done() + if err := exporter.Shutdown(ctx); err != nil { + errMu.Lock() + errs = append(errs, err) + errMu.Unlock() + } + }() } - return eg.Wait() + wg.Wait() + return errors.Join(errs...) }