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  }