From 69011d4901a042a9fba3d6d71061c25d20a9ecdc Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:32:53 +0100 Subject: 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 --- vendor/codeberg.org/gruf/go-debug/pprof_on.go | 63 +++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 vendor/codeberg.org/gruf/go-debug/pprof_on.go (limited to 'vendor/codeberg.org/gruf/go-debug/pprof_on.go') 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) + }) +} -- cgit v1.2.3