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  }