Skip to content

Commit 75ad72d

Browse files
authored
fix(server): prevent otel tracer provider from immediately being closed (#7369)
1 parent bd63011 commit 75ad72d

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

cli/server.go

+18-10
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,13 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
256256
// which is caught by goleaks.
257257
defer http.DefaultClient.CloseIdleConnections()
258258

259-
tracerProvider, sqlDriver := ConfigureTraceProvider(ctx, logger, inv, cfg)
259+
tracerProvider, sqlDriver, closeTracing := ConfigureTraceProvider(ctx, logger, inv, cfg)
260+
defer func() {
261+
logger.Debug(ctx, "closing tracing")
262+
traceCloseErr := shutdownWithTimeout(closeTracing, 5*time.Second)
263+
logger.Debug(ctx, "tracing closed", slog.Error(traceCloseErr))
264+
}()
265+
260266
httpServers, err := ConfigureHTTPServers(inv, cfg)
261267
if err != nil {
262268
return xerrors.Errorf("configure http(s): %w", err)
@@ -1863,9 +1869,15 @@ func (s *HTTPServers) Close() {
18631869
}
18641870
}
18651871

1866-
func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (trace.TracerProvider, string) {
1872+
func ConfigureTraceProvider(
1873+
ctx context.Context,
1874+
logger slog.Logger,
1875+
inv *clibase.Invocation,
1876+
cfg *codersdk.DeploymentValues,
1877+
) (trace.TracerProvider, string, func(context.Context) error) {
18671878
var (
1868-
tracerProvider trace.TracerProvider
1879+
tracerProvider = trace.NewNoopTracerProvider()
1880+
closeTracing = func(context.Context) error { return nil }
18691881
sqlDriver = "postgres"
18701882
)
18711883
// Coder tracing should be disabled if telemetry is disabled unless
@@ -1878,19 +1890,14 @@ func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibas
18781890
}
18791891

18801892
if cfg.Trace.Enable.Value() || shouldCoderTrace || cfg.Trace.HoneycombAPIKey != "" {
1881-
sdkTracerProvider, closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
1893+
sdkTracerProvider, _closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
18821894
Default: cfg.Trace.Enable.Value(),
18831895
Coder: shouldCoderTrace,
18841896
Honeycomb: cfg.Trace.HoneycombAPIKey.String(),
18851897
})
18861898
if err != nil {
18871899
logger.Warn(ctx, "start telemetry exporter", slog.Error(err))
18881900
} else {
1889-
// allow time for traces to flush even if command context is canceled
1890-
defer func() {
1891-
_ = shutdownWithTimeout(closeTracing, 5*time.Second)
1892-
}()
1893-
18941901
d, err := tracing.PostgresDriver(sdkTracerProvider, "coderd.database")
18951902
if err != nil {
18961903
logger.Warn(ctx, "start postgres tracing driver", slog.Error(err))
@@ -1899,9 +1906,10 @@ func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibas
18991906
}
19001907

19011908
tracerProvider = sdkTracerProvider
1909+
closeTracing = _closeTracing
19021910
}
19031911
}
1904-
return tracerProvider, sqlDriver
1912+
return tracerProvider, sqlDriver, closeTracing
19051913
}
19061914

19071915
func ConfigureHTTPServers(inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (_ *HTTPServers, err error) {

enterprise/cli/proxyserver.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/prometheus/client_golang/prometheus/promhttp"
2222
"golang.org/x/xerrors"
2323

24+
"cdr.dev/slog"
2425
"github.com/coder/coder/cli"
2526
"github.com/coder/coder/cli/clibase"
2627
"github.com/coder/coder/cli/cliui"
@@ -136,7 +137,12 @@ func (*RootCmd) proxyServer() *clibase.Cmd {
136137
defer http.DefaultClient.CloseIdleConnections()
137138
closers.Add(http.DefaultClient.CloseIdleConnections)
138139

139-
tracer, _ := cli.ConfigureTraceProvider(ctx, logger, inv, cfg)
140+
tracer, _, closeTracing := cli.ConfigureTraceProvider(ctx, logger, inv, cfg)
141+
defer func() {
142+
logger.Debug(ctx, "closing tracing")
143+
traceCloseErr := shutdownWithTimeout(closeTracing, 5*time.Second)
144+
logger.Debug(ctx, "tracing closed", slog.Error(traceCloseErr))
145+
}()
140146

141147
httpServers, err := cli.ConfigureHTTPServers(inv, cfg)
142148
if err != nil {
@@ -345,3 +351,9 @@ func (*RootCmd) proxyServer() *clibase.Cmd {
345351

346352
return cmd
347353
}
354+
355+
func shutdownWithTimeout(shutdown func(context.Context) error, timeout time.Duration) error {
356+
ctx, cancel := context.WithTimeout(context.Background(), timeout)
357+
defer cancel()
358+
return shutdown(ctx)
359+
}

0 commit comments

Comments
 (0)