3838 dynamoAddress = flag .String ("dynamoAddress" , ":8000" , "DynamoDB-compatible API address" )
3939 metricsAddress = flag .String ("metricsAddress" , "127.0.0.1:9090" , "Prometheus metrics address" )
4040 metricsToken = flag .String ("metricsToken" , "" , "Bearer token for Prometheus metrics; required for non-loopback metricsAddress" )
41+ pprofAddress = flag .String ("pprofAddress" , "localhost:6060" , "TCP host+port for pprof debug endpoints; empty to disable" )
42+ pprofToken = flag .String ("pprofToken" , "" , "Bearer token for pprof; required for non-loopback pprofAddress" )
4143 raftID = flag .String ("raftId" , "" , "Raft ID" )
4244 raftDataDir = flag .String ("raftDataDir" , "/var/lib/elastickv" , "Raft data directory" )
4345 raftBootstrap = flag .Bool ("raftBootstrap" , false , "Bootstrap cluster" )
@@ -67,6 +69,8 @@ type config struct {
6769 dynamoAddress string
6870 metricsAddress string
6971 metricsToken string
72+ pprofAddress string
73+ pprofToken string
7074 raftID string
7175 raftDataDir string
7276 raftBootstrap bool
@@ -86,6 +90,8 @@ func main() {
8690 dynamoAddress : * dynamoAddress ,
8791 metricsAddress : * metricsAddress ,
8892 metricsToken : * metricsToken ,
93+ pprofAddress : * pprofAddress ,
94+ pprofToken : * pprofToken ,
8995 raftID : * raftID ,
9096 raftDataDir : * raftDataDir ,
9197 raftBootstrap : * raftBootstrap ,
@@ -106,6 +112,7 @@ func main() {
106112 dynamoAddress : "127.0.0.1:63801" ,
107113 metricsAddress : "0.0.0.0:9091" ,
108114 metricsToken : demoMetricsToken ,
115+ pprofAddress : "127.0.0.1:6061" ,
109116 raftID : "n1" ,
110117 raftDataDir : "" , // In-memory
111118 raftBootstrap : true ,
@@ -116,6 +123,7 @@ func main() {
116123 dynamoAddress : "127.0.0.1:63802" ,
117124 metricsAddress : "0.0.0.0:9092" ,
118125 metricsToken : demoMetricsToken ,
126+ pprofAddress : "127.0.0.1:6062" ,
119127 raftID : "n2" ,
120128 raftDataDir : "" ,
121129 raftBootstrap : false ,
@@ -126,6 +134,7 @@ func main() {
126134 dynamoAddress : "127.0.0.1:63803" ,
127135 metricsAddress : "0.0.0.0:9093" ,
128136 metricsToken : demoMetricsToken ,
137+ pprofAddress : "127.0.0.1:6063" ,
129138 raftID : "n3" ,
130139 raftDataDir : "" ,
131140 raftBootstrap : false ,
@@ -452,6 +461,15 @@ func run(ctx context.Context, eg *errgroup.Group, cfg config) error {
452461 _ = metricsL .Close ()
453462 })
454463 }
464+ pprofL , ps , err := setupPprofHTTPServer (ctx , lc , cfg .pprofAddress , cfg .pprofToken )
465+ if err != nil {
466+ return err
467+ }
468+ if pprofL != nil {
469+ cleanup .Add (func () {
470+ _ = pprofL .Close ()
471+ })
472+ }
455473
456474 eg .Go (catalogWatcherTask (ctx , distCatalog , distEngine ))
457475 eg .Go (func () error { return compactor .Run (ctx ) })
@@ -463,6 +481,8 @@ func run(ctx context.Context, eg *errgroup.Group, cfg config) error {
463481 eg .Go (dynamoServeTask (ds , cfg .dynamoAddress ))
464482 eg .Go (monitoring .MetricsShutdownTask (ctx , ms , cfg .metricsAddress ))
465483 eg .Go (monitoring .MetricsServeTask (ms , metricsL , cfg .metricsAddress ))
484+ eg .Go (monitoring .PprofShutdownTask (ctx , ps , cfg .pprofAddress ))
485+ eg .Go (monitoring .PprofServeTask (ps , pprofL , cfg .pprofAddress ))
466486
467487 cleanup .Release ()
468488 return nil
@@ -476,7 +496,7 @@ func setupMetricsHTTPServer(ctx context.Context, lc net.ListenConfig, metricsAdd
476496 if _ , _ , err := net .SplitHostPort (metricsAddress ); err != nil {
477497 return nil , nil , errors .Wrapf (err , "invalid metricsAddress %q" , metricsAddress )
478498 }
479- if monitoring .MetricsAddressRequiresToken (metricsAddress ) && strings .TrimSpace (metricsToken ) == "" {
499+ if monitoring .AddressRequiresToken (metricsAddress ) && strings .TrimSpace (metricsToken ) == "" {
480500 return nil , nil , errors .New ("metricsToken is required when metricsAddress is not loopback" )
481501 }
482502 metricsL , err := lc .Listen (ctx , "tcp" , metricsAddress )
@@ -487,6 +507,25 @@ func setupMetricsHTTPServer(ctx context.Context, lc net.ListenConfig, metricsAdd
487507 return metricsL , ms , nil
488508}
489509
510+ func setupPprofHTTPServer (ctx context.Context , lc net.ListenConfig , pprofAddress string , pprofToken string ) (net.Listener , * http.Server , error ) {
511+ pprofAddress = strings .TrimSpace (pprofAddress )
512+ if pprofAddress == "" {
513+ return nil , nil , nil
514+ }
515+ if _ , _ , err := net .SplitHostPort (pprofAddress ); err != nil {
516+ return nil , nil , errors .Wrapf (err , "invalid pprofAddress %q" , pprofAddress )
517+ }
518+ if monitoring .AddressRequiresToken (pprofAddress ) && strings .TrimSpace (pprofToken ) == "" {
519+ return nil , nil , errors .New ("pprofToken is required when pprofAddress is not loopback" )
520+ }
521+ pprofL , err := lc .Listen (ctx , "tcp" , pprofAddress )
522+ if err != nil {
523+ return nil , nil , errors .WithStack (err )
524+ }
525+ ps := monitoring .NewPprofServer (pprofToken )
526+ return pprofL , ps , nil
527+ }
528+
490529func bootstrapClusterIfNeeded (r * raft.Raft , cfg config ) error {
491530 if ! cfg .raftBootstrap {
492531 return nil
0 commit comments