diff --git a/cmd/tracegen/README.md b/cmd/tracegen/README.md index 29d165aee0c..ee273b721b6 100644 --- a/cmd/tracegen/README.md +++ b/cmd/tracegen/README.md @@ -9,7 +9,8 @@ The binary is available from the Releases page, as well as a Docker image: $ docker run jaegertracing/jaeger-tracegen -service abcd -traces 10 ``` -The generator can be configured to export traces in different formats, via `-exporter` flag. +The generator can be configured to export traces in different formats, via `-trace-exporter` flag. + By default, the exporters send data to `localhost`. If running in a container, this refers to the networking namespace of the container itself, so to export to another container, the exporters need to be provided with appropriate location. diff --git a/cmd/tracegen/main.go b/cmd/tracegen/main.go index 34de8b272be..6770ad0b4f9 100644 --- a/cmd/tracegen/main.go +++ b/cmd/tracegen/main.go @@ -8,6 +8,8 @@ import ( "errors" "flag" "fmt" + "os" + "strings" "time" "github.com/go-logr/zapr" @@ -71,13 +73,27 @@ func createTracers(cfg *tracegen.Config, logger *zap.Logger) ([]trace.Tracer, fu } var shutdown []func(context.Context) error var tracers []trace.Tracer + + var file *os.File + exporterType := cfg.TraceExporter + + if strings.HasPrefix(cfg.TraceExporter, "file:") { + filename := strings.TrimPrefix(cfg.TraceExporter, "file:") + var err error + file, err = os.Create(filename) + if err != nil { + logger.Sugar().Fatalf("cannot create output file %s: %s", filename, err) + } + exporterType = "file" + } + for s := 0; s < cfg.Services; s++ { svc := cfg.Service if cfg.Services > 1 { svc = fmt.Sprintf("%s-%02d", svc, s) } - exp, err := createOtelExporter(cfg.TraceExporter) + exp, err := createOtelExporter(exporterType, file) if err != nil { logger.Sugar().Fatalf("cannot create trace exporter %s: %s", cfg.TraceExporter, err) } @@ -113,6 +129,13 @@ func createTracers(cfg *tracegen.Config, logger *zap.Logger) ([]trace.Tracer, fu tracers = append(tracers, tp.Tracer(cfg.Service)) shutdown = append(shutdown, tp.Shutdown) } + + if file != nil { + shutdown = append(shutdown, func(_ context.Context) error { + return file.Close() + }) + } + return tracers, func(ctx context.Context) error { var errs []error for _, f := range shutdown { @@ -122,21 +145,21 @@ func createTracers(cfg *tracegen.Config, logger *zap.Logger) ([]trace.Tracer, fu } } -func createOtelExporter(exporterType string) (sdktrace.SpanExporter, error) { +func createOtelExporter(exporterType string, fileWriter *os.File) (sdktrace.SpanExporter, error) { var exporter sdktrace.SpanExporter var err error switch exporterType { + case "file": + return stdouttrace.New( + stdouttrace.WithWriter(fileWriter), + ) case "jaeger": return nil, errors.New("jaeger exporter is no longer supported, please use otlp") case "otlp", "otlp-http": - client := otlptracehttp.NewClient( - otlptracehttp.WithInsecure(), - ) + client := otlptracehttp.NewClient(otlptracehttp.WithInsecure()) exporter, err = otlptrace.New(context.Background(), client) case "otlp-grpc": - client := otlptracegrpc.NewClient( - otlptracegrpc.WithInsecure(), - ) + client := otlptracegrpc.NewClient(otlptracegrpc.WithInsecure()) exporter, err = otlptrace.New(context.Background(), client) case "stdout": exporter, err = stdouttrace.New() diff --git a/internal/tracegen/config.go b/internal/tracegen/config.go index 560740184e2..b9d056ed328 100644 --- a/internal/tracegen/config.go +++ b/internal/tracegen/config.go @@ -46,7 +46,7 @@ func (c *Config) Flags(fs *flag.FlagSet) { fs.DurationVar(&c.Duration, "duration", 0, "For how long to run the test if greater than 0s (overrides -traces).") fs.StringVar(&c.Service, "service", "tracegen", "Service name prefix to use") fs.IntVar(&c.Services, "services", 1, "Number of unique suffixes to add to service name when generating traces, e.g. tracegen-01 (but only one service per trace)") - fs.StringVar(&c.TraceExporter, "trace-exporter", "otlp-http", "Trace exporter (otlp/otlp-http|otlp-grpc|stdout). Exporters can be additionally configured via environment variables, see https://github.com/jaegertracing/jaeger/blob/main/cmd/tracegen/README.md") + fs.StringVar(&c.TraceExporter, "trace-exporter", "otlp-http", "Trace exporter (otlp/otlp-http|otlp-grpc|stdout|file:{filename}). Exporters can be additionally configured via environment variables, see https://github.com/jaegertracing/jaeger/blob/main/cmd/tracegen/README.md") } // Run executes the test scenario.