Golang Telemetry 数据生成与查看方法详解

Golang Telemetry 数据生成与查看方法详解 大家好,

我刚将 Go 从 1.21 版本更新到 1.23,最新版本有一个新功能,即 Go 遥测。我已经通过执行 go telemetry on 命令启用了此功能。我的应用程序已开启遥测运行超过两周,但我在 os.UserConfigDir()/go/telemetry 目录下没有找到任何生成的遥测日志文件。我找的位置对吗?还是我遗漏了某些步骤?能否请您指导一下。

根据 Go 文档,只需开启遥测设置就足够了,我们不需要进行任何其他操作来生成这些遥测日志/数据。

谢谢。

8 回复

现在清楚了,谢谢

更多关于Golang Telemetry 数据生成与查看方法详解的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你想确认自己查看的路径是否正确,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())
            }
        }
    }
}

运行此程序将显示确切的遥测数据存储位置。如果目录存在但为空,可能是以下原因:

  1. 遥测数据生成频率:Go 遥测数据不是实时生成的,而是按计划收集和上传。默认情况下,数据收集每周执行一次。

  2. 数据上传后删除:根据 Go 遥测设计,数据在上传到遥测服务器后可能会被删除。你可以检查是否有 .uploaded 标记文件。

  3. 程序运行方式:确保你的 Go 程序是通过 go rungo buildgo test 执行的,这些命令会触发遥测数据收集。

  4. 查看遥测状态:运行 go telemetry status 命令可以查看当前遥测配置状态。

如果问题仍然存在,可以检查 Go 环境变量:

go env GOVERSION
go env GOTELEMETRY

确保 GOTELEMETRY 环境变量没有覆盖你的设置(应为 “on” 或未设置)。

回到顶部