This is an automated email from the ASF dual-hosted git repository.

chenjunxu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new a3591e7  chore: go profile (#126)
a3591e7 is described below

commit a3591e7f618db044029f438777cb0b0e87333e4d
Author: Alex Zhang <[email protected]>
AuthorDate: Thu Dec 24 14:35:15 2020 +0800

    chore: go profile (#126)
---
 pkg/api/server.go      | 19 +++++++++++++++++--
 pkg/api/server_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/pkg/api/server.go b/pkg/api/server.go
index 484e055..59c747b 100644
--- a/pkg/api/server.go
+++ b/pkg/api/server.go
@@ -16,6 +16,8 @@ package api
 
 import (
        "net"
+       "net/http"
+       "net/http/pprof"
 
        "github.com/gin-gonic/gin"
 
@@ -29,6 +31,7 @@ import (
 type Server struct {
        router       *gin.Engine
        httpListener net.Listener
+       pprofMu      *http.ServeMux
 }
 
 // NewServer initializes the API Server.
@@ -42,10 +45,22 @@ func NewServer(cfg *config.Config) (*Server, error) {
        router.Use(gin.Recovery(), gin.Logger())
        apirouter.Mount(router)
 
-       return &Server{
+       srv := &Server{
                router:       router,
                httpListener: httpListener,
-       }, nil
+       }
+
+       if cfg.EnableProfiling {
+               srv.pprofMu = new(http.ServeMux)
+               srv.pprofMu.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
+               srv.pprofMu.HandleFunc("/debug/pprof/profile", pprof.Profile)
+               srv.pprofMu.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
+               srv.pprofMu.HandleFunc("/debug/pprof/trace", pprof.Trace)
+               srv.pprofMu.HandleFunc("/debug/pprof/", pprof.Index)
+               router.GET("/debug/pprof/*profile", 
gin.WrapF(srv.pprofMu.ServeHTTP))
+       }
+
+       return srv, nil
 }
 
 // Run launches the API Server.
diff --git a/pkg/api/server_test.go b/pkg/api/server_test.go
index 80f56cd..09ecf91 100644
--- a/pkg/api/server_test.go
+++ b/pkg/api/server_test.go
@@ -15,6 +15,8 @@
 package api
 
 import (
+       "net/http"
+       "net/url"
        "testing"
        "time"
 
@@ -46,3 +48,47 @@ func TestServerRun(t *testing.T) {
        err = srv.Run(stopCh)
        assert.Nil(t, err, "see non-nil error: ", err)
 }
+
+func TestProfileNotMount(t *testing.T) {
+       cfg := &config.Config{HTTPListen: "127.0.0.1:0"}
+       srv, err := NewServer(cfg)
+       assert.Nil(t, err, "see non-nil error: ", err)
+       stopCh := make(chan struct{})
+       go func() {
+               err := srv.Run(stopCh)
+               assert.Nil(t, err, "see non-nil error: ", err)
+       }()
+
+       u := (&url.URL{
+               Scheme: "http",
+               Host:   srv.httpListener.Addr().String(),
+               Path:   "/debug/pprof/cmdline",
+       }).String()
+
+       resp, err := http.Get(u)
+       assert.Nil(t, err, nil)
+       assert.Equal(t, resp.StatusCode, http.StatusNotFound)
+       close(stopCh)
+}
+
+func TestProfile(t *testing.T) {
+       cfg := &config.Config{HTTPListen: "127.0.0.1:0", EnableProfiling: true}
+       srv, err := NewServer(cfg)
+       assert.Nil(t, err, "see non-nil error: ", err)
+       stopCh := make(chan struct{})
+       go func() {
+               err := srv.Run(stopCh)
+               assert.Nil(t, err, "see non-nil error: ", err)
+       }()
+
+       u := (&url.URL{
+               Scheme: "http",
+               Host:   srv.httpListener.Addr().String(),
+               Path:   "/debug/pprof/cmdline",
+       }).String()
+
+       resp, err := http.Get(u)
+       assert.Nil(t, err, nil)
+       assert.Equal(t, resp.StatusCode, http.StatusOK)
+       close(stopCh)
+}

Reply via email to