123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- //go:build linux || darwin
- package proc
- import (
- "fmt"
- "os"
- "path"
- "runtime/pprof"
- "syscall"
- "time"
- "github.com/wuntsong-org/go-zero-plus/core/logx"
- )
- const (
- goroutineProfile = "goroutine"
- debugLevel = 2
- )
- type creator interface {
- Create(name string) (file *os.File, err error)
- }
- func dumpGoroutines(ctor creator) {
- command := path.Base(os.Args[0])
- pid := syscall.Getpid()
- dumpFile := path.Join(os.TempDir(), fmt.Sprintf("%s-%d-goroutines-%s.dump",
- command, pid, time.Now().Format(timeFormat)))
- logx.Infof("Got dump goroutine signal, printing goroutine profile to %s", dumpFile)
- if f, err := ctor.Create(dumpFile); err != nil {
- logx.Errorf("Failed to dump goroutine profile, error: %v", err)
- } else {
- defer f.Close()
- pprof.Lookup(goroutineProfile).WriteTo(f, debugLevel)
- }
- }
- type fileCreator struct{}
- func (fc fileCreator) Create(name string) (file *os.File, err error) {
- return os.Create(name)
- }
|