Kyoo/transcoder/src/api/pprof.go
Fred Heinecke 0493265b1d Added Go pprof handlers
Signed-off-by: Fred Heinecke <fred.heinecke@yahoo.com>
2025-05-02 09:35:48 +02:00

61 lines
1.8 KiB
Go

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)
}
}