97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package debug
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"net/http/pprof"
 | 
						|
	"os"
 | 
						|
	"runtime"
 | 
						|
 | 
						|
	"github.com/gorilla/mux"
 | 
						|
	"github.com/grafana/pyroscope-go"
 | 
						|
	log "github.com/sirupsen/logrus"
 | 
						|
	"goauthentik.io/internal/config"
 | 
						|
	"goauthentik.io/internal/utils/web"
 | 
						|
)
 | 
						|
 | 
						|
var l = log.WithField("logger", "authentik.debugger.go")
 | 
						|
 | 
						|
func EnableDebugServer(appName string) {
 | 
						|
	if !config.Get().Debug {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	h := mux.NewRouter()
 | 
						|
	enablePyroscope(appName)
 | 
						|
	h.HandleFunc("/debug/pprof/", pprof.Index)
 | 
						|
	h.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
 | 
						|
	h.HandleFunc("/debug/pprof/profile", pprof.Profile)
 | 
						|
	h.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
 | 
						|
	h.HandleFunc("/debug/pprof/trace", pprof.Trace)
 | 
						|
	h.HandleFunc("/debug/dump_config", func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		enc := json.NewEncoder(w)
 | 
						|
		enc.SetEscapeHTML(true)
 | 
						|
		enc.SetIndent("", "\t")
 | 
						|
		_ = enc.Encode(config.Get())
 | 
						|
	})
 | 
						|
	h.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 | 
						|
		_ = h.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
 | 
						|
			tpl, err := route.GetPathTemplate()
 | 
						|
			if err != nil {
 | 
						|
				return nil
 | 
						|
			}
 | 
						|
			_, err = fmt.Fprintf(w, "<a href='%[1]s'>%[1]s</a><br>", tpl)
 | 
						|
			if err != nil {
 | 
						|
				l.WithError(err).Warning("failed to write index")
 | 
						|
				return nil
 | 
						|
			}
 | 
						|
			return nil
 | 
						|
		})
 | 
						|
	})
 | 
						|
	go func() {
 | 
						|
		l.WithField("listen", config.Get().Listen.Debug).Info("Starting Debug server")
 | 
						|
		err := http.ListenAndServe(
 | 
						|
			config.Get().Listen.Debug,
 | 
						|
			web.NewLoggingHandler(l, nil)(h),
 | 
						|
		)
 | 
						|
		if l != nil {
 | 
						|
			l.WithError(err).Warn("failed to start debug server")
 | 
						|
		}
 | 
						|
	}()
 | 
						|
}
 | 
						|
 | 
						|
func enablePyroscope(appName string) {
 | 
						|
	p, pok := os.LookupEnv("AUTHENTIK_PYROSCOPE_HOST")
 | 
						|
	if !pok {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	l.Debug("Enabling pyroscope")
 | 
						|
	runtime.SetMutexProfileFraction(5)
 | 
						|
	runtime.SetBlockProfileRate(5)
 | 
						|
	hostname, err := os.Hostname()
 | 
						|
	if err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
	_, err = pyroscope.Start(pyroscope.Config{
 | 
						|
		ApplicationName: appName,
 | 
						|
		ServerAddress:   p,
 | 
						|
		Logger:          pyroscope.StandardLogger,
 | 
						|
		Tags:            map[string]string{"hostname": hostname},
 | 
						|
		ProfileTypes: []pyroscope.ProfileType{
 | 
						|
			pyroscope.ProfileCPU,
 | 
						|
			pyroscope.ProfileAllocObjects,
 | 
						|
			pyroscope.ProfileAllocSpace,
 | 
						|
			pyroscope.ProfileInuseObjects,
 | 
						|
			pyroscope.ProfileInuseSpace,
 | 
						|
			pyroscope.ProfileGoroutines,
 | 
						|
			pyroscope.ProfileMutexCount,
 | 
						|
			pyroscope.ProfileMutexDuration,
 | 
						|
			pyroscope.ProfileBlockCount,
 | 
						|
			pyroscope.ProfileBlockDuration,
 | 
						|
		},
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
}
 |