Skip to content

Commit b409b07

Browse files
authored
Merge pull request #725 from senthilsam/feat/pprof
feat: add pprof support
2 parents 0aa04b5 + 1ee2442 commit b409b07

File tree

4 files changed

+60
-0
lines changed

4 files changed

+60
-0
lines changed

pkg/app/app.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"fmt"
1515
"io"
1616
"log"
17+
"net"
1718
"net/http"
1819
"os"
1920
"sort"
@@ -111,6 +112,9 @@ type App struct {
111112
tunTargetCfn map[tunnel.Target]context.CancelFunc
112113
// processors plugin manager
113114
pm *plugin_manager.PluginManager
115+
116+
// pprof
117+
pprof *pprofServer
114118
}
115119

116120
func New() *App {
@@ -149,6 +153,9 @@ func New() *App {
149153
ttm: new(sync.RWMutex),
150154
tunTargets: make(map[tunnel.Target]struct{}),
151155
tunTargetCfn: make(map[tunnel.Target]context.CancelFunc),
156+
157+
// pprof
158+
pprof: newPprofServer(),
152159
}
153160
a.router.StrictSlash(true)
154161
a.router.Use(headersMiddleware, a.loggingMiddleware)
@@ -177,6 +184,8 @@ func (a *App) InitGlobalFlags() {
177184
a.RootCmd.PersistentFlags().StringVarP(&a.Config.GlobalFlags.TLSKey, "tls-key", "", "", "tls key")
178185
a.RootCmd.PersistentFlags().DurationVarP(&a.Config.GlobalFlags.Timeout, "timeout", "", 10*time.Second, "grpc timeout, valid formats: 10s, 1m30s, 1h")
179186
a.RootCmd.PersistentFlags().BoolVarP(&a.Config.GlobalFlags.Debug, "debug", "d", false, "debug mode")
187+
a.RootCmd.PersistentFlags().BoolVarP(&a.Config.GlobalFlags.EnablePprof, "enable-pprof", "", false, "enable go pprof")
188+
a.RootCmd.PersistentFlags().StringVarP(&a.Config.GlobalFlags.PprofAddr, "pprof-addr", "", defaultPprofAddr, "pprof host/IP and port to listen on")
180189
a.RootCmd.PersistentFlags().BoolVarP(&a.Config.GlobalFlags.SkipVerify, "skip-verify", "", false, "skip verify tls connection")
181190
a.RootCmd.PersistentFlags().BoolVarP(&a.Config.GlobalFlags.NoPrefix, "no-prefix", "", false, "do not add [ip:port] prefix to print output in case of multiple targets")
182191
a.RootCmd.PersistentFlags().BoolVarP(&a.Config.GlobalFlags.ProxyFromEnv, "proxy-from-env", "", false, "use proxy from environment")
@@ -218,6 +227,19 @@ func (a *App) InitGlobalFlags() {
218227
}
219228

220229
func (a *App) PreRunE(cmd *cobra.Command, args []string) error {
230+
if a.Config.EnablePprof {
231+
_, _, err := net.SplitHostPort(a.Config.GlobalFlags.PprofAddr)
232+
if err != nil {
233+
return fmt.Errorf("pprof error %v", err)
234+
}
235+
a.pprof.Start(a.Config.GlobalFlags.PprofAddr)
236+
a.Logger.Printf("pprof server started at %s/debug/pprof", a.Config.GlobalFlags.PprofAddr)
237+
go func() {
238+
err := <-a.pprof.ErrChan()
239+
a.Logger.Printf("pprof server failed: %v", err)
240+
}()
241+
}
242+
221243
a.Config.SetGlobalsFromEnv(a.RootCmd)
222244
a.Config.SetPersistentFlagsFromFile(a.RootCmd)
223245

pkg/app/const.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const (
1414
defaultGrpcPort = "57400"
1515
msgSize = 512 * 1024 * 1024
1616
defaultRetryTimer = 10 * time.Second
17+
defaultPprofAddr = "127.0.0.1:6060"
1718

1819
formatJSON = "json"
1920
formatPROTOJSON = "protojson"

pkg/app/pprof.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package app
2+
3+
import (
4+
"net/http"
5+
_ "net/http/pprof" //nolint:gosec // Import for pprof, only enabled via CLI flag
6+
"time"
7+
)
8+
9+
type pprofServer struct {
10+
err chan error
11+
}
12+
13+
func newPprofServer() *pprofServer {
14+
return &pprofServer{
15+
err: make(chan error, 1),
16+
}
17+
}
18+
19+
func (p *pprofServer) Start(address string) {
20+
go func() {
21+
server := &http.Server{
22+
Addr: address,
23+
ReadHeaderTimeout: 10 * time.Second,
24+
}
25+
26+
if err := server.ListenAndServe(); err != nil {
27+
p.err <- err
28+
}
29+
close(p.err)
30+
}()
31+
}
32+
33+
func (p *pprofServer) ErrChan() <-chan error {
34+
return p.err
35+
}

pkg/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ type GlobalFlags struct {
9191
LogTLSSecret bool `mapstructure:"log-tls-secret,omitempty" json:"log-tls-secret,omitempty" yaml:"log-tls-secret,omitempty"`
9292
Timeout time.Duration `mapstructure:"timeout,omitempty" json:"timeout,omitempty" yaml:"timeout,omitempty"`
9393
Debug bool `mapstructure:"debug,omitempty" json:"debug,omitempty" yaml:"debug,omitempty"`
94+
EnablePprof bool `mapstructure:"enable-pprof,omitempty" json:"enable-pprof,omitempty" yaml:"enable-pprof,omitempty"`
95+
PprofAddr string `mapstructure:"pprof-addr,omitempty" json:"pprof-addr,omitempty" yaml:"pprof-addr,omitempty"`
9496
SkipVerify bool `mapstructure:"skip-verify,omitempty" json:"skip-verify,omitempty" yaml:"skip-verify,omitempty"`
9597
NoPrefix bool `mapstructure:"no-prefix,omitempty" json:"no-prefix,omitempty" yaml:"no-prefix,omitempty"`
9698
ProxyFromEnv bool `mapstructure:"proxy-from-env,omitempty" json:"proxy-from-env,omitempty" yaml:"proxy-from-env,omitempty"`

0 commit comments

Comments
 (0)