mirror of
https://github.com/zoriya/Kyoo.git
synced 2026-05-13 10:52:28 -04:00
Added Go pprof handlers
Signed-off-by: Fred Heinecke <fred.heinecke@yahoo.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
// Important: simply import the pprof package to register its with a default HTTP mux, if one is defined.
|
||||
// This is done in the init function of the pprof package, and is unavoidable.
|
||||
// This package should not use the default HTTP mux to prevent accidentially enabling these endpoints.
|
||||
"net/http"
|
||||
"net/http/pprof"
|
||||
"os"
|
||||
runtimepprof "runtime/pprof"
|
||||
"strconv"
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
)
|
||||
|
||||
// This is similar to https://github.com/sevennt/echo-pprof/blob/master/pprof.go.
|
||||
// Unfortunately, this library is not maintained anymore and doesn't support echo v4.
|
||||
// It also hard-codes codes all pprof handlers, which sometimes change when new profiles are added.
|
||||
|
||||
func RegisterPProfHandlers(e *echo.Echo) {
|
||||
enablePProf := false
|
||||
if enablePProfVar, ok := os.LookupEnv("ENABLE_PPROF_ENDPOINT"); ok {
|
||||
enablePProf, _ = strconv.ParseBool(enablePProfVar)
|
||||
}
|
||||
|
||||
if !enablePProf {
|
||||
return
|
||||
}
|
||||
|
||||
prefix := "/debug/pprof" // Standard prefix for pprof
|
||||
g := e.Group(prefix)
|
||||
|
||||
routers := map[string]http.HandlerFunc{
|
||||
"": pprof.Index,
|
||||
"/": pprof.Index,
|
||||
"/cmdline": pprof.Cmdline,
|
||||
"/profile": pprof.Profile,
|
||||
"/symbol": pprof.Symbol,
|
||||
"/trace": pprof.Trace,
|
||||
}
|
||||
|
||||
// Handle all profiles supported by the Go runtime
|
||||
// These are not hard-coded so that this function does not need to be updated
|
||||
// when new profiles are added in the future.
|
||||
for _, profile := range runtimepprof.Profiles() {
|
||||
profileName := profile.Name()
|
||||
path := "/" + profileName
|
||||
routers[path] = pprof.Handler(profileName).ServeHTTP
|
||||
}
|
||||
|
||||
for path, handler := range routers {
|
||||
handler := func(ctx echo.Context) error {
|
||||
handler(ctx.Response().Writer, ctx.Request())
|
||||
return nil
|
||||
}
|
||||
|
||||
// The pprof handlers will accept/reject specific methods if needed.
|
||||
g.Any(path, handler)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user