]> Cypherpunks repositories - gostls13.git/commitdiff
cmd: add telemetry for commands in cmd
authorMichael Matloob <matloob@golang.org>
Mon, 13 May 2024 18:59:02 +0000 (14:59 -0400)
committerMichael Matloob <matloob@golang.org>
Tue, 14 May 2024 19:41:17 +0000 (19:41 +0000)
This change modifies the commands in cmd to open counter files,
increment invocations counters and to increment counters for the names
of the flags that were passed in.

cmd/pprof and cmd/vet are both wrappers around tools defined in other
modules which do their own flag processing so we can't directly
increment flag counters right after flags are parsed. For those two
commands we wait to increment counters until after the programs have
returned.

cmd/dist is built with the bootstrap go so it can't depend on telemetry
yet. We can add telemetry support to it once 1.23 is the minimum
bootstrap version.

For #58894

Change-Id: Ic7f6009992465e55c56ad4dc6451bcb1ca51374a
Reviewed-on: https://go-review.googlesource.com/c/go/+/585235
Reviewed-by: Sam Thanawalla <samthanawalla@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

18 files changed:
src/cmd/addr2line/main.go
src/cmd/asm/main.go
src/cmd/buildid/buildid.go
src/cmd/cgo/main.go
src/cmd/covdata/covdata.go
src/cmd/cover/cover.go
src/cmd/distpack/pack.go
src/cmd/doc/main.go
src/cmd/fix/main.go
src/cmd/gofmt/gofmt.go
src/cmd/nm/nm.go
src/cmd/objdump/main.go
src/cmd/pack/pack.go
src/cmd/pprof/pprof.go
src/cmd/preprofile/main.go
src/cmd/test2json/main.go
src/cmd/trace/main.go
src/cmd/vet/main.go

index 6e005a8fac96d6d5715e6cc3033d4db2b5d46544..e77785f156d04140b841aa4b2be1ff0fba5e7ad6 100644 (file)
@@ -28,6 +28,7 @@ import (
        "strings"
 
        "cmd/internal/objfile"
+       "cmd/internal/telemetry"
 )
 
 func printUsage(w *os.File) {
@@ -45,6 +46,7 @@ func usage() {
 func main() {
        log.SetFlags(0)
        log.SetPrefix("addr2line: ")
+       telemetry.Start()
 
        // pprof expects this behavior when checking for addr2line
        if len(os.Args) > 1 && os.Args[1] == "--help" {
@@ -54,6 +56,8 @@ func main() {
 
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("addr2line/invocations")
+       telemetry.CountFlags("addr2line/flag:", *flag.CommandLine)
        if flag.NArg() != 1 {
                usage()
        }
index ba69195056a9ef94f763ccfdbda447f97db62c73..82a2fa80e082c80cecc01aaeabe0176fd27793f9 100644 (file)
@@ -20,16 +20,20 @@ import (
        "cmd/internal/bio"
        "cmd/internal/obj"
        "cmd/internal/objabi"
+       "cmd/internal/telemetry"
 )
 
 func main() {
        log.SetFlags(0)
        log.SetPrefix("asm: ")
+       telemetry.Start()
 
        buildcfg.Check()
        GOARCH := buildcfg.GOARCH
 
        flags.Parse()
+       telemetry.Inc("asm/invocations")
+       telemetry.CountFlags("asm/flag:", *flag.CommandLine)
 
        architecture := arch.Set(GOARCH, *flags.Shared || *flags.Dynlink)
        if architecture == nil {
index 72ad80dbbba02f094aaac43d1e924c5fdf9b39f9..7abc37283fa6ed1e7eb06923a123328c9256b204 100644 (file)
@@ -12,6 +12,7 @@ import (
        "strings"
 
        "cmd/internal/buildid"
+       "cmd/internal/telemetry"
 )
 
 func usage() {
@@ -25,8 +26,11 @@ var wflag = flag.Bool("w", false, "write build ID")
 func main() {
        log.SetPrefix("buildid: ")
        log.SetFlags(0)
+       telemetry.Start()
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("buildid/invocations")
+       telemetry.CountFlags("buildid/flag:", *flag.CommandLine)
        if flag.NArg() != 1 {
                usage()
        }
index a19743fe6188262b876bc2293490f59209d05e6c..c258985fee286d6d2e9add36ef5835121046e918 100644 (file)
@@ -28,6 +28,7 @@ import (
        "cmd/internal/edit"
        "cmd/internal/notsha256"
        "cmd/internal/objabi"
+       "cmd/internal/telemetry"
 )
 
 // A Package collects information about the package we're going to write.
@@ -257,8 +258,11 @@ var goarch, goos, gomips, gomips64 string
 var gccBaseCmd []string
 
 func main() {
+       telemetry.Start()
        objabi.AddVersionFlag() // -V
        objabi.Flagparse(usage)
+       telemetry.Inc("cgo/invocations")
+       telemetry.CountFlags("cgo/flag:", *flag.CommandLine)
 
        if *gccgoDefineCgoIncomplete {
                if !*gccgo {
index 549efea20ab71a431222d76b928a5aa86a7506ce..b280203f0cf5d3274f163ddd42cd35a9a1049e95 100644 (file)
@@ -7,6 +7,7 @@ package main
 import (
        "cmd/internal/cov"
        "cmd/internal/pkgpattern"
+       "cmd/internal/telemetry"
        "flag"
        "fmt"
        "os"
@@ -108,6 +109,8 @@ const (
 )
 
 func main() {
+       telemetry.Start()
+
        // First argument should be mode/subcommand.
        if len(os.Args) < 2 {
                usage("missing command selector")
@@ -143,6 +146,8 @@ func main() {
                op.Usage("")
        }
        flag.Parse()
+       telemetry.Inc("covdata/invocations")
+       telemetry.CountFlags("covdata/flag:", *flag.CommandLine)
 
        // Mode-independent flag setup
        dbgtrace(1, "starting mode-independent setup")
index d4e529bcde6f8aee5cebd60195f070be3e621cc8..912f7cafb50247c196052cac54237f456969d8ea 100644 (file)
@@ -26,6 +26,7 @@ import (
 
        "cmd/internal/edit"
        "cmd/internal/objabi"
+       "cmd/internal/telemetry"
 )
 
 const usageMessage = "" +
@@ -86,9 +87,13 @@ const (
 )
 
 func main() {
+       telemetry.Start()
+
        objabi.AddVersionFlag()
        flag.Usage = usage
        objabi.Flagparse(usage)
+       telemetry.Inc("cover/invocations")
+       telemetry.CountFlags("cover/flag:", *flag.CommandLine)
 
        // Usage information when no arguments.
        if flag.NFlag() == 0 && flag.NArg() == 0 {
index cf507edb4de229335489002c72939d4f80dd8bbe..0faab5c0b8f1fdfbe22ae279a2b7f72af146f52e 100644 (file)
@@ -44,6 +44,8 @@ import (
        "runtime"
        "strings"
        "time"
+
+       "cmd/internal/telemetry"
 )
 
 func usage() {
@@ -67,8 +69,11 @@ var (
 func main() {
        log.SetPrefix("distpack: ")
        log.SetFlags(0)
+       telemetry.Start()
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("distpack/invocations")
+       telemetry.CountFlags("distpack/flag:", *flag.CommandLine)
        if flag.NArg() != 0 {
                usage()
        }
index 273d7febbc37cca568c30811e8aac8b88879f704..d02bf65c40ff97f2ab5e4926257909f3e42ab694 100644 (file)
@@ -54,6 +54,8 @@ import (
        "path"
        "path/filepath"
        "strings"
+
+       "cmd/internal/telemetry"
 )
 
 var (
@@ -85,6 +87,7 @@ func usage() {
 func main() {
        log.SetFlags(0)
        log.SetPrefix("doc: ")
+       telemetry.Start()
        dirsInit()
        err := do(os.Stdout, flag.CommandLine, os.Args[1:])
        if err != nil {
@@ -105,6 +108,8 @@ func do(writer io.Writer, flagSet *flag.FlagSet, args []string) (err error) {
        flagSet.BoolVar(&showSrc, "src", false, "show source code for symbol")
        flagSet.BoolVar(&short, "short", false, "one-line representation for each symbol")
        flagSet.Parse(args)
+       telemetry.Inc("doc/invocations")
+       telemetry.CountFlags("doc/flag:", *flag.CommandLine)
        if chdir != "" {
                if err := os.Chdir(chdir); err != nil {
                        return err
index db67b4ba07a55e343d8da645d65464b37306908c..b0aabae889bc11001a6c5992abe8e4b8a8a33401 100644 (file)
@@ -21,6 +21,8 @@ import (
        "path/filepath"
        "sort"
        "strings"
+
+       "cmd/internal/telemetry"
 )
 
 var (
@@ -63,8 +65,11 @@ func usage() {
 }
 
 func main() {
+       telemetry.Start()
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("fix/invocations")
+       telemetry.CountFlags("fix/flag:", *flag.CommandLine)
 
        if !version.IsValid(*goVersion) {
                report(fmt.Errorf("invalid -go=%s", *goVersion))
index 341c79ab8e599fce6e8401f908f84d89e7a8312d..03f7bef89c3eb8b7ff4bedee13e4fad512dc941d 100644 (file)
@@ -25,6 +25,8 @@ import (
        "strconv"
        "strings"
 
+       "cmd/internal/telemetry"
+
        "golang.org/x/sync/semaphore"
 )
 
@@ -372,8 +374,11 @@ func main() {
 }
 
 func gofmtMain(s *sequencer) {
+       telemetry.Start()
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("gofmt/invocations")
+       telemetry.CountFlags("gofmt/flag:", *flag.CommandLine)
 
        if *cpuprofile != "" {
                fdSem <- true
index 78fa60014b55395ea33d8e576864e258d71757a8..62cf155362751bd8730e397262db673cdc82620e 100644 (file)
@@ -13,6 +13,7 @@ import (
        "sort"
 
        "cmd/internal/objfile"
+       "cmd/internal/telemetry"
 )
 
 const helpText = `usage: go tool nm [options] file...
@@ -67,8 +68,11 @@ func (nflag) String() string {
 
 func main() {
        log.SetFlags(0)
+       telemetry.Start()
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("nm/invocations")
+       telemetry.CountFlags("nm/flag:", *flag.CommandLine)
 
        switch *sortOrder {
        case "address", "name", "none", "size":
index 6605f8a60ce18e500f639075da72e0fc99918853..bd1762636d0499acf79e5f2453d2c0ef7aec8e51 100644 (file)
@@ -41,6 +41,7 @@ import (
        "strings"
 
        "cmd/internal/objfile"
+       "cmd/internal/telemetry"
 )
 
 var printCode = flag.Bool("S", false, "print Go code alongside assembly")
@@ -57,9 +58,12 @@ func usage() {
 func main() {
        log.SetFlags(0)
        log.SetPrefix("objdump: ")
+       telemetry.Start()
 
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("objdump/invocations")
+       telemetry.CountFlags("objdump/flag:", *flag.CommandLine)
        if flag.NArg() != 1 && flag.NArg() != 3 {
                usage()
        }
index 412ea36d60fa905ffbe3987d301640b5d21f666a..6d7eaf7e5bc36a06e2dec98481f07f69fc1cacef 100644 (file)
@@ -6,6 +6,7 @@ package main
 
 import (
        "cmd/internal/archive"
+       "cmd/internal/telemetry"
        "fmt"
        "io"
        "io/fs"
@@ -30,6 +31,7 @@ func usage() {
 func main() {
        log.SetFlags(0)
        log.SetPrefix("pack: ")
+       telemetry.Start()
        // need "pack op archive" at least.
        if len(os.Args) < 3 {
                log.Print("not enough arguments")
@@ -37,6 +39,8 @@ func main() {
                usage()
        }
        setOp(os.Args[1])
+       telemetry.Inc("pack/invocations")
+       telemetry.Inc("pack/op:" + string(op))
        var ar *Archive
        switch op {
        case 'p':
index 24d6ee04a0c150d31959db98da04666dea3610c0..69d3201cdb9396232aaea9d365ecb1d59ee78902 100644 (file)
@@ -12,6 +12,7 @@ package main
 import (
        "crypto/tls"
        "debug/dwarf"
+       "flag"
        "fmt"
        "io"
        "net/http"
@@ -24,18 +25,23 @@ import (
        "time"
 
        "cmd/internal/objfile"
+       "cmd/internal/telemetry"
 
        "github.com/google/pprof/driver"
        "github.com/google/pprof/profile"
 )
 
 func main() {
+       telemetry.Start()
+       telemetry.Inc("pprof/invocations")
        options := &driver.Options{
                Fetch: new(fetcher),
                Obj:   new(objTool),
                UI:    newUI(),
        }
-       if err := driver.PProf(options); err != nil {
+       err := driver.PProf(options)
+       telemetry.CountFlags("pprof/flag:", *flag.CommandLine) // pprof will use the flag package as its default
+       if err != nil {
                fmt.Fprintf(os.Stderr, "%v\n", err)
                os.Exit(2)
        }
index f29b5279e20c4aaba3f85e616e8cef16c514d04a..78063c1463ba3179e5d8e1cf2cce44d1b5d17876 100644 (file)
@@ -18,6 +18,7 @@ import (
        "bufio"
        "cmd/internal/objabi"
        "cmd/internal/pgo"
+       "cmd/internal/telemetry"
        "flag"
        "fmt"
        "log"
@@ -31,8 +32,8 @@ func usage() {
 }
 
 var (
-       output  = flag.String("o", "", "output file path")
-       input   = flag.String("i", "", "input pprof file path")
+       output = flag.String("o", "", "output file path")
+       input  = flag.String("i", "", "input pprof file path")
 )
 
 func preprocess(profileFile string, outputFile string) error {
@@ -72,9 +73,12 @@ func main() {
 
        log.SetFlags(0)
        log.SetPrefix("preprofile: ")
+       telemetry.Start()
 
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("preprofile/invocations")
+       telemetry.CountFlags("preprofile/flag:", *flag.CommandLine)
        if *input == "" {
                log.Print("Input pprof path required (-i)")
                usage()
index 09d5fcec79cb499c8b239ffe7fae7154b9edffef..36e7cf90b560c48c03a090fff549d34d19dba5da 100644 (file)
@@ -96,6 +96,7 @@ import (
        "os/exec"
        "os/signal"
 
+       "cmd/internal/telemetry"
        "cmd/internal/test2json"
 )
 
@@ -115,8 +116,12 @@ func ignoreSignals() {
 }
 
 func main() {
+       telemetry.Start()
+
        flag.Usage = usage
        flag.Parse()
+       telemetry.Inc("test2json/invocations")
+       telemetry.CountFlags("test2json/flag:", *flag.CommandLine)
 
        var mode test2json.Mode
        if *flagT {
index 5f0d6f612b692e666ccdcc1e1dadb42404340551..2c0b15623d8076942045fd64c52638681950dc80 100644 (file)
@@ -7,6 +7,7 @@ package main
 import (
        "bufio"
        "cmd/internal/browser"
+       "cmd/internal/telemetry"
        cmdv2 "cmd/trace/v2"
        "flag"
        "fmt"
@@ -65,11 +66,14 @@ var (
 )
 
 func main() {
+       telemetry.Start()
        flag.Usage = func() {
                fmt.Fprint(os.Stderr, usageMessage)
                os.Exit(2)
        }
        flag.Parse()
+       telemetry.Inc("trace/invocations")
+       telemetry.CountFlags("trace/flag:", *flag.CommandLine)
 
        // Go 1.7 traces embed symbol info and does not require the binary.
        // But we optionally accept binary as first arg for Go 1.5 traces.
index 7b9a700635d5afb8e7a5f628ca48302f792469ae..eff82dcc71079d5b149a97024a1ec5f76900d354 100644 (file)
@@ -6,6 +6,8 @@ package main
 
 import (
        "cmd/internal/objabi"
+       "cmd/internal/telemetry"
+       "flag"
 
        "golang.org/x/tools/go/analysis/unitchecker"
 
@@ -45,8 +47,10 @@ import (
 )
 
 func main() {
+       telemetry.Start()
        objabi.AddVersionFlag()
 
+       telemetry.Inc("vet/invocations")
        unitchecker.Main(
                appends.Analyzer,
                asmdecl.Analyzer,
@@ -82,4 +86,8 @@ func main() {
                unsafeptr.Analyzer,
                unusedresult.Analyzer,
        )
+
+       // It's possible that unitchecker will exit early. In
+       // those cases the flags won't be counted.
+       telemetry.CountFlags("vet/flag:", *flag.CommandLine)
 }