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  }