@@ -14,6 +14,7 @@ import (
14
14
"fmt"
15
15
"io"
16
16
"log"
17
+ "net"
17
18
"net/http"
18
19
"os"
19
20
"sort"
@@ -111,6 +112,9 @@ type App struct {
111
112
tunTargetCfn map [tunnel.Target ]context.CancelFunc
112
113
// processors plugin manager
113
114
pm * plugin_manager.PluginManager
115
+
116
+ // pprof
117
+ pprof * pprofServer
114
118
}
115
119
116
120
func New () * App {
@@ -149,6 +153,9 @@ func New() *App {
149
153
ttm : new (sync.RWMutex ),
150
154
tunTargets : make (map [tunnel.Target ]struct {}),
151
155
tunTargetCfn : make (map [tunnel.Target ]context.CancelFunc ),
156
+
157
+ // pprof
158
+ pprof : newPprofServer (),
152
159
}
153
160
a .router .StrictSlash (true )
154
161
a .router .Use (headersMiddleware , a .loggingMiddleware )
@@ -177,6 +184,8 @@ func (a *App) InitGlobalFlags() {
177
184
a .RootCmd .PersistentFlags ().StringVarP (& a .Config .GlobalFlags .TLSKey , "tls-key" , "" , "" , "tls key" )
178
185
a .RootCmd .PersistentFlags ().DurationVarP (& a .Config .GlobalFlags .Timeout , "timeout" , "" , 10 * time .Second , "grpc timeout, valid formats: 10s, 1m30s, 1h" )
179
186
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" )
180
189
a .RootCmd .PersistentFlags ().BoolVarP (& a .Config .GlobalFlags .SkipVerify , "skip-verify" , "" , false , "skip verify tls connection" )
181
190
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" )
182
191
a .RootCmd .PersistentFlags ().BoolVarP (& a .Config .GlobalFlags .ProxyFromEnv , "proxy-from-env" , "" , false , "use proxy from environment" )
@@ -218,6 +227,19 @@ func (a *App) InitGlobalFlags() {
218
227
}
219
228
220
229
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
+
221
243
a .Config .SetGlobalsFromEnv (a .RootCmd )
222
244
a .Config .SetPersistentFlagsFromFile (a .RootCmd )
223
245
0 commit comments