diff options
author | 2022-04-28 13:32:53 +0100 | |
---|---|---|
committer | 2022-04-28 13:32:53 +0100 | |
commit | 69011d4901a042a9fba3d6d71061c25d20a9ecdc (patch) | |
tree | 6cbd14ba41eddfe9c223542467dce95824664bad /vendor/codeberg.org/gruf/go-debug/pprof_on.go | |
parent | replace async client API / federator msg processing with worker pools (#497) (diff) | |
download | gotosocial-69011d4901a042a9fba3d6d71061c25d20a9ecdc.tar.xz |
Add support for running profiling when debug build-tags provided (#491)
* wrap root HTTP handler in debug.WithPprof(), rearrange router.Start() to support this
* remove unused code
* set debug buildtag in build script when $DEBUG set
* update go-debug version with fixed handler
* use clone of router.srv for LE cert manager, reset server timeouts in debug
* add kim's other libraries to README
Diffstat (limited to 'vendor/codeberg.org/gruf/go-debug/pprof_on.go')
-rw-r--r-- | vendor/codeberg.org/gruf/go-debug/pprof_on.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-debug/pprof_on.go b/vendor/codeberg.org/gruf/go-debug/pprof_on.go new file mode 100644 index 000000000..a569ab823 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-debug/pprof_on.go @@ -0,0 +1,63 @@ +//go:build debug || debugenv +// +build debug debugenv + +package debug + +import ( + "net/http" + "net/http/pprof" + "strings" +) + +// ServePprof will start an HTTP server serving /debug/pprof only if debug enabled. +func ServePprof(addr string) error { + if !debug { + // debug disabled in env + return nil + } + handler := WithPprof(nil) + return http.ListenAndServe(addr, handler) +} + +// WithPprof will add /debug/pprof handling (provided by "net/http/pprof") only if debug enabled. +func WithPprof(handler http.Handler) http.Handler { + if !debug { + // debug disabled in env + return handler + } + + // Default serve mux is setup with pprof + pprofmux := http.DefaultServeMux + + if pprofmux == nil { + // Someone nil'ed the default mux + pprofmux = &http.ServeMux{} + pprofmux.HandleFunc("/debug/pprof/", pprof.Index) + pprofmux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + pprofmux.HandleFunc("/debug/pprof/profile", pprof.Profile) + pprofmux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + pprofmux.HandleFunc("/debug/pprof/trace", pprof.Trace) + } + + if handler == nil { + // Ensure handler is non-nil + handler = http.NotFoundHandler() + } + + // Debug enabled, return wrapped handler func + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + const prefix = "/debug/pprof" + + // /debug/pprof(/.*)? -> pass to pprofmux + if strings.HasPrefix(r.URL.Path, prefix) { + path := r.URL.Path[len(prefix):] + if path == "" || path[0] == '/' { + pprofmux.ServeHTTP(rw, r) + return + } + } + + // .* -> pass to handler + handler.ServeHTTP(rw, r) + }) +} |