I have an existing http server which I would like to profile. I have included _ "net/http/pprof"
to my imports, and I already have http server running:
router := createRouter()
server := &http.Server {
Addr: ":8080",
Handler: router,
ReadTimeout: 15*time.Second,
WriteTimeout: 15*time.Second,
// MaxHeaderBytes: 4096,
}
log.Fatal(server.ListenAndServe())
When I'm trying to access http://localhost:8080/debug/pprof/ I get 404 page not found
.
That's what I get when using go tool pprof
on a local machine:
userver@userver:~/Desktop/gotest$ go tool pprof http://192.168.0.27:8080/
Use of uninitialized value $prefix in concatenation (.) or string at /usr/lib/go/pkg/tool/linux_amd64/pprof line 3019.
Read http://192.168.0.27:8080/pprof/symbol
Failed to get the number of symbols from http://192.168.0.27:8080/pprof/symbol
userver@userver:~/Desktop/gotest$ go tool pprof http://localhost:8080/debug/pprof/profile
Read http://localhost:8080/debug/pprof/symbol
Failed to get the number of symbols from http://localhost:8080/debug/pprof/symbol
Same for a remote client:
MacBookAir:~ apple$ go tool pprof http://192.168.0.27:8080/
Use of uninitialized value $prefix in concatenation (.) or string at /usr/local/Cellar/go/1.3.2/libexec/pkg/tool/darwin_amd64/pprof line 3027.
Read http://192.168.0.27:8080/pprof/symbol
Failed to get the number of symbols from http://192.168.0.27:8080/pprof/symbol
Looks like the problem was in a
*mux.Router
used fromgithub.com/gorilla/mux
which I used as aHandler
in myhttp.Server
instance.Solution: just launch one more server just for the
pprof
:It's not explicitly mentioned in the documentation, but
net/http/pprof
only registers its handlers withhttp.DefaultServeMux
.From the source:
If you're not using the default mux you just have to register any/all of those you want with whatever mux you're using, e.g. something like
mymux.HandleFunc("…", pprof.Index)
, etc.Alternatively you can listen on a separate port (also possibly bound to only localhost if desired) with the default mux as you've shown.
If you're using a
github.com/gorilla/mux.Router
you can simply hand off any request prefixed with/debug/
to thehttp.DefaultServeMux
.