net/http/pprofをDefaultServeMux以外(Goの標準のルーター以外)で使う方法についてメモ。
pprofをblank importするだけではだめ。
package main
import (
_ "net/http/pprof"
)
DefaultServeMux以外のルーターを使う場合はblank importするだけではpprofが利用できるようにならない。
net/http/pprofを参照すると、下記のように記載されている。
If you are not using DefaultServeMux, you will have to register handlers with the mux you are using.
下記は自分の自作ルーターbmf-san/goblinを使った例。
package main
import (
"net/http/pprof"
)
func main() {
r.Methods(http.MethodGet).Handler("/debug/pprof/", http.HandlerFunc(pprof.Index))
r.Methods(http.MethodGet).Handler("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline))
r.Methods(http.MethodGet).Handler("/debug/pprof/profile", http.HandlerFunc(pprof.Profile))
r.Methods(http.MethodGet).Handler("/debug/pprof/symbol", http.HandlerFunc(pprof.Symbol))
r.Methods(http.MethodGet).Handler("/debug/pprof/trace", http.HandlerFunc(pprof.Trace))
r.Methods(http.MethodGet).Handler("/debug/pprof/goroutine", pprof.Handler("goroutine"))
r.Methods(http.MethodGet).Handler("/debug/pprof/heap", pprof.Handler("heap"))
r.Methods(http.MethodGet).Handler("/debug/pprof/mutex", pprof.Handler("mutex"))
r.Methods(http.MethodGet).Handler("/debug/pprof/threadcreate", pprof.Handler("threadcreate"))
r.Methods(http.MethodGet).Handler("/debug/pprof/block", pprof.Handler("block"))
}
上述のようにルーティングを自分で設定し、pprofのHanderを設定してあげる必要がある。
httprouterの場合であれば、下記issueが参考になる。 pprof issue with httprouter #236
pyroscopeでGoのプロファイリングをPull型で設定しようとしたときにハマった。