Skip to content

Commit

Permalink
Solve panic due to concurrent access to ExportSpans
Browse files Browse the repository at this point in the history
Signed-off-by: Gahl Saraf <saraf.gahl@gmail.com>
  • Loading branch information
gsaraf committed Dec 29, 2022
1 parent e6f4ea0 commit f81f662
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
4 changes: 4 additions & 0 deletions util/tracing/detect/detect.go
Expand Up @@ -81,6 +81,10 @@ func detect() error {
return err
}

exp = &threadSafeExporterWrapper{
exporter: exp,
}

if Recorder != nil {
Recorder.SpanExporter = exp
exp = Recorder
Expand Down
26 changes: 26 additions & 0 deletions util/tracing/detect/threadsafe.go
@@ -0,0 +1,26 @@
package detect

import (
"context"
"sync"

sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

// threadSafeExporterWrapper wraps an OpenTelemetry SpanExporter and makes it thread-safe.
type threadSafeExporterWrapper struct {
mu sync.Mutex
exporter sdktrace.SpanExporter
}

func (tse *threadSafeExporterWrapper) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error {
tse.mu.Lock()
defer tse.mu.Unlock()
return tse.exporter.ExportSpans(ctx, spans)
}

func (tse *threadSafeExporterWrapper) Shutdown(ctx context.Context) error {
tse.mu.Lock()
defer tse.mu.Unlock()
return tse.exporter.Shutdown(ctx)
}

0 comments on commit f81f662

Please sign in to comment.