DefaultServeMux以外でpprofを使う方法

アプリケーション

概要

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型で設定しようとしたときにハマった。


関連書籍