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 ,
@@ -443,15 +452,10 @@ func run(ctx context.Context, eg *errgroup.Group, cfg config) error {
443452 adapter .WithDynamoDBRequestObserver (metricsRegistry .DynamoDBObserver ()),
444453 )
445454 cleanup .Add (ds .Stop )
446- metricsL , ms , err := setupMetricsHTTPServer (ctx , lc , cfg . metricsAddress , cfg . metricsToken , metricsRegistry .Handler ())
455+ metricsL , ms , pprofL , ps , err := setupObservabilityServers (ctx , lc , & cleanup , cfg , metricsRegistry .Handler ())
447456 if err != nil {
448457 return err
449458 }
450- if metricsL != nil {
451- cleanup .Add (func () {
452- _ = metricsL .Close ()
453- })
454- }
455459
456460 eg .Go (catalogWatcherTask (ctx , distCatalog , distEngine ))
457461 eg .Go (func () error { return compactor .Run (ctx ) })
@@ -463,11 +467,31 @@ func run(ctx context.Context, eg *errgroup.Group, cfg config) error {
463467 eg .Go (dynamoServeTask (ds , cfg .dynamoAddress ))
464468 eg .Go (monitoring .MetricsShutdownTask (ctx , ms , cfg .metricsAddress ))
465469 eg .Go (monitoring .MetricsServeTask (ms , metricsL , cfg .metricsAddress ))
470+ eg .Go (monitoring .PprofShutdownTask (ctx , ps , cfg .pprofAddress ))
471+ eg .Go (monitoring .PprofServeTask (ps , pprofL , cfg .pprofAddress ))
466472
467473 cleanup .Release ()
468474 return nil
469475}
470476
477+ func setupObservabilityServers (ctx context.Context , lc net.ListenConfig , cleanup * internalutil.CleanupStack , cfg config , metricsHandler http.Handler ) (metricsL net.Listener , ms * http.Server , pprofL net.Listener , ps * http.Server , err error ) {
478+ metricsL , ms , err = setupMetricsHTTPServer (ctx , lc , cfg .metricsAddress , cfg .metricsToken , metricsHandler )
479+ if err != nil {
480+ return
481+ }
482+ if metricsL != nil {
483+ cleanup .Add (func () { _ = metricsL .Close () })
484+ }
485+ pprofL , ps , err = setupPprofHTTPServer (ctx , lc , cfg .pprofAddress , cfg .pprofToken )
486+ if err != nil {
487+ return
488+ }
489+ if pprofL != nil {
490+ cleanup .Add (func () { _ = pprofL .Close () })
491+ }
492+ return
493+ }
494+
471495func setupMetricsHTTPServer (ctx context.Context , lc net.ListenConfig , metricsAddress string , metricsToken string , handler http.Handler ) (net.Listener , * http.Server , error ) {
472496 metricsAddress = strings .TrimSpace (metricsAddress )
473497 if metricsAddress == "" || handler == nil {
@@ -476,7 +500,7 @@ func setupMetricsHTTPServer(ctx context.Context, lc net.ListenConfig, metricsAdd
476500 if _ , _ , err := net .SplitHostPort (metricsAddress ); err != nil {
477501 return nil , nil , errors .Wrapf (err , "invalid metricsAddress %q" , metricsAddress )
478502 }
479- if monitoring .MetricsAddressRequiresToken (metricsAddress ) && strings .TrimSpace (metricsToken ) == "" {
503+ if monitoring .AddressRequiresToken (metricsAddress ) && strings .TrimSpace (metricsToken ) == "" {
480504 return nil , nil , errors .New ("metricsToken is required when metricsAddress is not loopback" )
481505 }
482506 metricsL , err := lc .Listen (ctx , "tcp" , metricsAddress )
@@ -487,6 +511,25 @@ func setupMetricsHTTPServer(ctx context.Context, lc net.ListenConfig, metricsAdd
487511 return metricsL , ms , nil
488512}
489513
514+ func setupPprofHTTPServer (ctx context.Context , lc net.ListenConfig , pprofAddress string , pprofToken string ) (net.Listener , * http.Server , error ) {
515+ pprofAddress = strings .TrimSpace (pprofAddress )
516+ if pprofAddress == "" {
517+ return nil , nil , nil
518+ }
519+ if _ , _ , err := net .SplitHostPort (pprofAddress ); err != nil {
520+ return nil , nil , errors .Wrapf (err , "invalid pprofAddress %q" , pprofAddress )
521+ }
522+ if monitoring .AddressRequiresToken (pprofAddress ) && strings .TrimSpace (pprofToken ) == "" {
523+ return nil , nil , errors .New ("pprofToken is required when pprofAddress is not loopback" )
524+ }
525+ pprofL , err := lc .Listen (ctx , "tcp" , pprofAddress )
526+ if err != nil {
527+ return nil , nil , errors .WithStack (err )
528+ }
529+ ps := monitoring .NewPprofServer (pprofToken )
530+ return pprofL , ps , nil
531+ }
532+
490533func bootstrapClusterIfNeeded (r * raft.Raft , cfg config ) error {
491534 if ! cfg .raftBootstrap {
492535 return nil
0 commit comments