go-zero 如何接入 pprof?
🎍

go-zero 如何接入 pprof?

更新时间 2022-07-15

内置(推荐)

在 go-zero 中的 core/proc 已经内置了 pprof 的记录,只需要一个命令,先查询程序的进程 ID,然后运行如下命令:
kill -USR2 [pid]
运行后日志文件中会输出 pprof 的文件的保存路径。
notion image
然后在 /tmp 目录下找到所需要的 pprof 文件进行分析就行。

web pprof

在 go-zero 框架中,没有支持 web pprof,因此需要我们手动小改下。
首先通过 api 文件已经生成了项目,然后打开入口文件,更改内容如下:
package main import ( //... _ "net/http/pprof" //... ) var configFile = flag.String("f", "etc/bigdataapi-api.yaml", "the config file") function main() { flag.Parse() var c config.Config conf.MustLoad(*configFile, &c) ctx := svc.NewServiceContext(c) svcGroup := service.NewServiceGroup() defer svcGroup.Stop() server := rest.MustNewServer(c.RestConf) svcGroup.Add(server) svcGroup.Add(pprofServer{}) handler.RegisterHandlers(server, ctx) fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) svcGroup.Start() } type pprofServer struct{} func (pprofServer) Start() { addr := "0.0.0.0:8080" fmt.Printf("Start pprof server, listen addr %s\n", addr) err := http.ListenAndServe(addr, nil) if err != nil { log.Fatal(err) } } func (pprofServer) Stop() { fmt.Printf("Stop pprof server\n") }
解释:
通过 ServiceGroup 工具,创建一个新的端口用于 pprof 监听。

参考