Plug "pprof" into the management listener.
diff --git a/handlers.go b/handlers.go
index 8c69ec8..e54cd02 100644
--- a/handlers.go
+++ b/handlers.go
@@ -4,6 +4,7 @@
"encoding/json"
"errors"
"net/http"
+ "net/http/pprof"
)
/*
@@ -49,6 +50,15 @@
s: s,
mux: http.NewServeMux(),
}
+
+ // Manually register paths from "pprof" package because we are
+ // not using a standard HTTP handler here.
+ h.mux.HandleFunc("/debug/pprof/", pprof.Index)
+ h.mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
+ h.mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
+ h.mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
+ h.mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
+
if s.healthPath != "" {
h.mux.HandleFunc(s.healthPath, s.handleHealth)
}
diff --git a/httpstop.go b/httpstop.go
deleted file mode 100644
index 49f014d..0000000
--- a/httpstop.go
+++ /dev/null
@@ -1 +0,0 @@
-package goscaffold
diff --git a/scaffold.go b/scaffold.go
index 629fcf8..55013d4 100644
--- a/scaffold.go
+++ b/scaffold.go
@@ -453,7 +453,6 @@
go func() {
for {
- fmt.Printf("Listening for signals\n")
sig := <-sigChan
switch sig {
case syscall.SIGINT, syscall.SIGTERM:
@@ -468,7 +467,6 @@
}
func dumpStack(out io.Writer) {
- fmt.Printf("Got HUP\n")
stackSize := 4096
stackBuf := make([]byte, stackSize)
var w int
diff --git a/scaffold_test.go b/scaffold_test.go
index 692602a..d3e3e98 100644
--- a/scaffold_test.go
+++ b/scaffold_test.go
@@ -1,6 +1,7 @@
package goscaffold
import (
+ "bytes"
"crypto/tls"
"encoding/json"
"errors"
@@ -46,6 +47,7 @@
Expect(err).Should(Succeed())
resp.Body.Close()
Expect(resp.StatusCode).Should(Equal(200))
+ validatePprof(s.InsecureAddress())
shutdownErr := errors.New("Validate")
s.Shutdown(shutdownErr)
Eventually(stopChan).Should(Receive(Equal(shutdownErr)))
@@ -79,6 +81,7 @@
Expect(err).Should(Succeed())
resp.Body.Close()
Expect(resp.StatusCode).Should(Equal(404))
+ validatePprof(s.ManagementAddress())
shutdownErr := errors.New("Validate")
s.Shutdown(shutdownErr)
Eventually(stopChan).Should(Receive(Equal(shutdownErr)))
@@ -362,6 +365,12 @@
Eventually(stopChan).Should(Receive(Equal(shutdownErr)))
})
+
+ It("Get stack trace", func() {
+ b := &bytes.Buffer{}
+ dumpStack(b)
+ Expect(b.Len()).ShouldNot(BeZero())
+ })
})
func getText(url string) (int, string) {
@@ -391,6 +400,14 @@
return resp.StatusCode, vals
}
+func validatePprof(addr string) {
+ code, _ := getText(fmt.Sprintf("http://%s/debug/pprof/", addr))
+ Expect(code).Should(Equal(200))
+ code, cmdline := getText(fmt.Sprintf("http://%s/debug/pprof/cmdline", addr))
+ Expect(code).Should(Equal(200))
+ Expect(cmdline).ShouldNot(BeEmpty())
+}
+
func testGet(s *HTTPScaffold, path string) bool {
resp, err := http.Get(fmt.Sprintf("http://%s", s.InsecureAddress()))
if err != nil {