@@ -2,6 +2,8 @@ package cli
2
2
3
3
import (
4
4
"context"
5
+ "encoding/base64"
6
+ "encoding/json"
5
7
"errors"
6
8
"flag"
7
9
"fmt"
@@ -33,6 +35,7 @@ import (
33
35
"github.com/coder/coder/cli/config"
34
36
"github.com/coder/coder/coderd"
35
37
"github.com/coder/coder/coderd/gitauth"
38
+ "github.com/coder/coder/coderd/telemetry"
36
39
"github.com/coder/coder/codersdk"
37
40
"github.com/coder/coder/codersdk/agentsdk"
38
41
)
@@ -425,6 +428,23 @@ type RootCmd struct {
425
428
noFeatureWarning bool
426
429
}
427
430
431
+ func telemetryInvocation (i * clibase.Invocation ) telemetry.CLIInvocation {
432
+ var topts []telemetry.CLIOption
433
+ for _ , opt := range i .Command .FullOptions () {
434
+ if opt .Value .String () == opt .Default {
435
+ continue
436
+ }
437
+ topts = append (topts , telemetry.CLIOption {
438
+ Name : opt .Name ,
439
+ ValueSource : string (opt .ValueSource ),
440
+ })
441
+ }
442
+ return telemetry.CLIInvocation {
443
+ Command : i .Command .FullName (),
444
+ Options : topts ,
445
+ }
446
+ }
447
+
428
448
// InitClient sets client to a new client.
429
449
// It reads from global configuration files if flags are not set.
430
450
func (r * RootCmd ) InitClient (client * codersdk.Client ) clibase.MiddlewareFunc {
@@ -465,7 +485,18 @@ func (r *RootCmd) InitClient(client *codersdk.Client) clibase.MiddlewareFunc {
465
485
}
466
486
}
467
487
468
- err = r .setClient (client , r .clientURL )
488
+ telemInv := telemetryInvocation (i )
489
+ byt , err := json .Marshal (telemInv )
490
+ if err != nil {
491
+ // Should be impossible
492
+ panic (err )
493
+ }
494
+ err = r .setClient (
495
+ client , r .clientURL ,
496
+ append (r .header , "Coder-CLI-Invokation=" +
497
+ base64 .StdEncoding .EncodeToString (byt ),
498
+ ),
499
+ )
469
500
if err != nil {
470
501
return err
471
502
}
@@ -512,12 +543,12 @@ func (r *RootCmd) InitClient(client *codersdk.Client) clibase.MiddlewareFunc {
512
543
}
513
544
}
514
545
515
- func (r * RootCmd ) setClient (client * codersdk.Client , serverURL * url.URL ) error {
546
+ func (* RootCmd ) setClient (client * codersdk.Client , serverURL * url.URL , headers [] string ) error {
516
547
transport := & headerTransport {
517
548
transport : http .DefaultTransport ,
518
549
header : http.Header {},
519
550
}
520
- for _ , header := range r . header {
551
+ for _ , header := range headers {
521
552
parts := strings .SplitN (header , "=" , 2 )
522
553
if len (parts ) < 2 {
523
554
return xerrors .Errorf ("split header %q had less than two parts" , header )
@@ -533,7 +564,7 @@ func (r *RootCmd) setClient(client *codersdk.Client, serverURL *url.URL) error {
533
564
534
565
func (r * RootCmd ) createUnauthenticatedClient (serverURL * url.URL ) (* codersdk.Client , error ) {
535
566
var client codersdk.Client
536
- err := r .setClient (& client , serverURL )
567
+ err := r .setClient (& client , serverURL , r . header )
537
568
return & client , err
538
569
}
539
570
0 commit comments