85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package profiler
|
|
|
|
import (
|
|
"github.com/pkg/profile"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
func Attach(app *cli.App) {
|
|
app.Flags = append(app.Flags,
|
|
cli.StringFlag{
|
|
Name: "profile-cpu",
|
|
Hidden: true,
|
|
},
|
|
cli.StringFlag{
|
|
Name: "profile-memory",
|
|
Hidden: true,
|
|
},
|
|
cli.IntFlag{
|
|
Name: "profile-memoryrate",
|
|
Value: 512 * 1024,
|
|
Hidden: true,
|
|
},
|
|
cli.StringFlag{
|
|
Name: "profile-block",
|
|
Hidden: true,
|
|
},
|
|
cli.StringFlag{
|
|
Name: "profile-mutex",
|
|
Hidden: true,
|
|
},
|
|
cli.StringFlag{
|
|
Name: "profile-trace",
|
|
Hidden: true,
|
|
},
|
|
)
|
|
|
|
var stoppers = []interface {
|
|
Stop()
|
|
}{}
|
|
|
|
before := app.Before
|
|
app.Before = func(clicontext *cli.Context) error {
|
|
if before != nil {
|
|
if err := before(clicontext); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if cpuProfile := clicontext.String("profile-cpu"); cpuProfile != "" {
|
|
stoppers = append(stoppers, profile.Start(profile.CPUProfile, profile.ProfilePath(cpuProfile), profile.NoShutdownHook))
|
|
}
|
|
|
|
if memProfile := clicontext.String("profile-memory"); memProfile != "" {
|
|
stoppers = append(stoppers, profile.Start(profile.MemProfile, profile.ProfilePath(memProfile), profile.NoShutdownHook, profile.MemProfileRate(clicontext.Int("profile-memoryrate"))))
|
|
}
|
|
|
|
if blockProfile := clicontext.String("profile-block"); blockProfile != "" {
|
|
stoppers = append(stoppers, profile.Start(profile.BlockProfile, profile.ProfilePath(blockProfile), profile.NoShutdownHook))
|
|
}
|
|
|
|
if mutexProfile := clicontext.String("profile-mutex"); mutexProfile != "" {
|
|
stoppers = append(stoppers, profile.Start(profile.MutexProfile, profile.ProfilePath(mutexProfile), profile.NoShutdownHook))
|
|
}
|
|
|
|
if traceProfile := clicontext.String("profile-trace"); traceProfile != "" {
|
|
stoppers = append(stoppers, profile.Start(profile.TraceProfile, profile.ProfilePath(traceProfile), profile.NoShutdownHook))
|
|
}
|
|
return nil
|
|
}
|
|
|
|
after := app.After
|
|
app.After = func(clicontext *cli.Context) error {
|
|
if after != nil {
|
|
if err := after(clicontext); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
for _, stopper := range stoppers {
|
|
stopper.Stop()
|
|
}
|
|
return nil
|
|
}
|
|
}
|