Skip to content

Commit eadfab0

Browse files
committed
fix(tracing): properly shutdown tracer provider
Fix tracer provider reloads in different scenarios: - disabled -> enabled: install new tracer provider - enabled -> enabled: keep provider up and swap with new one - enabled -> disabled: shutdown old tracer provider, use noop provider - build failure: keep current provider Signed-off-by: Siavash Safi <siavash@cloudflare.com>
1 parent b8725fe commit eadfab0

1 file changed

Lines changed: 22 additions & 18 deletions

File tree

tracing/tracing.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,31 +100,40 @@ func (m *Manager) ApplyConfig(cfg TracingConfig) error {
100100
return nil
101101
}
102102

103-
if m.shutdownFunc != nil {
104-
if err := m.shutdownFunc(); err != nil {
105-
return fmt.Errorf("failed to shut down the tracer provider: %w", err)
106-
}
107-
}
108-
109-
// If no endpoint is set, assume tracing should be disabled.
103+
// If no endpoint is set, disable tracing and shut down the old provider.
110104
if cfg.Endpoint == "" {
111105
tracingEnabled.Store(false)
112-
m.config = cfg
113-
m.shutdownFunc = nil
114106
otel.SetTracerProvider(noop.NewTracerProvider())
107+
if m.shutdownFunc != nil {
108+
if err := m.shutdownFunc(); err != nil {
109+
m.logger.Warn("Failed to shut down the previous tracer provider", "err", err)
110+
}
111+
m.shutdownFunc = nil
112+
}
113+
m.config = cfg
115114
m.logger.Info("Tracing provider uninstalled.")
116115
return nil
117116
}
118117

118+
// Build the new provider before tearing down the old one so that
119+
// tracing remains available throughout the reload.
119120
tp, shutdownFunc, err := buildTracerProvider(context.Background(), cfg)
120121
if err != nil {
121-
return fmt.Errorf("failed to install a new tracer provider: %w", err)
122+
return fmt.Errorf("failed to build a new tracer provider: %w", err)
122123
}
123124

124-
m.shutdownFunc = shutdownFunc
125-
m.config = cfg
125+
// Swap to the new provider, then shut down the old one.
126+
oldShutdown := m.shutdownFunc
126127
otel.SetTracerProvider(tp)
127128
tracingEnabled.Store(true)
129+
m.shutdownFunc = shutdownFunc
130+
m.config = cfg
131+
132+
if oldShutdown != nil {
133+
if err := oldShutdown(); err != nil {
134+
m.logger.Warn("Failed to shut down the previous tracer provider", "err", err)
135+
}
136+
}
128137

129138
m.logger.Info("Successfully installed a new tracer provider.")
130139
return nil
@@ -190,12 +199,7 @@ func buildTracerProvider(ctx context.Context, tracingCfg TracingConfig) (trace.T
190199
return tp, func() error {
191200
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
192201
defer cancel()
193-
err := tp.Shutdown(ctx)
194-
if err != nil {
195-
return err
196-
}
197-
198-
return nil
202+
return tp.Shutdown(ctx)
199203
}, nil
200204
}
201205

0 commit comments

Comments
 (0)