cmd/uplink: add options to save pprof/trace information
Change-Id: I5bcc602366de4ebd9b761e641a3806ddaeb9ecba
This commit is contained in:
parent
b5aadff0f7
commit
b4d8cbfbbf
@ -12,6 +12,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"runtime/pprof"
|
||||||
|
"runtime/trace"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -63,6 +65,11 @@ type external struct {
|
|||||||
verbose bool // flag to print out tracing information (like the used trace id)
|
verbose bool // flag to print out tracing information (like the used trace id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug struct {
|
||||||
|
pprofFile string
|
||||||
|
traceFile string
|
||||||
|
}
|
||||||
|
|
||||||
events struct {
|
events struct {
|
||||||
address string // if non-zero, events are sent to this address.
|
address string // if non-zero, events are sent to this address.
|
||||||
}
|
}
|
||||||
@ -125,6 +132,16 @@ func (ex *external) Setup(f clingy.Flags) {
|
|||||||
clingy.Advanced,
|
clingy.Advanced,
|
||||||
).(string)
|
).(string)
|
||||||
|
|
||||||
|
ex.debug.pprofFile = f.Flag(
|
||||||
|
"debug-pprof", "File to collect Golang pprof profiling data", "",
|
||||||
|
clingy.Advanced,
|
||||||
|
).(string)
|
||||||
|
|
||||||
|
ex.debug.traceFile = f.Flag(
|
||||||
|
"debug-trace", "File to collect Golang trace data", "",
|
||||||
|
clingy.Advanced,
|
||||||
|
).(string)
|
||||||
|
|
||||||
ex.dirs.loaded = true
|
ex.dirs.loaded = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,14 +222,14 @@ func (ex *external) analyticsEnabled() bool {
|
|||||||
|
|
||||||
// Wrap is called by clingy with the command to be executed.
|
// Wrap is called by clingy with the command to be executed.
|
||||||
func (ex *external) Wrap(ctx context.Context, cmd clingy.Command) (err error) {
|
func (ex *external) Wrap(ctx context.Context, cmd clingy.Command) (err error) {
|
||||||
if err := ex.migrate(); err != nil {
|
if err = ex.migrate(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := ex.loadConfig(); err != nil {
|
if err = ex.loadConfig(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !ex.config.loaded {
|
if !ex.config.loaded {
|
||||||
if err := saveInitialConfig(ctx, ex); err != nil {
|
if err = saveInitialConfig(ctx, ex); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,6 +239,40 @@ func (ex *external) Wrap(ctx context.Context, cmd clingy.Command) (err error) {
|
|||||||
ctx = experiment.With(ctx, exp)
|
ctx = experiment.With(ctx, exp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ex.debug.pprofFile != "" {
|
||||||
|
var output *os.File
|
||||||
|
output, err = os.Create(ex.debug.pprofFile)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrap(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
err = errs.Combine(err, output.Close())
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = pprof.StartCPUProfile(output)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrap(err)
|
||||||
|
}
|
||||||
|
defer pprof.StopCPUProfile()
|
||||||
|
}
|
||||||
|
|
||||||
|
if ex.debug.traceFile != "" {
|
||||||
|
var output *os.File
|
||||||
|
output, err = os.Create(ex.debug.traceFile)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrap(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
err = errs.Combine(err, output.Close())
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = trace.Start(output)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrap(err)
|
||||||
|
}
|
||||||
|
defer trace.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
// N.B.: Tracing is currently disabled by default (sample == 0, traceID == 0) and is
|
// N.B.: Tracing is currently disabled by default (sample == 0, traceID == 0) and is
|
||||||
// something a user can only opt into. as a result, we don't check ex.analyticsEnabled()
|
// something a user can only opt into. as a result, we don't check ex.analyticsEnabled()
|
||||||
// in this if statement. If we do ever start turning on trace samples by default, we
|
// in this if statement. If we do ever start turning on trace samples by default, we
|
||||||
|
Loading…
Reference in New Issue
Block a user