From c618b96feff1dc2c057a4d5c02f34de92869ec45 Mon Sep 17 00:00:00 2001 From: Jay Wren Date: Tue, 3 Feb 2026 15:40:35 -0500 Subject: [PATCH] add stats.pprof flag to expose pprof on stats listener --- examples/config.yml | 5 +++++ stats.go | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/examples/config.yml b/examples/config.yml index f81baab6..94addde3 100644 --- a/examples/config.yml +++ b/examples/config.yml @@ -318,6 +318,11 @@ logging: #subsystem: nebula #interval: 10s + # enables pprof endpoints on the stats listener + # endpoints: /debug/pprof/, /debug/pprof/cmdline, /debug/pprof/profile, + # /debug/pprof/symbol, /debug/pprof/trace + #pprof: false + # enables counter metrics for meta packets # e.g.: `messages.tx.handshake` # NOTE: `message.{tx,rx}.recv_error` is always emitted diff --git a/stats.go b/stats.go index c88c45cc..340673a4 100644 --- a/stats.go +++ b/stats.go @@ -6,6 +6,7 @@ import ( "log" "net" "net/http" + "net/http/pprof" "runtime" "strconv" "time" @@ -93,6 +94,8 @@ func startPrometheusStats(l *logrus.Logger, i time.Duration, c *config.C, buildV return nil, fmt.Errorf("stats.path should not be empty") } + enablePprof := c.GetBool("stats.pprof", false) + pr := prometheus.NewRegistry() pClient := mp.NewPrometheusProvider(metrics.DefaultRegistry, namespace, subsystem, pr, i) if !configTest { @@ -119,6 +122,14 @@ func startPrometheusStats(l *logrus.Logger, i time.Duration, c *config.C, buildV startFn = func() { l.Infof("Prometheus stats listening on %s at %s", listen, path) http.Handle(path, promhttp.HandlerFor(pr, promhttp.HandlerOpts{ErrorLog: l})) + if enablePprof { + l.Info("pprof endpoints enabled on stats listener") + http.HandleFunc("GET /debug/pprof/", pprof.Index) + http.HandleFunc("GET /debug/pprof/cmdline", pprof.Cmdline) + http.HandleFunc("GET /debug/pprof/profile", pprof.Profile) + http.HandleFunc("GET /debug/pprof/symbol", pprof.Symbol) + http.HandleFunc("GET /debug/pprof/trace", pprof.Trace) + } log.Fatal(http.ListenAndServe(listen, nil)) } }