github.com/cloudfoundry-attic/garden-linux@v0.333.2-candidate/metrics/debug.go (about) 1 package metrics 2 3 import ( 4 "expvar" 5 "net/http" 6 "strings" 7 8 "github.com/cloudfoundry-incubator/cf-debug-server" 9 "github.com/pivotal-golang/lager" 10 "github.com/tedsuo/ifrit" 11 "github.com/tedsuo/ifrit/http_server" 12 ) 13 14 func StartDebugServer(address string, sink *lager.ReconfigurableSink, metrics Metrics) (ifrit.Process, error) { 15 expvar.Publish("numCPUS", expvar.Func(func() interface{} { 16 return metrics.NumCPU() 17 })) 18 19 expvar.Publish("numGoRoutines", expvar.Func(func() interface{} { 20 return metrics.NumGoroutine() 21 })) 22 23 expvar.Publish("loopDevices", expvar.Func(func() interface{} { 24 return metrics.LoopDevices() 25 })) 26 27 expvar.Publish("backingStores", expvar.Func(func() interface{} { 28 return metrics.BackingStores() 29 })) 30 31 expvar.Publish("depotDirs", expvar.Func(func() interface{} { 32 return metrics.DepotDirs() 33 })) 34 35 server := http_server.New(address, handler(sink)) 36 p := ifrit.Invoke(server) 37 select { 38 case <-p.Ready(): 39 case err := <-p.Wait(): 40 return nil, err 41 } 42 return p, nil 43 } 44 45 func handler(sink *lager.ReconfigurableSink) http.Handler { 46 pprofHandler := cf_debug_server.Handler(sink) 47 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 48 if strings.HasPrefix(r.URL.Path, "/debug/vars") { 49 http.DefaultServeMux.ServeHTTP(w, r) 50 return 51 } 52 pprofHandler.ServeHTTP(w, r) 53 }) 54 }