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...) }