// Package "performance" provides a tracker to observer CPU performance during // execution. package plugins import ( "os" "path/filepath" "runtime/pprof" "git.maximhutz.com/max/lambda/internal/engine" ) // Observes a reduction process, and publishes a CPU performance profile on // completion. type Performance struct { File string filePointer *os.File Error error } // Create a performance tracker that outputs a profile to "file". func NewPerformance(file string, process *engine.Engine) *Performance { plugin := &Performance{File: file} process.On(engine.StartEvent, plugin.Start) process.On(engine.StopEvent, plugin.Stop) return plugin } // Begin profiling. func (t *Performance) Start() { var absPath string absPath, t.Error = filepath.Abs(t.File) if t.Error != nil { return } t.Error = os.MkdirAll(filepath.Dir(absPath), 0777) if t.Error != nil { return } t.filePointer, t.Error = os.Create(absPath) if t.Error != nil { return } t.Error = pprof.StartCPUProfile(t.filePointer) if t.Error != nil { return } } // Stop profiling. func (t *Performance) Stop() { pprof.StopCPUProfile() t.filePointer.Close() }