2015-05-31 3 views
7

У меня есть существующий http-сервер, который я хотел бы профиль. Я включил _ "net/http/pprof" к моим импорта, и у меня уже есть HTTP-сервер работает:Не удается использовать инструмент go pprof с существующим сервером

router := createRouter() 
server := &http.Server { 
    Addr:   ":8080", 
    Handler:  router, 
    ReadTimeout: 15*time.Second, 
    WriteTimeout: 15*time.Second, 
// MaxHeaderBytes: 4096, 
} 

log.Fatal(server.ListenAndServe()) 

Когда я пытаюсь получить доступ к http://localhost:8080/debug/pprof/ я 404 page not found.

Вот что я получаю при использовании go tool pprof на локальной машине:

[email protected]:~/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 

[email protected]:~/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 

же для удаленного клиента:

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 

ответ

11

Это не упоминается в документации, но net/http/pprof только регистрирует свои обработчики с http.DefaultServeMux.

source От:

func init() { 
     http.Handle("/debug/pprof/", http.HandlerFunc(Index)) 
     http.Handle("/debug/pprof/cmdline", http.HandlerFunc(Cmdline)) 
     http.Handle("/debug/pprof/profile", http.HandlerFunc(Profile)) 
     http.Handle("/debug/pprof/symbol", http.HandlerFunc(Symbol)) 
     http.Handle("/debug/pprof/trace", http.HandlerFunc(Trace)) 
} 

Если вы не используете мультиплексор по умолчанию вы просто должны зарегистрироваться/все тех, кого вы хотите с тем, что мультиплексорами вы используете, например, что-то вроде mymux.HandleFunc("…", pprof.Index) и т. д.

В качестве альтернативы вы можете прослушивать отдельный порт (возможно, возможно, привязанный только к локальному хосту) по умолчанию, как you've shown.

8

выглядит как проблема была в *mux.Router используется от github.com/gorilla/mux, который я использовал как Handler в моем http.Server экземпляре.

Решение: просто запустите один более сервер только для pprof:

server := &http.Server { 
    Addr:   ":8080", 
    Handler:  router, 
    ReadTimeout: 15*time.Second, 
    WriteTimeout: 15*time.Second, 
} 
go func() { 
    log.Println(http.ListenAndServe(":6060", nil)) 
}() 
log.Fatal(server.ListenAndServe()) 
Смежные вопросы