github.com/Mrs4s/go-cqhttp@v1.2.0/modules/pprof/pprof.go (about) 1 // Package pprof provide pprof server of go-cqhttp 2 package pprof 3 4 import ( 5 "fmt" 6 "net/http" 7 "net/http/pprof" 8 "os" 9 "time" 10 11 log "github.com/sirupsen/logrus" 12 "gopkg.in/yaml.v3" 13 14 "github.com/Mrs4s/go-cqhttp/coolq" 15 "github.com/Mrs4s/go-cqhttp/modules/config" 16 "github.com/Mrs4s/go-cqhttp/modules/servers" 17 ) 18 19 const pprofDefault = ` # pprof 性能分析服务器, 一般情况下不需要启用. 20 # 如果遇到性能问题请上传报告给开发者处理 21 # 注意: pprof服务不支持中间件、不支持鉴权. 请不要开放到公网 22 - pprof: 23 # pprof服务器监听地址 24 host: 127.0.0.1 25 # pprof服务器监听端口 26 port: 7700 27 ` 28 29 // pprofServer pprof性能分析服务器相关配置 30 type pprofServer struct { 31 Disabled bool `yaml:"disabled"` 32 Host string `yaml:"host"` 33 Port int `yaml:"port"` 34 } 35 36 func init() { 37 config.AddServer(&config.Server{ 38 Brief: "pprof 性能分析服务器", 39 Default: pprofDefault, 40 }) 41 } 42 43 // runPprof 启动 pprof 性能分析服务器 44 func runPprof(_ *coolq.CQBot, node yaml.Node) { 45 var conf pprofServer 46 switch err := node.Decode(&conf); { 47 case err != nil: 48 log.Warn("读取pprof配置失败 :", err) 49 fallthrough 50 case conf.Disabled: 51 return 52 } 53 54 addr := fmt.Sprintf("%s:%d", conf.Host, conf.Port) 55 mux := http.NewServeMux() 56 mux.HandleFunc("/debug/pprof/", pprof.Index) 57 mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) 58 mux.HandleFunc("/debug/pprof/profile", pprof.Profile) 59 mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) 60 mux.HandleFunc("/debug/pprof/trace", pprof.Trace) 61 server := http.Server{Addr: addr, Handler: mux} 62 log.Infof("pprof debug 服务器已启动: %v/debug/pprof", addr) 63 log.Warnf("警告: pprof 服务不支持鉴权, 请不要运行在公网.") 64 if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { 65 log.Error(err) 66 log.Infof("pprof 服务启动失败, 请检查端口是否被占用.") 67 log.Warnf("将在五秒后退出.") 68 time.Sleep(time.Second * 5) 69 os.Exit(1) 70 } 71 } 72 73 func init() { 74 servers.Register("pprof", runPprof) 75 }