mirror of
https://github.com/mpolden/echoip.git
synced 2025-02-14 11:08:58 +01:00
http: Add support for profiling
This commit is contained in:
parent
fed1ffaf81
commit
6878f54585
@ -38,6 +38,7 @@ func main() {
|
|||||||
portLookup := flag.Bool("p", false, "Enable port lookup")
|
portLookup := flag.Bool("p", false, "Enable port lookup")
|
||||||
template := flag.String("t", "index.html", "Path to template")
|
template := flag.String("t", "index.html", "Path to template")
|
||||||
cacheSize := flag.Int("C", 0, "Size of response cache. Set to 0 to disable")
|
cacheSize := flag.Int("C", 0, "Size of response cache. Set to 0 to disable")
|
||||||
|
profile := flag.Bool("P", false, "Enables profiling handlers")
|
||||||
var headers multiValueFlag
|
var headers multiValueFlag
|
||||||
flag.Var(&headers, "H", "Header to trust for remote IP, if present (e.g. X-Real-IP)")
|
flag.Var(&headers, "H", "Header to trust for remote IP, if present (e.g. X-Real-IP)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@ -48,7 +49,7 @@ func main() {
|
|||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
cache := http.NewCache(*cacheSize)
|
cache := http.NewCache(*cacheSize)
|
||||||
server := http.New(r, cache)
|
server := http.New(r, cache, *profile)
|
||||||
server.IPHeaders = headers
|
server.IPHeaders = headers
|
||||||
if _, err := os.Stat(*template); err == nil {
|
if _, err := os.Stat(*template); err == nil {
|
||||||
server.Template = *template
|
server.Template = *template
|
||||||
@ -69,6 +70,9 @@ func main() {
|
|||||||
if *cacheSize > 0 {
|
if *cacheSize > 0 {
|
||||||
log.Printf("Cache capacity set to %d", *cacheSize)
|
log.Printf("Cache capacity set to %d", *cacheSize)
|
||||||
}
|
}
|
||||||
|
if *profile {
|
||||||
|
log.Printf("Enabling profiling handlers")
|
||||||
|
}
|
||||||
log.Printf("Listening on http://%s", *listen)
|
log.Printf("Listening on http://%s", *listen)
|
||||||
if err := server.ListenAndServe(*listen); err != nil {
|
if err := server.ListenAndServe(*listen); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
22
http/http.go
22
http/http.go
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/mpolden/echoip/iputil"
|
"github.com/mpolden/echoip/iputil"
|
||||||
"github.com/mpolden/echoip/iputil/geo"
|
"github.com/mpolden/echoip/iputil/geo"
|
||||||
"github.com/mpolden/echoip/useragent"
|
"github.com/mpolden/echoip/useragent"
|
||||||
|
"net/http/pprof"
|
||||||
|
|
||||||
"math/big"
|
"math/big"
|
||||||
"net"
|
"net"
|
||||||
@ -29,6 +30,7 @@ type Server struct {
|
|||||||
LookupPort func(net.IP, uint64) error
|
LookupPort func(net.IP, uint64) error
|
||||||
cache *Cache
|
cache *Cache
|
||||||
gr geo.Reader
|
gr geo.Reader
|
||||||
|
profile bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Response struct {
|
type Response struct {
|
||||||
@ -57,8 +59,8 @@ type PortResponse struct {
|
|||||||
Reachable bool `json:"reachable"`
|
Reachable bool `json:"reachable"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(db geo.Reader, cache *Cache) *Server {
|
func New(db geo.Reader, cache *Cache, profile bool) *Server {
|
||||||
return &Server{cache: cache, gr: db}
|
return &Server{cache: cache, gr: db, profile: profile}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ipFromForwardedForHeader(v string) string {
|
func ipFromForwardedForHeader(v string) string {
|
||||||
@ -325,6 +327,13 @@ func cliMatcher(r *http.Request) bool {
|
|||||||
|
|
||||||
type appHandler func(http.ResponseWriter, *http.Request) *appError
|
type appHandler func(http.ResponseWriter, *http.Request) *appError
|
||||||
|
|
||||||
|
func wrapHandlerFunc(f http.HandlerFunc) appHandler {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) *appError {
|
||||||
|
f.ServeHTTP(w, r)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
if e := fn(w, r); e != nil { // e is *appError
|
if e := fn(w, r); e != nil { // e is *appError
|
||||||
// When Content-Type for error is JSON, we need to marshal the response into JSON
|
// When Content-Type for error is JSON, we need to marshal the response into JSON
|
||||||
@ -379,6 +388,15 @@ func (s *Server) Handler() http.Handler {
|
|||||||
r.RoutePrefix("GET", "/port/", s.PortHandler)
|
r.RoutePrefix("GET", "/port/", s.PortHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Profiling
|
||||||
|
if s.profile {
|
||||||
|
r.Route("GET", "/debug/pprof/cmdline", wrapHandlerFunc(pprof.Cmdline))
|
||||||
|
r.Route("GET", "/debug/pprof/profile", wrapHandlerFunc(pprof.Profile))
|
||||||
|
r.Route("GET", "/debug/pprof/symbol", wrapHandlerFunc(pprof.Symbol))
|
||||||
|
r.Route("GET", "/debug/pprof/trace", wrapHandlerFunc(pprof.Trace))
|
||||||
|
r.RoutePrefix("GET", "/debug/pprof/", wrapHandlerFunc(pprof.Index))
|
||||||
|
}
|
||||||
|
|
||||||
return r.Handler()
|
return r.Handler()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user