diff --git a/pprof.go b/pprof.go new file mode 100644 index 0000000..97b6424 --- /dev/null +++ b/pprof.go @@ -0,0 +1,37 @@ +package main + +import ( + "net/http/pprof" + rtp "runtime/pprof" + + "github.com/valyala/fasthttp" + "github.com/valyala/fasthttp/fasthttpadaptor" +) + +func pprofHandler() fasthttp.RequestHandler { + items := rtp.Profiles() + + profiles := map[string]fasthttp.RequestHandler{ + "": fasthttpadaptor.NewFastHTTPHandlerFunc(pprof.Index), + "cmdline": fasthttpadaptor.NewFastHTTPHandlerFunc(pprof.Cmdline), + "profile": fasthttpadaptor.NewFastHTTPHandlerFunc(pprof.Profile), + "symbol": fasthttpadaptor.NewFastHTTPHandlerFunc(pprof.Symbol), + "trace": fasthttpadaptor.NewFastHTTPHandlerFunc(pprof.Trace), + } + + for i := range items { + name := items[i].Name() + profiles[name] = fasthttpadaptor.NewFastHTTPHandler(pprof.Handler(name)) + } + + return func(ctx *fasthttp.RequestCtx) { + name, _ := ctx.UserValue("name").(string) + + if handler, ok := profiles[name]; ok { + handler(ctx) + return + } + + ctx.Error("Not found", fasthttp.StatusNotFound) + } +}