@@ -3,9 +3,11 @@ package tracing
3
3
import (
4
4
"context"
5
5
6
+ "go.opentelemetry.io/otel"
6
7
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
7
8
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
8
9
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
10
+ "go.opentelemetry.io/otel/propagation"
9
11
"go.opentelemetry.io/otel/sdk/resource"
10
12
sdktrace "go.opentelemetry.io/otel/sdk/trace"
11
13
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
@@ -24,34 +26,53 @@ type TracerOpts struct {
24
26
25
27
// TracerProvider creates a grpc otlp exporter and configures a trace provider.
26
28
// 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 ) {
28
30
res := resource .NewWithAttributes (
29
31
semconv .SchemaURL ,
30
32
// the service name used to display traces in backends
31
33
semconv .ServiceNameKey .String (service ),
32
34
)
33
35
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
+
37
43
if opts .Default {
38
44
exporter , err := DefaultExporter (ctx )
39
45
if err != nil {
40
- return nil , xerrors .Errorf ("default exporter: %w" , err )
46
+ return nil , nil , xerrors .Errorf ("default exporter: %w" , err )
41
47
}
48
+ closers = append (closers , exporter .Shutdown )
42
49
tracerOpts = append (tracerOpts , sdktrace .WithBatcher (exporter ))
43
50
}
44
51
if opts .Coder {
45
52
exporter , err := CoderExporter (ctx )
46
53
if err != nil {
47
- return nil , xerrors .Errorf ("coder exporter: %w" , err )
54
+ return nil , nil , xerrors .Errorf ("coder exporter: %w" , err )
48
55
}
56
+ closers = append (closers , exporter .Shutdown )
49
57
tracerOpts = append (tracerOpts , sdktrace .WithBatcher (exporter ))
50
58
}
51
59
52
60
tracerProvider := sdktrace .NewTracerProvider (tracerOpts ... )
61
+ otel .SetTracerProvider (tracerProvider )
62
+ otel .SetTextMapPropagator (
63
+ propagation .NewCompositeTextMapPropagator (
64
+ propagation.TraceContext {},
65
+ propagation.Baggage {},
66
+ ),
67
+ )
53
68
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
55
76
}
56
77
57
78
func DefaultExporter (ctx context.Context ) (* otlptrace.Exporter , error ) {
0 commit comments