--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !cmd_go_bootstrap
+
+package telemetrystats
+
+import (
+ "cmd/go/internal/base"
+ "cmd/go/internal/cfg"
+ "cmd/go/internal/modload"
+ "cmd/internal/telemetry"
+)
+
+func Increment() {
+ incrementConfig()
+ incrementVersionCounters()
+}
+
+// incrementConfig increments counters for the configuration
+// the command is running in.
+func incrementConfig() {
+ if !modload.WillBeEnabled() {
+ telemetry.Inc("go/mode:gopath")
+ } else if workfile := modload.FindGoWork(base.Cwd()); workfile != "" {
+ telemetry.Inc("go/mode:workspace")
+ } else {
+ telemetry.Inc("go/mode:module")
+ }
+ telemetry.Inc("go/platform/target/goos:" + cfg.Goos)
+ telemetry.Inc("go/platform/target/goarch:" + cfg.Goarch)
+ switch cfg.Goarch {
+ case "386":
+ telemetry.Inc("go/platform/target/go386:" + cfg.GO386)
+ case "amd64":
+ telemetry.Inc("go/platform/target/goamd64:" + cfg.GOAMD64)
+ case "arm":
+ telemetry.Inc("go/platform/target/goarm:" + cfg.GOARM)
+ case "arm64":
+ telemetry.Inc("go/platform/target/goarm64:" + cfg.GOARM64)
+ case "mips":
+ telemetry.Inc("go/platform/target/gomips:" + cfg.GOMIPS)
+ case "ppc64":
+ telemetry.Inc("go/platform/target/goppc64:" + cfg.GOPPC64)
+ case "riscv64":
+ telemetry.Inc("go/platform/target/goriscv64:" + cfg.GORISCV64)
+ case "wasm":
+ telemetry.Inc("go/platform/target/gowasm:" + cfg.GOWASM)
+ }
+}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build cmd_go_bootstrap
+
+package telemetrystats
+
+func Increment() {}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !cmd_go_bootstrap && !unix && !windows
+
+package telemetrystats
+
+import "cmd/internal/telemetry"
+
+func incrementVersionCounters() {
+ telemetry.Inc("go/platform:version-not-supported")
+}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !cmd_go_bootstrap && unix
+
+package telemetrystats
+
+import (
+ "bytes"
+ "fmt"
+ "runtime"
+ "strings"
+
+ "cmd/internal/telemetry"
+
+ "golang.org/x/sys/unix"
+)
+
+func incrementVersionCounters() {
+ convert := func(nullterm []byte) string {
+ end := bytes.IndexByte(nullterm, 0)
+ if end < 0 {
+ end = len(nullterm)
+ }
+ return string(nullterm[:end])
+ }
+
+ var v unix.Utsname
+ err := unix.Uname(&v)
+ if err != nil {
+ telemetry.Inc(fmt.Sprintf("go/platform/host/%s/version:unknown-uname-error", runtime.GOOS))
+ return
+ }
+ major, minor, ok := majorMinor(convert(v.Release[:]))
+ if !ok {
+ telemetry.Inc(fmt.Sprintf("go/platform/host/%s/version:unknown-bad-format", runtime.GOOS))
+ return
+ }
+ telemetry.Inc(fmt.Sprintf("go/platform/host/%s/major-version:%s", runtime.GOOS, major))
+ telemetry.Inc(fmt.Sprintf("go/platform/host/%s/version:%s-%s", runtime.GOOS, major, minor))
+
+}
+
+func majorMinor(v string) (string, string, bool) {
+ firstDot := strings.Index(v, ".")
+ if firstDot < 0 {
+ return "", "", false
+ }
+ major := v[:firstDot]
+ v = v[firstDot+len("."):]
+ secondDot := strings.Index(v, ".")
+ minor := v[:secondDot]
+ return major, minor, true
+}
--- /dev/null
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//go:build !cmd_go_bootstrap && windows
+
+package telemetrystats
+
+import (
+ "fmt"
+
+ "cmd/internal/telemetry"
+
+ "golang.org/x/sys/windows"
+)
+
+func incrementVersionCounters() {
+ v := windows.RtlGetVersion()
+ telemetry.Inc(fmt.Sprintf("go/platform/host/windows/major-version:%d", v.MajorVersion))
+ telemetry.Inc(fmt.Sprintf("go/platform/host/windows/version:%d-%d", v.MajorVersion, v.MinorVersion))
+ telemetry.Inc(fmt.Sprintf("go/platform/host/windows/build:%d", v.BuildNumber))
+}
"cmd/go/internal/modload"
"cmd/go/internal/run"
"cmd/go/internal/telemetrycmd"
+ "cmd/go/internal/telemetrystats"
"cmd/go/internal/test"
"cmd/go/internal/tool"
"cmd/go/internal/toolchain"
if cfg.CmdName != "tool" {
telemetry.Inc("go/subcommand:" + strings.ReplaceAll(cfg.CmdName, " ", "-"))
}
+ telemetrystats.Increment()
invoke(cmd, args[used-1:])
base.Exit()
}