pkg / profile

Simple profiling for Go
BSD 2-Clause "Simplified" License
1.99k stars 124 forks source link

Add ProfileFilename #53

Open josharian opened 4 years ago

josharian commented 4 years ago

Every time I use this package, I think that I can do something like:

var flagCPUProfile = flag.String("cpuprofile", "", "write a cpuprofile to `cpuprofile`")

func main() {
    if *flagCPUProfile != "" {
        defer profile.Start(profile.ProfilePath(*flagCPUProfile)).Stop()
    }

And then I run the program with -cpuprofile=somename.pprof. And there is no profile to be found.

And then I dig through the docs and discover ProfilePath is supposed to be a directory. And then I wish there was a way to provide a filename. This is because I sometimes do multiple runs, and I want to write the results to different profiles so that I can combine them, and I don't want to have to deal with creating and cleaning up a directory per profile.

May I send a PR to add ProfileFilename, or something like it?

davecheney commented 4 years ago

Thanks for your issue. Something which is underdocuumented and arguably shouldn't be optional is the profile.ProfilePath option function.

If you use

defer profile.Start(profile.ProfilePath(".")).Stop()

It will write cpu.pprof to the $CWD.

I'm not opposed to a profile.ProfileFilename option, but I'm regretting using $TMPDIR as the default location for profiles.

josharian commented 4 years ago

I always find ProfilePath -- the problem is that I misinterpret it as the path to the output file instead of as the path to the directory containing the output file, which will be named cpu.pprof, and which must already exist.

I definitely agree that defaulting to putting profiles in the CWD would be better.