|
8 | 8 | "errors" |
9 | 9 | "flag" |
10 | 10 | "fmt" |
| 11 | + "os" |
| 12 | + "strings" |
11 | 13 | "time" |
12 | 14 |
|
13 | 15 | "github.com/go-logr/zapr" |
@@ -66,77 +68,100 @@ func main() { |
66 | 68 | } |
67 | 69 |
|
68 | 70 | func createTracers(cfg *tracegen.Config, logger *zap.Logger) ([]trace.Tracer, func(context.Context) error) { |
69 | | - if cfg.Services < 1 { |
70 | | - cfg.Services = 1 |
71 | | - } |
72 | | - var shutdown []func(context.Context) error |
73 | | - var tracers []trace.Tracer |
74 | | - for s := 0; s < cfg.Services; s++ { |
75 | | - svc := cfg.Service |
76 | | - if cfg.Services > 1 { |
77 | | - svc = fmt.Sprintf("%s-%02d", svc, s) |
78 | | - } |
79 | | - |
80 | | - exp, err := createOtelExporter(cfg.TraceExporter) |
81 | | - if err != nil { |
82 | | - logger.Sugar().Fatalf("cannot create trace exporter %s: %s", cfg.TraceExporter, err) |
83 | | - } |
84 | | - logger.Sugar().Infof("using %s trace exporter for service %s", cfg.TraceExporter, svc) |
85 | | - |
86 | | - res, err := resource.New( |
87 | | - context.Background(), |
88 | | - resource.WithSchemaURL(otelsemconv.SchemaURL), |
89 | | - resource.WithAttributes(otelsemconv.ServiceNameAttribute(svc)), |
90 | | - resource.WithTelemetrySDK(), |
91 | | - resource.WithHost(), |
92 | | - resource.WithOSType(), |
93 | | - ) |
94 | | - if err != nil { |
95 | | - logger.Sugar().Fatalf("resource creation failed: %s", err) |
96 | | - } |
97 | | - |
98 | | - opts := []sdktrace.TracerProviderOption{ |
99 | | - sdktrace.WithBatcher(exp, sdktrace.WithBlocking()), |
100 | | - sdktrace.WithResource(res), |
101 | | - } |
102 | | - if flagAdaptiveSamplingEndpoint != "" { |
103 | | - jaegerRemoteSampler := jaegerremote.New( |
104 | | - svc, |
105 | | - jaegerremote.WithSamplingServerURL(flagAdaptiveSamplingEndpoint), |
106 | | - jaegerremote.WithSamplingRefreshInterval(5*time.Second), |
107 | | - jaegerremote.WithInitialSampler(sdktrace.TraceIDRatioBased(0.5)), |
| 71 | + if cfg.Services < 1 { |
| 72 | + cfg.Services = 1 |
| 73 | + } |
| 74 | + var shutdown []func(context.Context) error |
| 75 | + var tracers []trace.Tracer |
| 76 | + |
| 77 | + var file *os.File |
| 78 | + exporterType := cfg.TraceExporter |
| 79 | + |
| 80 | + if strings.HasPrefix(cfg.TraceExporter, "file:") { |
| 81 | + filename := strings.TrimPrefix(cfg.TraceExporter, "file:") |
| 82 | + var err error |
| 83 | + file, err = os.Create(filename) |
| 84 | + if err != nil { |
| 85 | + logger.Sugar().Fatalf("cannot create output file %s: %s", filename, err) |
| 86 | + } |
| 87 | + exporterType = "stdout" |
| 88 | + } |
| 89 | + |
| 90 | + for s := 0; s < cfg.Services; s++ { |
| 91 | + svc := cfg.Service |
| 92 | + if cfg.Services > 1 { |
| 93 | + svc = fmt.Sprintf("%s-%02d", svc, s) |
| 94 | + } |
| 95 | + |
| 96 | + exp, err := createOtelExporter(exporterType, file) |
| 97 | + if err != nil { |
| 98 | + logger.Sugar().Fatalf("cannot create trace exporter %s: %s", cfg.TraceExporter, err) |
| 99 | + } |
| 100 | + logger.Sugar().Infof("using %s trace exporter for service %s", cfg.TraceExporter, svc) |
| 101 | + |
| 102 | + res, err := resource.New( |
| 103 | + context.Background(), |
| 104 | + resource.WithSchemaURL(otelsemconv.SchemaURL), |
| 105 | + resource.WithAttributes(otelsemconv.ServiceNameAttribute(svc)), |
| 106 | + resource.WithTelemetrySDK(), |
| 107 | + resource.WithHost(), |
| 108 | + resource.WithOSType(), |
| 109 | + ) |
| 110 | + if err != nil { |
| 111 | + logger.Sugar().Fatalf("resource creation failed: %s", err) |
| 112 | + } |
| 113 | + |
| 114 | + opts := []sdktrace.TracerProviderOption{ |
| 115 | + sdktrace.WithBatcher(exp, sdktrace.WithBlocking()), |
| 116 | + sdktrace.WithResource(res), |
| 117 | + } |
| 118 | + if flagAdaptiveSamplingEndpoint != "" { |
| 119 | + jaegerRemoteSampler := jaegerremote.New( |
| 120 | + svc, |
| 121 | + jaegerremote.WithSamplingServerURL(flagAdaptiveSamplingEndpoint), |
| 122 | + jaegerremote.WithSamplingRefreshInterval(5*time.Second), |
| 123 | + jaegerremote.WithInitialSampler(sdktrace.TraceIDRatioBased(0.5)), |
108 | 124 | ) |
109 | | - opts = append(opts, sdktrace.WithSampler(jaegerRemoteSampler)) |
110 | | - logger.Sugar().Infof("using adaptive sampling URL: %s", flagAdaptiveSamplingEndpoint) |
111 | | - } |
112 | | - tp := sdktrace.NewTracerProvider(opts...) |
113 | | - tracers = append(tracers, tp.Tracer(cfg.Service)) |
114 | | - shutdown = append(shutdown, tp.Shutdown) |
115 | | - } |
116 | | - return tracers, func(ctx context.Context) error { |
117 | | - var errs []error |
118 | | - for _, f := range shutdown { |
119 | | - errs = append(errs, f(ctx)) |
120 | | - } |
121 | | - return errors.Join(errs...) |
122 | | - } |
| 125 | + opts = append(opts, sdktrace.WithSampler(jaegerRemoteSampler)) |
| 126 | + logger.Sugar().Infof("using adaptive sampling URL: %s", flagAdaptiveSamplingEndpoint) |
| 127 | + } |
| 128 | + tp := sdktrace.NewTracerProvider(opts...) |
| 129 | + tracers = append(tracers, tp.Tracer(cfg.Service)) |
| 130 | + shutdown = append(shutdown, tp.Shutdown) |
| 131 | + } |
| 132 | + |
| 133 | + if file != nil { |
| 134 | + shutdown = append(shutdown, func(_ context.Context) error { |
| 135 | + return file.Close() |
| 136 | + }) |
| 137 | + } |
| 138 | + |
| 139 | + return tracers, func(ctx context.Context) error { |
| 140 | + var errs []error |
| 141 | + for _, f := range shutdown { |
| 142 | + errs = append(errs, f(ctx)) |
| 143 | + } |
| 144 | + return errors.Join(errs...) |
| 145 | + } |
123 | 146 | } |
124 | 147 |
|
125 | | -func createOtelExporter(exporterType string) (sdktrace.SpanExporter, error) { |
| 148 | +func createOtelExporter(exporterType string, fileWriter *os.File) (sdktrace.SpanExporter, error) { |
| 149 | + if fileWriter != nil { |
| 150 | + return stdouttrace.New( |
| 151 | + stdouttrace.WithWriter(fileWriter), |
| 152 | + ) |
| 153 | + } |
| 154 | + |
126 | 155 | var exporter sdktrace.SpanExporter |
127 | 156 | var err error |
128 | 157 | switch exporterType { |
129 | 158 | case "jaeger": |
130 | 159 | return nil, errors.New("jaeger exporter is no longer supported, please use otlp") |
131 | 160 | case "otlp", "otlp-http": |
132 | | - client := otlptracehttp.NewClient( |
133 | | - otlptracehttp.WithInsecure(), |
134 | | - ) |
| 161 | + client := otlptracehttp.NewClient(otlptracehttp.WithInsecure()) |
135 | 162 | exporter, err = otlptrace.New(context.Background(), client) |
136 | 163 | case "otlp-grpc": |
137 | | - client := otlptracegrpc.NewClient( |
138 | | - otlptracegrpc.WithInsecure(), |
139 | | - ) |
| 164 | + client := otlptracegrpc.NewClient(otlptracegrpc.WithInsecure()) |
140 | 165 | exporter, err = otlptrace.New(context.Background(), client) |
141 | 166 | case "stdout": |
142 | 167 | exporter, err = stdouttrace.New() |
|
0 commit comments