buildkit/util/profiler/profiler.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
}
}