From 59514aa9d5c3c87add0badc42a7761fc18f11bdf Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Tue, 2 May 2023 04:52:01 +0000 Subject: [PATCH 1/2] fix(server): prevent otel tracer provider from immediately being closed --- cli/server.go | 28 ++++++++++++++++++---------- enterprise/cli/proxyserver.go | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/cli/server.go b/cli/server.go index d65560a9f88ee..d538c9236b074 100644 --- a/cli/server.go +++ b/cli/server.go @@ -256,7 +256,13 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd. // which is caught by goleaks. defer http.DefaultClient.CloseIdleConnections() - tracerProvider, sqlDriver := ConfigureTraceProvider(ctx, logger, inv, cfg) + tracerProvider, sqlDriver, closeTracing := ConfigureTraceProvider(ctx, logger, inv, cfg) + defer func() { + logger.Debug(ctx, "closing tracing") + traceCloseErr := shutdownWithTimeout(closeTracing, 5*time.Second) + logger.Debug(ctx, "tracing closed", slog.Error(traceCloseErr)) + }() + httpServers, err := ConfigureHTTPServers(inv, cfg) if err != nil { return xerrors.Errorf("configure http(s): %w", err) @@ -1863,9 +1869,15 @@ func (s *HTTPServers) Close() { } } -func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (trace.TracerProvider, string) { +func ConfigureTraceProvider( + ctx context.Context, + logger slog.Logger, + inv *clibase.Invocation, + cfg *codersdk.DeploymentValues, +) (trace.TracerProvider, string, func(context.Context) error) { var ( - tracerProvider trace.TracerProvider + tracerProvider = trace.NewNoopTracerProvider() + closeTracing = func(context.Context) error { return nil } sqlDriver = "postgres" ) // Coder tracing should be disabled if telemetry is disabled unless @@ -1878,7 +1890,7 @@ func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibas } if cfg.Trace.Enable.Value() || shouldCoderTrace || cfg.Trace.HoneycombAPIKey != "" { - sdkTracerProvider, closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{ + sdkTracerProvider, _closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{ Default: cfg.Trace.Enable.Value(), Coder: shouldCoderTrace, Honeycomb: cfg.Trace.HoneycombAPIKey.String(), @@ -1886,11 +1898,6 @@ func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibas if err != nil { logger.Warn(ctx, "start telemetry exporter", slog.Error(err)) } else { - // allow time for traces to flush even if command context is canceled - defer func() { - _ = shutdownWithTimeout(closeTracing, 5*time.Second) - }() - d, err := tracing.PostgresDriver(sdkTracerProvider, "coderd.database") if err != nil { logger.Warn(ctx, "start postgres tracing driver", slog.Error(err)) @@ -1899,9 +1906,10 @@ func ConfigureTraceProvider(ctx context.Context, logger slog.Logger, inv *clibas } tracerProvider = sdkTracerProvider + closeTracing = _closeTracing } } - return tracerProvider, sqlDriver + return tracerProvider, sqlDriver, closeTracing } func ConfigureHTTPServers(inv *clibase.Invocation, cfg *codersdk.DeploymentValues) (_ *HTTPServers, err error) { diff --git a/enterprise/cli/proxyserver.go b/enterprise/cli/proxyserver.go index af5716424bc0e..21fe8117a5072 100644 --- a/enterprise/cli/proxyserver.go +++ b/enterprise/cli/proxyserver.go @@ -21,6 +21,8 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" "golang.org/x/xerrors" + "cdr.dev/slog" + "github.com/coder/coder/cli" "github.com/coder/coder/cli/clibase" "github.com/coder/coder/cli/cliui" @@ -136,7 +138,12 @@ func (*RootCmd) proxyServer() *clibase.Cmd { defer http.DefaultClient.CloseIdleConnections() closers.Add(http.DefaultClient.CloseIdleConnections) - tracer, _ := cli.ConfigureTraceProvider(ctx, logger, inv, cfg) + tracer, _, closeTracing := cli.ConfigureTraceProvider(ctx, logger, inv, cfg) + defer func() { + logger.Debug(ctx, "closing tracing") + traceCloseErr := shutdownWithTimeout(closeTracing, 5*time.Second) + logger.Debug(ctx, "tracing closed", slog.Error(traceCloseErr)) + }() httpServers, err := cli.ConfigureHTTPServers(inv, cfg) if err != nil { @@ -345,3 +352,9 @@ func (*RootCmd) proxyServer() *clibase.Cmd { return cmd } + +func shutdownWithTimeout(shutdown func(context.Context) error, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + return shutdown(ctx) +} From 7e231ab07ad8bfc2b7ebfd82463ebfbff1ea036d Mon Sep 17 00:00:00 2001 From: Colin Adler Date: Tue, 2 May 2023 04:53:22 +0000 Subject: [PATCH 2/2] fixup! fix(server): prevent otel tracer provider from immediately being closed --- enterprise/cli/proxyserver.go | 1 - 1 file changed, 1 deletion(-) diff --git a/enterprise/cli/proxyserver.go b/enterprise/cli/proxyserver.go index 21fe8117a5072..06e3a047b9e4e 100644 --- a/enterprise/cli/proxyserver.go +++ b/enterprise/cli/proxyserver.go @@ -22,7 +22,6 @@ import ( "golang.org/x/xerrors" "cdr.dev/slog" - "github.com/coder/coder/cli" "github.com/coder/coder/cli/clibase" "github.com/coder/coder/cli/cliui"