| 74 | } |
| 75 | |
| 76 | func runSendTelemetry(ctx context.Context, opts *SendTelemetryOptions) error { |
| 77 | httpClient := &http.Client{ |
| 78 | Timeout: 2 * time.Second, |
| 79 | Transport: &userAgentTransport{ |
| 80 | base: handleUnixDomainSocket(opts.HTTPUnixSocket), |
| 81 | userAgent: fmt.Sprintf("GitHub CLI %s", build.Version), |
| 82 | }, |
| 83 | } |
| 84 | |
| 85 | client := observability.NewTelemetryAPIProtobufClient(opts.TelemetryEndpointURL, httpClient) |
| 86 | |
| 87 | var payload telemetry.SendTelemetryPayload |
| 88 | if err := json.Unmarshal([]byte(opts.PayloadJSON), &payload); err != nil { |
| 89 | return fmt.Errorf("parsing payload JSON: %w", err) |
| 90 | } |
| 91 | |
| 92 | if len(payload.Events) == 0 { |
| 93 | return nil |
| 94 | } |
| 95 | |
| 96 | events := make([]*observability.TelemetryEvent, len(payload.Events)) |
| 97 | for i, event := range payload.Events { |
| 98 | events[i] = &observability.TelemetryEvent{ |
| 99 | App: "github-cli", |
| 100 | EventType: event.Type, |
| 101 | Dimensions: event.Dimensions, |
| 102 | Measures: event.Measures, |
| 103 | } |
| 104 | } |
| 105 | |
| 106 | _, err := client.RecordEvents(ctx, &observability.RecordEventsRequest{ |
| 107 | Events: events, |
| 108 | }) |
| 109 | return err |
| 110 | } |
| 111 | |
| 112 | type userAgentTransport struct { |
| 113 | base http.RoundTripper |