Golang Telemetry 数据生成与查看方法详解
Golang Telemetry 数据生成与查看方法详解 大家好,
我刚将 Go 从 1.21 版本更新到 1.23,最新版本有一个新功能,即 Go 遥测。我已经通过执行 go telemetry on 命令启用了此功能。我的应用程序已开启遥测运行超过两周,但我在 os.UserConfigDir()/go/telemetry 目录下没有找到任何生成的遥测日志文件。我找的位置对吗?还是我遗漏了某些步骤?能否请您指导一下。
根据 Go 文档,只需开启遥测设置就足够了,我们不需要进行任何其他操作来生成这些遥测日志/数据。
谢谢。
如果你想确认自己查看的路径是否正确,gotelemetry env 会显示本地的遥测文件夹路径。(注意:gotelemetry 必须是一个单词。)
如果运行 go telemetry(两个单词)显示为“on”,那么你应该可以使用 gotelemetry view 来查看本地数据报告:Go Telemetry - The Go Programming Language
感谢您的回复。 很抱歉在同一个话题上打扰您,网上没有太多可用的文档。
我现在有点困惑,即使在开发环境中运行 Go 应用程序,我们也是构建它并创建二进制可执行文件,然后只运行这些可执行文件。这是否意味着如果我们在开发环境中运行可执行文件,就不会生成遥测数据?如果是这样,那么这些遥测数据何时才会生成呢?
我还需要补充一点,你需要安装 gotelemetry:
go install golang.org/x/telemetry/cmd/gotelemetry@latest
另外,由于测试失败,遥测功能目前在 OpenBSD 上是禁用的(如果你使用的是 OpenBSD,将看不到数据):
nick:
应该补充说明你需要安装
gotelemetry:
感谢您的帮助——这非常有帮助。我还想再澄清一个细节,具体如下。
由于 Go 是一门编译型语言,你可以编译 Go 应用程序来生成一个可执行文件(例如,Windows 上是 .exe)。这个可执行文件随后可以直接在目标(客户)机器上运行,而无需安装 Go 或 Go 库。
关于遥测,如果我们需要在目标/客户机器上禁用遥测,我们必须在编译代码的机器上关闭遥测。通过在编译时将遥测设置为 OFF,编译出的可执行文件在目标机器上运行时将不会生成遥测数据。我的理解正确吗?
很高兴能帮到你!
关于遥测功能,如果我们需要在目标/客户机上禁用遥测,就必须在编译代码的机器上关闭遥测。通过在编译时将遥测设置为OFF,编译出的可执行文件在目标机器上运行时就不会生成遥测数据。我的理解正确吗?
你不需要在为分发而构建二进制文件时禁用遥测——遥测功能不适用于你编译的二进制文件,它只适用于Go的开发工具链。
Go的遥测功能仅用于了解Go开发者如何使用Go工具链(go命令以及其他开发者二进制文件,如gopls)。
你用go命令生成的二进制文件不会向Go团队发送遥测数据。如果你的用户使用你用Go制作的二进制文件,他们不需要做任何更改;并且,你在Go工具链中启用遥测功能,并不会将你的用户纳入数据收集范围。
这是否意味着,如果我们在开发环境中运行可执行文件,就不会生成遥测数据?如果是这样,那么遥测数据何时会生成呢?
如果你使用 go run 运行你的程序,Go 会收集关于 go run 进程的遥测数据。
当你独立于 Go 工具链运行一个已编译的应用程序时,Go 不会收集遥测数据。如果你使用 go build 编译你的 hello 应用程序,然后运行 ./hello,Go 会从 go build 的调用中收集遥测数据,但不会从 ./hello 中收集。
Go 遥测页面指出,其范围仅限于 Go 的工具链:
Go 遥测是 Go 工具链程序收集其性能和用法数据的一种方式。这里的“Go 工具链”指的是由 Go 团队维护的开发者工具,包括
go命令以及补充工具,例如 Go 语言服务器gopls或 Go 安全工具govulncheck。Go 遥测仅用于 Go 团队维护的程序及其选定的依赖项,如 Delve。
根据你的描述,问题可能在于对遥测数据存储位置的理解。Go 1.23 的遥测数据默认存储在 os.UserConfigDir()/go/telemetry/local 目录下,而不是直接放在 telemetry 目录中。
你可以通过以下代码示例来验证存储路径:
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
configDir, err := os.UserConfigDir()
if err != nil {
fmt.Printf("获取配置目录失败: %v\n", err)
return
}
telemetryPath := filepath.Join(configDir, "go", "telemetry", "local")
fmt.Printf("遥测数据存储路径: %s\n", telemetryPath)
// 检查目录是否存在
if _, err := os.Stat(telemetryPath); os.IsNotExist(err) {
fmt.Println("遥测目录不存在")
} else {
fmt.Println("遥测目录存在")
// 列出目录中的文件
files, err := os.ReadDir(telemetryPath)
if err != nil {
fmt.Printf("读取目录失败: %v\n", err)
return
}
if len(files) == 0 {
fmt.Println("目录为空,无遥测数据文件")
} else {
fmt.Println("找到的遥测文件:")
for _, file := range files {
fmt.Printf(" - %s\n", file.Name())
}
}
}
}
运行此程序将显示确切的遥测数据存储位置。如果目录存在但为空,可能是以下原因:
-
遥测数据生成频率:Go 遥测数据不是实时生成的,而是按计划收集和上传。默认情况下,数据收集每周执行一次。
-
数据上传后删除:根据 Go 遥测设计,数据在上传到遥测服务器后可能会被删除。你可以检查是否有
.uploaded标记文件。 -
程序运行方式:确保你的 Go 程序是通过
go run、go build或go test执行的,这些命令会触发遥测数据收集。 -
查看遥测状态:运行
go telemetry status命令可以查看当前遥测配置状态。
如果问题仍然存在,可以检查 Go 环境变量:
go env GOVERSION
go env GOTELEMETRY
确保 GOTELEMETRY 环境变量没有覆盖你的设置(应为 “on” 或未设置)。


