Преглед изворни кода

add stats.pprof flag to expose pprof on stats listener

Jay Wren пре 8 месеци
родитељ
комит
c618b96fef
2 измењених фајлова са 16 додато и 0 уклоњено
  1. 5 0
      examples/config.yml
  2. 11 0
      stats.go

+ 5 - 0
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

+ 11 - 0
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))
 		}
 	}