diff --git a/sdk/trace/provider.go b/sdk/trace/provider.go index 0636c780736..e152c63b6ab 100644 --- a/sdk/trace/provider.go +++ b/sdk/trace/provider.go @@ -75,7 +75,7 @@ func (cfg tracerProviderConfig) MarshalLog() interface{} { type TracerProvider struct { mu sync.Mutex namedTracer map[instrumentation.Scope]*tracer - spanProcessors atomic.Value + spanProcessors atomic.Pointer[spanProcessorStates] isShutdown bool // These fields are not protected by the lock mu. They are assumed to be @@ -123,7 +123,7 @@ func NewTracerProvider(opts ...TracerProviderOption) *TracerProvider { for _, sp := range o.processors { spss = append(spss, newSpanProcessorState(sp)) } - tp.spanProcessors.Store(spss) + tp.spanProcessors.Store(&spss) return tp } @@ -168,9 +168,9 @@ func (p *TracerProvider) RegisterSpanProcessor(sp SpanProcessor) { return } newSPS := spanProcessorStates{} - newSPS = append(newSPS, p.spanProcessors.Load().(spanProcessorStates)...) + newSPS = append(newSPS, *(p.spanProcessors.Load())...) newSPS = append(newSPS, newSpanProcessorState(sp)) - p.spanProcessors.Store(newSPS) + p.spanProcessors.Store(&newSPS) } // UnregisterSpanProcessor removes the given SpanProcessor from the list of SpanProcessors. @@ -180,7 +180,7 @@ func (p *TracerProvider) UnregisterSpanProcessor(sp SpanProcessor) { if p.isShutdown { return } - old := p.spanProcessors.Load().(spanProcessorStates) + old := *(p.spanProcessors.Load()) if len(old) == 0 { return } @@ -209,13 +209,13 @@ func (p *TracerProvider) UnregisterSpanProcessor(sp SpanProcessor) { spss[len(spss)-1] = nil spss = spss[:len(spss)-1] - p.spanProcessors.Store(spss) + p.spanProcessors.Store(&spss) } // ForceFlush immediately exports all spans that have not yet been exported for // all the registered span processors. func (p *TracerProvider) ForceFlush(ctx context.Context) error { - spss := p.spanProcessors.Load().(spanProcessorStates) + spss := *(p.spanProcessors.Load()) if len(spss) == 0 { return nil } @@ -243,7 +243,7 @@ func (p *TracerProvider) Shutdown(ctx context.Context) error { return nil } p.isShutdown = true - spss := p.spanProcessors.Load().(spanProcessorStates) + spss := *(p.spanProcessors.Load()) var retErr error for _, sps := range spss { @@ -266,7 +266,7 @@ func (p *TracerProvider) Shutdown(ctx context.Context) error { } } } - p.spanProcessors.Store(spanProcessorStates{}) + p.spanProcessors.Store(&spanProcessorStates{}) return retErr } diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index 5d984ff3b86..327212fc9f7 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -135,7 +135,7 @@ func TestRegisterAfterShutdownWithoutProcessors(t *testing.T) { sp := &basicSpanProcessor{} stp.RegisterSpanProcessor(sp) // no-op - assert.Empty(t, stp.spanProcessors.Load().(spanProcessorStates)) + assert.Empty(t, stp.spanProcessors.Load()) } func TestRegisterAfterShutdownWithProcessors(t *testing.T) { @@ -146,11 +146,11 @@ func TestRegisterAfterShutdownWithProcessors(t *testing.T) { err := stp.Shutdown(context.Background()) assert.NoError(t, err) assert.True(t, stp.isShutdown) - assert.Empty(t, stp.spanProcessors.Load().(spanProcessorStates)) + assert.Empty(t, stp.spanProcessors.Load()) sp2 := &basicSpanProcessor{} stp.RegisterSpanProcessor(sp2) // no-op - assert.Empty(t, stp.spanProcessors.Load().(spanProcessorStates)) + assert.Empty(t, stp.spanProcessors.Load()) } func TestTracerProviderSamplerConfigFromEnv(t *testing.T) { diff --git a/sdk/trace/span.go b/sdk/trace/span.go index 9fb483a99fe..81e89122fa2 100644 --- a/sdk/trace/span.go +++ b/sdk/trace/span.go @@ -410,7 +410,7 @@ func (s *recordingSpan) End(options ...trace.SpanEndOption) { } s.mu.Unlock() - sps := s.tracer.provider.spanProcessors.Load().(spanProcessorStates) + sps := *(s.tracer.provider.spanProcessors.Load()) if len(sps) == 0 { return } diff --git a/sdk/trace/tracer.go b/sdk/trace/tracer.go index f17d924b89e..16e0108f085 100644 --- a/sdk/trace/tracer.go +++ b/sdk/trace/tracer.go @@ -51,7 +51,7 @@ func (tr *tracer) Start(ctx context.Context, name string, options ...trace.SpanS s := tr.newSpan(ctx, name, &config) if rw, ok := s.(ReadWriteSpan); ok && s.IsRecording() { - sps := tr.provider.spanProcessors.Load().(spanProcessorStates) + sps := *(tr.provider.spanProcessors.Load()) for _, sp := range sps { sp.sp.OnStart(ctx, rw) }