github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/cli/cmd/upload_traces.go (about) 1 package cmd 2 3 import ( 4 "compress/gzip" 5 "context" 6 "fmt" 7 "os" 8 "path/filepath" 9 "time" 10 11 "github.com/spf13/cobra" 12 "go.opentelemetry.io/otel/exporters/otlp/otlptrace" 13 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" 14 tracepb "go.opentelemetry.io/proto/otlp/trace/v1" 15 16 "github.com/datawire/dlib/dlog" 17 "github.com/telepresenceio/telepresence/v2/pkg/tracing" 18 ) 19 20 func uploadTraces() *cobra.Command { 21 return &cobra.Command{ 22 Use: "upload-traces <zipFile> <jaeger target>", 23 Args: cobra.ExactArgs(2), 24 25 Short: "Upload Traces", 26 Long: "Upload Traces to a Jaeger instance", 27 RunE: pushTraces, 28 SilenceUsage: true, 29 SilenceErrors: true, 30 } 31 } 32 33 func traceClient(url string) otlptrace.Client { 34 client := otlptracegrpc.NewClient( 35 otlptracegrpc.WithEndpoint(url), 36 otlptracegrpc.WithInsecure(), 37 ) 38 return client 39 } 40 41 func pushTraces(cmd *cobra.Command, args []string) error { 42 ctx := cmd.Context() 43 ctx, cancel := context.WithTimeout(ctx, 1*time.Minute) 44 defer cancel() 45 zipFile, err := filepath.Abs(args[0]) 46 if err != nil { 47 return err 48 } 49 jaegerTarget := args[1] 50 51 f, err := os.Open(zipFile) 52 if err != nil { 53 return fmt.Errorf("failed to open %s: %w", zipFile, err) 54 } 55 defer f.Close() 56 zipR, err := gzip.NewReader(f) 57 if err != nil { 58 return fmt.Errorf("failed to unzip %s: %w", zipFile, err) 59 } 60 defer zipR.Close() 61 62 client := traceClient(jaegerTarget) 63 pr := tracing.NewProtoReader(zipR, func() *tracepb.ResourceSpans { return &tracepb.ResourceSpans{} }) 64 spans, err := pr.ReadAll(ctx) 65 if err != nil { 66 return err 67 } 68 msg := &tracepb.TracesData{ 69 ResourceSpans: spans, 70 } 71 dlog.Debugf(ctx, "Starting upload of %d traces", len(msg.ResourceSpans)) 72 err = client.Start(ctx) 73 if err != nil { 74 return err 75 } 76 err = client.UploadTraces(ctx, msg.ResourceSpans) 77 if err != nil { 78 return err 79 } 80 err = client.Stop(ctx) 81 if err != nil { 82 return err 83 } 84 fmt.Fprintf(cmd.OutOrStderr(), "Trace file %s uploaded to %s\n", zipFile, jaegerTarget) 85 return nil 86 }