| package pprof |
| |
| import ( |
| "expvar" |
| "fmt" |
| "net/http" |
| "net/http/pprof" |
| |
| "github.com/Sirupsen/logrus" |
| ) |
| |
| func Enable(address string) { |
| http.Handle("/", http.RedirectHandler("/debug/pprof", http.StatusMovedPermanently)) |
| |
| http.Handle("/debug/vars", http.HandlerFunc(expVars)) |
| http.Handle("/debug/pprof/", http.HandlerFunc(pprof.Index)) |
| http.Handle("/debug/pprof/cmdline", http.HandlerFunc(pprof.Cmdline)) |
| http.Handle("/debug/pprof/profile", http.HandlerFunc(pprof.Profile)) |
| http.Handle("/debug/pprof/symbol", http.HandlerFunc(pprof.Symbol)) |
| http.Handle("/debug/pprof/block", pprof.Handler("block")) |
| http.Handle("/debug/pprof/heap", pprof.Handler("heap")) |
| http.Handle("/debug/pprof/goroutine", pprof.Handler("goroutine")) |
| http.Handle("/debug/pprof/threadcreate", pprof.Handler("threadcreate")) |
| |
| go http.ListenAndServe(address, nil) |
| logrus.Debug("pprof listening in address %s", address) |
| } |
| |
| // Replicated from expvar.go as not public. |
| func expVars(w http.ResponseWriter, r *http.Request) { |
| first := true |
| w.Header().Set("Content-Type", "application/json; charset=utf-8") |
| fmt.Fprintf(w, "{\n") |
| expvar.Do(func(kv expvar.KeyValue) { |
| if !first { |
| fmt.Fprintf(w, ",\n") |
| } |
| first = false |
| fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) |
| }) |
| fmt.Fprintf(w, "\n}\n") |
| } |