Files
fn-serverless/api/server/profile.go
Reed Allman 9cbe4ea536 add pprof endpoints, additional spans (#770)
i would split this commit in two if i were a good dev.

the pprof stuff is really useful and this only samples when called. this is
pretty standard go service stuff. expvar is cool, too.

the additional spannos have turned up some interesting tid bits... gonna slide
em in
2018-02-13 20:01:41 -08:00

39 lines
1.1 KiB
Go

package server
import (
"expvar"
"fmt"
"net/http"
"net/http/pprof"
"github.com/gin-gonic/gin"
)
// Replicated from expvar.go as not public.
func expVars(w http.ResponseWriter, r *http.Request) {
first := true
w.Header().Set("Content-Type", "application/json; charset=utf-8")
fmt.Fprintf(w, "{\n")
expvar.Do(func(kv expvar.KeyValue) {
if !first {
fmt.Fprintf(w, ",\n")
}
first = false
fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value)
})
fmt.Fprintf(w, "\n}\n")
}
func profilerSetup(router *gin.Engine, path string) {
engine := router.Group(path)
engine.Any("/vars", gin.WrapF(expVars))
engine.Any("/pprof/", gin.WrapF(pprof.Index))
engine.Any("/pprof/cmdline", gin.WrapF(pprof.Cmdline))
engine.Any("/pprof/profile", gin.WrapF(pprof.Profile))
engine.Any("/pprof/symbol", gin.WrapF(pprof.Symbol))
engine.Any("/pprof/block", gin.WrapF(pprof.Handler("block").ServeHTTP))
engine.Any("/pprof/heap", gin.WrapF(pprof.Handler("heap").ServeHTTP))
engine.Any("/pprof/goroutine", gin.WrapF(pprof.Handler("goroutine").ServeHTTP))
engine.Any("/pprof/threadcreate", gin.WrapF(pprof.Handler("threadcreate").ServeHTTP))
}