From 48b095f8257a9c7db7344acf83d772f671acde66 Mon Sep 17 00:00:00 2001 From: Mrs4s Date: Sun, 11 Apr 2021 21:11:33 +0800 Subject: [PATCH] feat: pprof server. --- global/config/config.go | 6 ++++++ global/config/default_config.yml | 11 +++++++++++ go.mod | 1 + go.sum | 3 +++ main.go | 8 ++++++++ server/pprof.go | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 61 insertions(+) create mode 100644 server/pprof.go diff --git a/global/config/config.go b/global/config/config.go index 5a8935c..4b07d1d 100644 --- a/global/config/config.go +++ b/global/config/config.go @@ -86,6 +86,12 @@ type HTTPServer struct { MiddleWares `yaml:"middlewares"` } +type PprofServer struct { + Disabled bool `yaml:"disabled"` + Host string `yaml:"host"` + Port int `yaml:"port"` +} + // WebsocketServer 正向WS相关配置 type WebsocketServer struct { Disabled bool `yaml:"disabled"` diff --git a/global/config/default_config.yml b/global/config/default_config.yml index cdde941..0cff5bf 100644 --- a/global/config/default_config.yml +++ b/global/config/default_config.yml @@ -110,11 +110,22 @@ servers: reconnect-interval: 3000 middlewares: <<: *default # 引用默认中间件 + # pprof 性能分析服务器, 一般情况下不需要启用. + # 如果遇到性能问题请上传报告给开发者处理 + # 注意: pprof服务不支持中间件、不支持鉴权. 请不要开放到公网 + - pprof: + # 是否禁用pprof性能分析服务器 + disabled: true + # pprof服务器监听地址 + host: 127.0.0.1 + # pprof服务器监听端口 + port: 7700 # 可添加更多 #- ws-reverse: #- ws: #- http: + #- pprof: database: # 数据库相关设置 leveldb: diff --git a/go.mod b/go.mod index c5fcabf..6b48661 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f github.com/Mrs4s/MiraiGo v0.0.0-20210411120128-5a90a592d071 github.com/dustin/go-humanize v1.0.0 + github.com/gin-contrib/pprof v1.3.0 // indirect github.com/gin-gonic/gin v1.6.3 github.com/gorilla/websocket v1.4.2 github.com/guonaihong/gout v0.1.6 diff --git a/go.sum b/go.sum index 5ad1f92..a951a2b 100644 --- a/go.sum +++ b/go.sum @@ -14,9 +14,12 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gin-contrib/pprof v1.3.0 h1:G9eK6HnbkSqDZBYbzG4wrjCsA4e+cvYAHUZw6W+W9K0= +github.com/gin-contrib/pprof v1.3.0/go.mod h1:waMjT1H9b179t3CxuG1cV3DHpga6ybizwfBaM5OXaB0= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.6.0/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= diff --git a/main.go b/main.go index be278f6..afbf50d 100644 --- a/main.go +++ b/main.go @@ -416,6 +416,14 @@ func main() { go server.RunWebSocketClient(bot, rc) } } + if p, ok := m["pprof"]; ok { + pc := new(config.PprofServer) + if err := p.Decode(pc); err != nil { + log.Warn("读取http配置失败 :", err) + } else { + go server.RunPprofServer(pc) + } + } } log.Info("资源初始化完成, 开始处理信息.") log.Info("アトリは、高性能ですから!") diff --git a/server/pprof.go b/server/pprof.go new file mode 100644 index 0000000..3b40a16 --- /dev/null +++ b/server/pprof.go @@ -0,0 +1,32 @@ +package server + +import ( + "fmt" + "github.com/Mrs4s/go-cqhttp/global/config" + "github.com/gin-contrib/pprof" + "github.com/gin-gonic/gin" + log "github.com/sirupsen/logrus" + "net/http" + "os" + "time" +) + +func RunPprofServer(conf *config.PprofServer) { + if conf.Disabled { + return + } + engine := gin.New() + addr := fmt.Sprintf("%s:%d", conf.Host, conf.Port) + pprof.Register(engine) + go func() { + log.Infof("pprof debug 服务器已启动: %v/debug/pprof", addr) + log.Warnf("警告: pprof 服务不支持鉴权, 请不要运行在公网.") + if err := engine.Run(addr); err != nil && err != http.ErrServerClosed { + log.Error(err) + log.Infof("pprof 服务启动失败, 请检查端口是否被占用.") + log.Warnf("将在五秒后退出.") + time.Sleep(time.Second * 5) + os.Exit(1) + } + }() +}