Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 67230ba

Browse files
authored
fix: properly shutdown tracers (#4127)
1 parent 3993f66 commit 67230ba

File tree

2 files changed

+35
-14
lines changed

2 files changed

+35
-14
lines changed

cli/server.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
161161
)
162162

163163
if traceEnable || telemetryEnable {
164-
sdkTracerProvider, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
164+
sdkTracerProvider, closeTracing, err := tracing.TracerProvider(ctx, "coderd", tracing.TracerOpts{
165165
Default: traceEnable,
166166
Coder: telemetryEnable && !isTest(),
167167
})
@@ -170,7 +170,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
170170
} else {
171171
// allow time for traces to flush even if command context is canceled
172172
defer func() {
173-
_ = shutdownWithTimeout(sdkTracerProvider, 5*time.Second)
173+
_ = shutdownWithTimeout(closeTracing, 5*time.Second)
174174
}()
175175

176176
d, err := tracing.PostgresDriver(sdkTracerProvider, "coderd.database")
@@ -545,7 +545,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
545545
},
546546
}
547547
defer func() {
548-
_ = shutdownWithTimeout(server, 5*time.Second)
548+
_ = shutdownWithTimeout(server.Shutdown, 5*time.Second)
549549
}()
550550

551551
eg := errgroup.Group{}
@@ -633,7 +633,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
633633
// in-flight requests, give in-flight requests 5 seconds to
634634
// complete.
635635
cmd.Println("Shutting down API server...")
636-
err = shutdownWithTimeout(server, 5*time.Second)
636+
err = shutdownWithTimeout(server.Shutdown, 5*time.Second)
637637
if err != nil {
638638
cmd.Printf("API server shutdown took longer than 5s: %s", err)
639639
} else {
@@ -655,7 +655,7 @@ func Server(newAPI func(context.Context, *coderd.Options) (*coderd.API, error))
655655
if verbose {
656656
cmd.Printf("Shutting down provisioner daemon %d...\n", id)
657657
}
658-
err := shutdownWithTimeout(provisionerDaemon, 5*time.Second)
658+
err := shutdownWithTimeout(provisionerDaemon.Shutdown, 5*time.Second)
659659
if err != nil {
660660
cmd.PrintErrf("Failed to shutdown provisioner daemon %d: %s\n", id, err)
661661
return
@@ -903,10 +903,10 @@ func isLocalURL(ctx context.Context, u *url.URL) (bool, error) {
903903
return false, nil
904904
}
905905

906-
func shutdownWithTimeout(s interface{ Shutdown(context.Context) error }, timeout time.Duration) error {
906+
func shutdownWithTimeout(shutdown func(context.Context) error, timeout time.Duration) error {
907907
ctx, cancel := context.WithTimeout(context.Background(), timeout)
908908
defer cancel()
909-
return s.Shutdown(ctx)
909+
return shutdown(ctx)
910910
}
911911

912912
// nolint:revive

coderd/tracing/exporter.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ package tracing
33
import (
44
"context"
55

6+
"go.opentelemetry.io/otel"
67
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
78
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
89
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
10+
"go.opentelemetry.io/otel/propagation"
911
"go.opentelemetry.io/otel/sdk/resource"
1012
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1113
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
@@ -24,34 +26,53 @@ type TracerOpts struct {
2426

2527
// TracerProvider creates a grpc otlp exporter and configures a trace provider.
2628
// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed.
27-
func TracerProvider(ctx context.Context, service string, opts TracerOpts) (*sdktrace.TracerProvider, error) {
29+
func TracerProvider(ctx context.Context, service string, opts TracerOpts) (*sdktrace.TracerProvider, func(context.Context) error, error) {
2830
res := resource.NewWithAttributes(
2931
semconv.SchemaURL,
3032
// the service name used to display traces in backends
3133
semconv.ServiceNameKey.String(service),
3234
)
3335

34-
tracerOpts := []sdktrace.TracerProviderOption{
35-
sdktrace.WithResource(res),
36-
}
36+
var (
37+
tracerOpts = []sdktrace.TracerProviderOption{
38+
sdktrace.WithResource(res),
39+
}
40+
closers = []func(context.Context) error{}
41+
)
42+
3743
if opts.Default {
3844
exporter, err := DefaultExporter(ctx)
3945
if err != nil {
40-
return nil, xerrors.Errorf("default exporter: %w", err)
46+
return nil, nil, xerrors.Errorf("default exporter: %w", err)
4147
}
48+
closers = append(closers, exporter.Shutdown)
4249
tracerOpts = append(tracerOpts, sdktrace.WithBatcher(exporter))
4350
}
4451
if opts.Coder {
4552
exporter, err := CoderExporter(ctx)
4653
if err != nil {
47-
return nil, xerrors.Errorf("coder exporter: %w", err)
54+
return nil, nil, xerrors.Errorf("coder exporter: %w", err)
4855
}
56+
closers = append(closers, exporter.Shutdown)
4957
tracerOpts = append(tracerOpts, sdktrace.WithBatcher(exporter))
5058
}
5159

5260
tracerProvider := sdktrace.NewTracerProvider(tracerOpts...)
61+
otel.SetTracerProvider(tracerProvider)
62+
otel.SetTextMapPropagator(
63+
propagation.NewCompositeTextMapPropagator(
64+
propagation.TraceContext{},
65+
propagation.Baggage{},
66+
),
67+
)
5368

54-
return tracerProvider, nil
69+
return tracerProvider, func(ctx context.Context) error {
70+
for _, close := range closers {
71+
_ = close(ctx)
72+
}
73+
_ = tracerProvider.Shutdown(ctx)
74+
return nil
75+
}, nil
5576
}
5677

5778
func DefaultExporter(ctx context.Context) (*otlptrace.Exporter, error) {

0 commit comments

Comments
 (0)