From 6dbf296e39ced6094ac0c6113f00c23f28f82b72 Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Thu, 18 Dec 2025 16:46:29 +0000 Subject: [PATCH 1/8] [signal] add NB_PPROF_ADDR envvar support --- signal/cmd/pprof.go | 33 +++++++++++++++++++++++++++++++++ signal/cmd/run.go | 14 +------------- 2 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 signal/cmd/pprof.go diff --git a/signal/cmd/pprof.go b/signal/cmd/pprof.go new file mode 100644 index 00000000000..e85e9125387 --- /dev/null +++ b/signal/cmd/pprof.go @@ -0,0 +1,33 @@ +//go:build pprof +// +build pprof + +package cmd + +import ( + "net/http" + _ "net/http/pprof" + "os" + + log "github.com/sirupsen/logrus" +) + +func init() { + addr := pprofAddr() + go pprof(addr) +} + +func pprofAddr() string { + listenAddr := os.Getenv("NB_PPROF_ADDR") + if listenAddr == "" { + return "localhost:6060" + } + + return listenAddr +} + +func pprof(listenAddr string) { + log.Infof("listening pprof on: %s\n", listenAddr) + if err := http.ListenAndServe(listenAddr, nil); err != nil { + log.Fatalf("Failed to start pprof: %v", err) + } +} diff --git a/signal/cmd/run.go b/signal/cmd/run.go index bf8f8e3271b..dcb79267e7f 100644 --- a/signal/cmd/run.go +++ b/signal/cmd/run.go @@ -8,8 +8,7 @@ import ( "fmt" "net" "net/http" - // nolint:gosec - _ "net/http/pprof" + "time" "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" @@ -92,8 +91,6 @@ var ( RunE: func(cmd *cobra.Command, args []string) error { flag.Parse() - startPprof() - opts, certManager, tlsConfig, err := getTLSConfigurations() if err != nil { return err @@ -194,15 +191,6 @@ var ( } ) -func startPprof() { - go func() { - log.Debugf("Starting pprof server on 127.0.0.1:6060") - if err := http.ListenAndServe("127.0.0.1:6060", nil); err != nil { - log.Fatalf("pprof server failed: %v", err) - } - }() -} - func getTLSConfigurations() ([]grpc.ServerOption, *autocert.Manager, *tls.Config, error) { var ( err error From 6e4d3554917dae507bd000952f6b88a167d1a093 Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Thu, 18 Dec 2025 17:21:13 +0000 Subject: [PATCH 2/8] [management] add NB_PPROF_ADDR envvar support --- management/cmd/pprof.go | 33 +++++++++++++++++++++++++++++++++ management/main.go | 7 ------- 2 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 management/cmd/pprof.go diff --git a/management/cmd/pprof.go b/management/cmd/pprof.go new file mode 100644 index 00000000000..e85e9125387 --- /dev/null +++ b/management/cmd/pprof.go @@ -0,0 +1,33 @@ +//go:build pprof +// +build pprof + +package cmd + +import ( + "net/http" + _ "net/http/pprof" + "os" + + log "github.com/sirupsen/logrus" +) + +func init() { + addr := pprofAddr() + go pprof(addr) +} + +func pprofAddr() string { + listenAddr := os.Getenv("NB_PPROF_ADDR") + if listenAddr == "" { + return "localhost:6060" + } + + return listenAddr +} + +func pprof(listenAddr string) { + log.Infof("listening pprof on: %s\n", listenAddr) + if err := http.ListenAndServe(listenAddr, nil); err != nil { + log.Fatalf("Failed to start pprof: %v", err) + } +} diff --git a/management/main.go b/management/main.go index ff8482f9723..8db54370783 100644 --- a/management/main.go +++ b/management/main.go @@ -1,19 +1,12 @@ package main import ( - "log" - "net/http" - // nolint:gosec - _ "net/http/pprof" "os" "github.com/netbirdio/netbird/management/cmd" ) func main() { - go func() { - log.Println(http.ListenAndServe("localhost:6060", nil)) - }() if err := cmd.Execute(); err != nil { os.Exit(1) } From 8c2c251e950205b5126e1d28a9896047b186588b Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Tue, 17 Mar 2026 18:23:17 +0000 Subject: [PATCH 3/8] [util] add shared pprof package --- util/pprof/pprof.go | 33 +++++++++++++++++++++++++++++++++ util/pprof/pprof_off.go | 8 ++++++++ 2 files changed, 41 insertions(+) create mode 100644 util/pprof/pprof.go create mode 100644 util/pprof/pprof_off.go diff --git a/util/pprof/pprof.go b/util/pprof/pprof.go new file mode 100644 index 00000000000..3ca541b301a --- /dev/null +++ b/util/pprof/pprof.go @@ -0,0 +1,33 @@ +//go:build pprof +// +build pprof + +package pprof + +import ( + "net/http" + _ "net/http/pprof" + "os" + + log "github.com/sirupsen/logrus" +) + +func init() { + addr := pprofAddr() + go pprof(addr) +} + +func pprofAddr() string { + listenAddr := os.Getenv("NB_PPROF_ADDR") + if listenAddr == "" { + return "localhost:6060" + } + + return listenAddr +} + +func pprof(listenAddr string) { + log.Infof("listening pprof on: %s\n", listenAddr) + if err := http.ListenAndServe(listenAddr, nil); err != nil { + log.Fatalf("Failed to start pprof: %v", err) + } +} diff --git a/util/pprof/pprof_off.go b/util/pprof/pprof_off.go new file mode 100644 index 00000000000..2cbf8b6697f --- /dev/null +++ b/util/pprof/pprof_off.go @@ -0,0 +1,8 @@ +//go:build !pprof + +package pprof + +/* +Allow package build even without pprof tag. +Otherwise, Go complains that "build constraints exlude all Go files" +*/ From e94874980da1598142d78c3766305ddfa23725b3 Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Tue, 17 Mar 2026 18:24:58 +0000 Subject: [PATCH 4/8] [signal] use shared pprof package --- signal/cmd/pprof.go | 33 --------------------------------- signal/cmd/root.go | 1 + signal/main.go | 3 ++- 3 files changed, 3 insertions(+), 34 deletions(-) delete mode 100644 signal/cmd/pprof.go diff --git a/signal/cmd/pprof.go b/signal/cmd/pprof.go deleted file mode 100644 index e85e9125387..00000000000 --- a/signal/cmd/pprof.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build pprof -// +build pprof - -package cmd - -import ( - "net/http" - _ "net/http/pprof" - "os" - - log "github.com/sirupsen/logrus" -) - -func init() { - addr := pprofAddr() - go pprof(addr) -} - -func pprofAddr() string { - listenAddr := os.Getenv("NB_PPROF_ADDR") - if listenAddr == "" { - return "localhost:6060" - } - - return listenAddr -} - -func pprof(listenAddr string) { - log.Infof("listening pprof on: %s\n", listenAddr) - if err := http.ListenAndServe(listenAddr, nil); err != nil { - log.Fatalf("Failed to start pprof: %v", err) - } -} diff --git a/signal/cmd/root.go b/signal/cmd/root.go index 7fa75d92371..0e2d9e3dc38 100644 --- a/signal/cmd/root.go +++ b/signal/cmd/root.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" + _ "github.com/netbirdio/netbird/util/pprof" "github.com/netbirdio/netbird/version" ) diff --git a/signal/main.go b/signal/main.go index 328f23a9707..047b01c479d 100644 --- a/signal/main.go +++ b/signal/main.go @@ -1,8 +1,9 @@ package main import ( - "github.com/netbirdio/netbird/signal/cmd" "os" + + "github.com/netbirdio/netbird/signal/cmd" ) func main() { From 39ccc02fd3d0209dddd94e0795a9b5255f371121 Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Tue, 17 Mar 2026 18:28:09 +0000 Subject: [PATCH 5/8] [management] use shared pprof package --- management/cmd/pprof.go | 33 --------------------------------- management/cmd/root.go | 1 + 2 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 management/cmd/pprof.go diff --git a/management/cmd/pprof.go b/management/cmd/pprof.go deleted file mode 100644 index e85e9125387..00000000000 --- a/management/cmd/pprof.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build pprof -// +build pprof - -package cmd - -import ( - "net/http" - _ "net/http/pprof" - "os" - - log "github.com/sirupsen/logrus" -) - -func init() { - addr := pprofAddr() - go pprof(addr) -} - -func pprofAddr() string { - listenAddr := os.Getenv("NB_PPROF_ADDR") - if listenAddr == "" { - return "localhost:6060" - } - - return listenAddr -} - -func pprof(listenAddr string) { - log.Infof("listening pprof on: %s\n", listenAddr) - if err := http.ListenAndServe(listenAddr, nil); err != nil { - log.Fatalf("Failed to start pprof: %v", err) - } -} diff --git a/management/cmd/root.go b/management/cmd/root.go index b60f79c2360..cb135c00fab 100644 --- a/management/cmd/root.go +++ b/management/cmd/root.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/cobra" nbconfig "github.com/netbirdio/netbird/management/internals/server/config" + _ "github.com/netbirdio/netbird/util/pprof" "github.com/netbirdio/netbird/version" ) From 8eb0f82eac167c75a1c3d1be84af41d91861421a Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Tue, 17 Mar 2026 18:28:35 +0000 Subject: [PATCH 6/8] [relay] use shared pprof package --- relay/cmd/pprof.go | 33 --------------------------------- relay/cmd/root.go | 1 + 2 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 relay/cmd/pprof.go diff --git a/relay/cmd/pprof.go b/relay/cmd/pprof.go deleted file mode 100644 index 37efd35f0cd..00000000000 --- a/relay/cmd/pprof.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build pprof -// +build pprof - -package cmd - -import ( - "net/http" - _ "net/http/pprof" - "os" - - log "github.com/sirupsen/logrus" -) - -func init() { - addr := pprofAddr() - go pprof(addr) -} - -func pprofAddr() string { - listenAddr := os.Getenv("NB_PPROF_ADDR") - if listenAddr == "" { - return "localhost:6969" - } - - return listenAddr -} - -func pprof(listenAddr string) { - log.Infof("listening pprof on: %s\n", listenAddr) - if err := http.ListenAndServe(listenAddr, nil); err != nil { - log.Fatalf("Failed to start pprof: %v", err) - } -} diff --git a/relay/cmd/root.go b/relay/cmd/root.go index e7dadcfdf6a..2877343a111 100644 --- a/relay/cmd/root.go +++ b/relay/cmd/root.go @@ -23,6 +23,7 @@ import ( "github.com/netbirdio/netbird/shared/relay/auth" "github.com/netbirdio/netbird/signal/metrics" "github.com/netbirdio/netbird/util" + _ "github.com/netbirdio/netbird/util/pprof" ) type Config struct { From 684fd308cfd7574520fbab9ea782d870431f2319 Mon Sep 17 00:00:00 2001 From: Ujaan Das Date: Tue, 17 Mar 2026 18:29:38 +0000 Subject: [PATCH 7/8] [client] use shared pprof package --- client/cmd/pprof.go | 33 --------------------------------- client/cmd/root.go | 1 + 2 files changed, 1 insertion(+), 33 deletions(-) delete mode 100644 client/cmd/pprof.go diff --git a/client/cmd/pprof.go b/client/cmd/pprof.go deleted file mode 100644 index 37efd35f0cd..00000000000 --- a/client/cmd/pprof.go +++ /dev/null @@ -1,33 +0,0 @@ -//go:build pprof -// +build pprof - -package cmd - -import ( - "net/http" - _ "net/http/pprof" - "os" - - log "github.com/sirupsen/logrus" -) - -func init() { - addr := pprofAddr() - go pprof(addr) -} - -func pprofAddr() string { - listenAddr := os.Getenv("NB_PPROF_ADDR") - if listenAddr == "" { - return "localhost:6969" - } - - return listenAddr -} - -func pprof(listenAddr string) { - log.Infof("listening pprof on: %s\n", listenAddr) - if err := http.ListenAndServe(listenAddr, nil); err != nil { - log.Fatalf("Failed to start pprof: %v", err) - } -} diff --git a/client/cmd/root.go b/client/cmd/root.go index 9f2eb109c5e..72764785e77 100644 --- a/client/cmd/root.go +++ b/client/cmd/root.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc/credentials/insecure" "github.com/netbirdio/netbird/client/internal/profilemanager" + _ "github.com/netbirdio/netbird/util/pprof" ) const ( From 309a410d5e4dba50ccff728bda935ca3aaf1aca9 Mon Sep 17 00:00:00 2001 From: Ujaan Das <79176268+ujaandas@users.noreply.github.com> Date: Tue, 17 Mar 2026 18:57:03 +0000 Subject: [PATCH 8/8] [util] fix typo in util/pprof/pprof_off.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- util/pprof/pprof_off.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/pprof/pprof_off.go b/util/pprof/pprof_off.go index 2cbf8b6697f..93ae0882a21 100644 --- a/util/pprof/pprof_off.go +++ b/util/pprof/pprof_off.go @@ -4,5 +4,5 @@ package pprof /* Allow package build even without pprof tag. -Otherwise, Go complains that "build constraints exlude all Go files" +Otherwise, Go complains that "build constraints exclude all Go files" */