Skip to content

Commit fff089f

Browse files
authored
Merge pull request moby#3058 from gsaraf/fix_ExportSpans_panic
Solve panic due to concurrent access to ExportSpans
2 parents e6f4ea0 + afb01a7 commit fff089f

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

util/tracing/detect/detect.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,21 +73,31 @@ func detectExporter() (sdktrace.SpanExporter, error) {
7373
return nil, nil
7474
}
7575

76-
func detect() error {
77-
tp = trace.NewNoopTracerProvider()
78-
76+
func getExporter() (sdktrace.SpanExporter, error) {
7977
exp, err := detectExporter()
8078
if err != nil {
81-
return err
79+
return nil, err
80+
}
81+
82+
if exp != nil {
83+
exp = &threadSafeExporterWrapper{
84+
exporter: exp,
85+
}
8286
}
8387

8488
if Recorder != nil {
8589
Recorder.SpanExporter = exp
8690
exp = Recorder
8791
}
92+
return exp, nil
93+
}
94+
95+
func detect() error {
96+
tp = trace.NewNoopTracerProvider()
8897

89-
if exp == nil {
90-
return nil
98+
exp, err := getExporter()
99+
if err != nil || exp == nil {
100+
return err
91101
}
92102

93103
// enable log with traceID when valid exporter

util/tracing/detect/threadsafe.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package detect
2+
3+
import (
4+
"context"
5+
"sync"
6+
7+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
8+
)
9+
10+
// threadSafeExporterWrapper wraps an OpenTelemetry SpanExporter and makes it thread-safe.
11+
type threadSafeExporterWrapper struct {
12+
mu sync.Mutex
13+
exporter sdktrace.SpanExporter
14+
}
15+
16+
func (tse *threadSafeExporterWrapper) ExportSpans(ctx context.Context, spans []sdktrace.ReadOnlySpan) error {
17+
tse.mu.Lock()
18+
defer tse.mu.Unlock()
19+
return tse.exporter.ExportSpans(ctx, spans)
20+
}
21+
22+
func (tse *threadSafeExporterWrapper) Shutdown(ctx context.Context) error {
23+
tse.mu.Lock()
24+
defer tse.mu.Unlock()
25+
return tse.exporter.Shutdown(ctx)
26+
}

0 commit comments

Comments
 (0)