查看Go应用的编译信息

首先找到Go应用路径, ps -ef | grep 进程关键字

如果ps结果内Go应用路径不是完整路径,使用 readlink -f /proc/[pid]/exe 查看Go应用的完整路径。

使用ls Go应用路径 查看路径是否存在,如果不存在则说明应用在容器内运行,路径为/proc/[pid]/root/Go应用路径

下载解析工具

下载链接

然后解压,里面包含amd64和arm64 两种CPU架构的文件,

wget https://wukongdoc.tingyun.com/apm/deploy/Go/image/parser.tar.gz
tar -xzf parser.tar.gz

运行解析工具

选择和当前主机CPU架构一致的parser, 运行parser,输出解析结果

./parser-amd64 Go应用路径

例如:

[nb@bogon tmp]$ ./parser-amd64 /opt/bin/watchdog

statically linked.

ELF Type: ET_EXEC
Version: 1
Machine: EM_X86_64

go version:
go1.22.10

go modules:
path    watchdog
mod     watchdog       (devel)
dep     github.com/shirou/gopsutil/v3   v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
dep     github.com/tklauser/go-sysconf  v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
dep     github.com/tklauser/numcpus     v0.6.1  h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
dep     go.uber.org/multierr    v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
dep     go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
dep     golang.org/x/sys        v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
dep     gopkg.in/natefinch/lumberjack.v2        v2.2.1  h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
dep     gopkg.in/yaml.v3        v3.0.1  h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
build   -buildmode=exe
build   -compiler=gc
build   -ldflags="-s -w"
build   DefaultGODEBUG=httplaxcontentlength=1,httpmuxgo121=1,netedns0=0,panicnil=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1
build   CGO_ENABLED=0
build   GOARCH=amd64
build   GOOS=linux
build   GOAMD64=v1
build   vcs=git
build   vcs.revision=eea4e683f82259bcefeee374141508b7fbf3b032
build   vcs.time=2025-02-11T10:13:41Z
build   vcs.modified=true

其中: statically linked说明应用是静态链接的; EM_X86_64 说明应用CPU架构为amd64

查看Go探针日志

日志名称 用途
logs/oneagent/preload.log 自动识别Go进程的日志
logs/agent/golang_bootstrap.log 启动时记录Go版本、Go编译选项等信息
logs/agent/golang_agent.log 记录探针运行状态
logs/agent/golang_daemon.log 和Collector通讯日志,数据上报日志

没有Go应用数据上报时,排查思路

步骤1. 查看探针版本

cat /opt/tingyun-oneagent/Version

查看是否大于等于2.5.8.0,低版本探针不支持自动注入Go应用。

步骤2. 查看系统CPU架构

uname -m

暂不支持CPU架构为ARM64的Linux 操作系统。

步骤3. 查看是否有注入进程

ps -ef | grep Go应用名

查看结果内是否包含agentinject, 如果没有,说明Go探针自动注入失败。

自动注入成功后,应该有类似下面输出:

[nb@bogon]$ ps -ef | grep simple-go-1.23-static
nb        956856  695456  00:00:00 /opt/tingyun-oneagent/agent/go_4.0.2/bin/agentinject ./simple-go-1.23-static
nb        956858       1  00:00:00 ./simple-go-1.23-static

步骤4. 自动注入失败:检查嵌码开关

UniAgent Linux方式:

  • 检查/opt/tingyun-oneagent/conf/interceptor.conf文件中go_enabled开关是否开启,go.namelist是否和Go应用名匹配。

  • 检查'logs/oneagent/preload.log' 日志中: 是否有匹配的 go Name Matched记录, 确认应用名是否匹配。

UniAgent Kubernetes方式:

  • 无需检查。

步骤5. 自动注入失败:检查Go应用编译使用的Go版本

使用parser工具检查Go应用编译使用的Go版本

当前支持的Go版本为: Go 1.17 - Go 1.23

如果'logs/oneagent/preload.log' 日志中有匹配的 go Name Matched记录,但Go版本不匹配,logs/agent/golang_bootstrap.log日志中会包含下面内容:

(pid:1031606,uid:1000) ERROR [load]: Go Version unsupported, skip

步骤6. 自动注入失败:使用docker运行Go应用时,检查权限

docker容器内运行Go探针,golang_bootstrap.log 内出现Operation not permitted日志

ERROR [inject] Process 9 vm read(0x6a55c0, -1) error -> Operation not permitted

原因:探针加载时,需要SYS_PTRACE权限

解决方案:运行容器时,增加权限 --cap-add=SYS_PTRACE

例如:

docker run --cap-add=SYS_PTRACE demo_image

如果仍然受限,请尝试添加参数 --security-opt seccomp=unconfined 或 自定义 seccomp 配置

步骤7. 自动注入成功,检查通讯日志

查看logs/agent/golang_agent.log ,确认和中间进程通讯是否正常。出现Connect file:///opt/tingyun-oneagent/agent/go_version/run/goagent.sock failed日志,说明和中间进程通讯失败,可能是未重启UniAgent服务导致。

查看logs/agent/golang_daemon.log ,确认和collector通讯是否正常。

探针仅支持HTTP框架和gRPC框架的请求监控,不支持自研框架的监控。

其他问题

  • Go探针默认最高支持并发数:65536,如果一个应用进程同时处理的请求数超过65536,在Go1.21版本以上会丢弃超过并发限制的trace数据,在Go版本1.20及以下会导致协程painc。

results matching ""

    No results matching ""