From ccea62a7622dd7d1ecdb5dc8836947b8517c89e7 Mon Sep 17 00:00:00 2001 From: Anton Date: Sun, 10 Nov 2024 17:14:27 +0500 Subject: [PATCH] server: enable debugging --- cmd/main.go | 28 +++++++++++++++++++++------- internal/server/router.go | 12 ++++++++++++ internal/server/server.go | 4 ++-- internal/server/server_test.go | 2 +- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index b5964b5..5101d41 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -22,24 +22,37 @@ var ( // startServer starts the HTTP API sandbox server. func startServer(port int) *server.Server { + const host = "" // listen on all interfaces logx.Log("codapi %s, commit %s, built at %s", version, commit, date) - logx.Log("listening on port %d...", port) + logx.Log("listening on 0.0.0.0:%d...", port) router := server.NewRouter() - srv := server.NewServer(port, router) + srv := server.NewServer(host, port, router) + srv.Start() + return srv +} + +// startDebug servers the debug handlers. +func startDebug(port int) *server.Server { + const host = "localhost" + logx.Log("debugging on localhost:%d...", port) + router := server.NewDebug() + srv := server.NewServer(host, port, router) srv.Start() return srv } // listenSignals listens for termination signals // and performs graceful shutdown. -func listenSignals(srv *server.Server) { +func listenSignals(servers []*server.Server) { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) <-sigs logx.Log("stopping...") - err := srv.Stop() - if err != nil { - logx.Log("failed to stop: %v", err) + for _, srv := range servers { + err := srv.Stop() + if err != nil { + logx.Log("failed to stop: %v", err) + } } } @@ -65,5 +78,6 @@ func main() { logx.Log("boxes: %v", cfg.BoxNames()) logx.Log("commands: %v", cfg.CommandNames()) - listenSignals(srv) + debug := startDebug(6060) + listenSignals([]*server.Server{srv, debug}) } diff --git a/internal/server/router.go b/internal/server/router.go index ae5e776..95c4817 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/http" + "net/http/pprof" "github.com/nalgeon/codapi/internal/engine" "github.com/nalgeon/codapi/internal/logx" @@ -19,6 +20,17 @@ func NewRouter() http.Handler { return mux } +// NewDebug creates HTTP routes for debugging. +func NewDebug() http.Handler { + mux := http.NewServeMux() + mux.HandleFunc("/debug/pprof/", pprof.Index) + mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + mux.HandleFunc("/debug/pprof/profile", pprof.Profile) + mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + mux.HandleFunc("/debug/pprof/trace", pprof.Trace) + return mux +} + // exec runs a sandbox command on the supplied code. func exec(w http.ResponseWriter, r *http.Request) { // only POST is allowed diff --git a/internal/server/server.go b/internal/server/server.go index b377871..5bd1b7e 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -21,8 +21,8 @@ type Server struct { } // NewServer creates a new Server. -func NewServer(port int, handler http.Handler) *Server { - addr := fmt.Sprintf(":%d", port) +func NewServer(host string, port int, handler http.Handler) *Server { + addr := fmt.Sprintf("%s:%d", host, port) return &Server{ srv: &http.Server{Addr: addr, Handler: handler}, wg: &sync.WaitGroup{}, diff --git a/internal/server/server_test.go b/internal/server/server_test.go index 0e4c5d8..1bdd0d7 100644 --- a/internal/server/server_test.go +++ b/internal/server/server_test.go @@ -10,7 +10,7 @@ func TestServer(t *testing.T) { w.WriteHeader(http.StatusOK) }) - srv := NewServer(8585, handler) + srv := NewServer("", 8585, handler) if srv.srv.Addr != ":8585" { t.Fatalf("NewServer: expected port :8585 got %s", srv.srv.Addr) }