diff --git a/CHANGELOG.md b/CHANGELOG.md index 64f6b977fa4..f80aa3ff0f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +### Fixed + +- json stdout exporter no longer crashes due to concurrency bug. (#2265) + ### Changed - NoopMeterProvider is now private and NewNoopMeterProvider must be used to obtain a noopMeterProvider. (#2237) diff --git a/exporters/stdout/stdouttrace/trace.go b/exporters/stdout/stdouttrace/trace.go index ba391851d40..f1937a28ebe 100644 --- a/exporters/stdout/stdouttrace/trace.go +++ b/exporters/stdout/stdouttrace/trace.go @@ -49,6 +49,7 @@ func New(options ...Option) (*Exporter, error) { // Exporter is an implementation of trace.SpanSyncer that writes spans to stdout. type Exporter struct { encoder *json.Encoder + encoderMu sync.Mutex timestamps bool stoppedMu sync.RWMutex @@ -70,6 +71,8 @@ func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) stubs := tracetest.SpanStubsFromReadOnlySpans(spans) + e.encoderMu.Lock() + defer e.encoderMu.Unlock() for i := range stubs { stub := &stubs[i] // Remove timestamps