From 02adb2945d627da16a473cf136e1bb60c6608c0c Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 16:09:28 +0100 Subject: [PATCH 01/12] enable diagnostics by default --- cmd/devnet/devnet/node.go | 2 +- cmd/erigon/main.go | 8 +--- diagnostics/setup.go | 96 +++++++++++++++++++++++++++++--------- erigon-lib/go.mod | 2 +- erigon-lib/go.sum | 2 +- turbo/app/snapshots_cmd.go | 8 +--- 6 files changed, 82 insertions(+), 36 deletions(-) diff --git a/cmd/devnet/devnet/node.go b/cmd/devnet/devnet/node.go index 33f716aa3f3..b1271c6efff 100644 --- a/cmd/devnet/devnet/node.go +++ b/cmd/devnet/devnet/node.go @@ -185,7 +185,7 @@ func (n *devnetNode) run(ctx *cli.Context) error { n.ethNode, err = enode.New(ctx.Context, n.nodeCfg, n.ethCfg, logger) if metricsMux != nil { - diagnostics.Setup(ctx, metricsMux, n.ethNode) + diagnostics.Setup(ctx, n.ethNode) } n.Lock() diff --git a/cmd/erigon/main.go b/cmd/erigon/main.go index b3dd55dcdb5..3420c4e8f07 100644 --- a/cmd/erigon/main.go +++ b/cmd/erigon/main.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "net/http" "os" "github.com/ledgerwatch/log/v3" @@ -43,9 +42,8 @@ func main() { func runErigon(cliCtx *cli.Context) error { var logger log.Logger var err error - var metricsMux *http.ServeMux - if logger, metricsMux, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } @@ -68,9 +66,7 @@ func runErigon(cliCtx *cli.Context) error { return err } - if metricsMux != nil { - diagnostics.Setup(cliCtx, metricsMux, ethNode) - } + diagnostics.Setup(cliCtx, ethNode) err = ethNode.Serve() if err != nil { diff --git a/diagnostics/setup.go b/diagnostics/setup.go index 6779d31c1b8..768f316ef6e 100644 --- a/diagnostics/setup.go +++ b/diagnostics/setup.go @@ -1,6 +1,7 @@ package diagnostics import ( + "fmt" "net/http" "strings" @@ -8,33 +9,86 @@ import ( diaglib "github.com/ledgerwatch/erigon-lib/diagnostics" "github.com/ledgerwatch/erigon/turbo/node" + "github.com/ledgerwatch/log/v3" ) -func Setup(ctx *cli.Context, metricsMux *http.ServeMux, node *node.ErigonNode) { - debugMux := http.NewServeMux() +var ( + diagnosticsDisabledFlag = cli.BoolFlag{ + Name: "diagnostics.disabled", + Usage: "Disable diagnostics", + } + diagnosticsAddrFlag = cli.StringFlag{ + Name: "diagnostics.addr", + Usage: "Diagnostics HTTP server listening interface", + Value: "127.0.0.1", + } + diagnosticsPortFlag = cli.UintFlag{ + Name: "diagnostics.port", + Usage: "Diagnostics HTTP server listening port", + Value: 6059, + } +) + +func Setup(ctx *cli.Context, node *node.ErigonNode) { + if ctx.Bool(diagnosticsDisabledFlag.Name) { + return + } - diagnostic := diaglib.NewDiagnosticClient(debugMux, node.Backend().DataDir()) + diagMux := SetupDiagnosticsEndpoint(ctx) + diagnostic := diaglib.NewDiagnosticClient(diagMux, node.Backend().DataDir()) diagnostic.Setup() - metricsMux.HandleFunc("/debug/", func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug") - r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug") - debugMux.ServeHTTP(w, r) + SetupEndpoints(ctx, node, diagMux, diagnostic) +} + +func SetupDiagnosticsEndpoint(ctx *cli.Context) *http.ServeMux { + address := diagnosticsAddrFlag.Value + if ctx.String(diagnosticsAddrFlag.Name) != "" { + address = ctx.String(diagnosticsAddrFlag.Name) + } + + port := diagnosticsPortFlag.Value + if ctx.Uint(diagnosticsPortFlag.Name) != 0 { + port = ctx.Uint(diagnosticsPortFlag.Name) + } + + diagnosticsAddress := fmt.Sprintf("%s:%d", address, port) + + diagMux := http.NewServeMux() + + promServer := &http.Server{ + Addr: diagnosticsAddress, + Handler: diagMux, + } + + go func() { + if err := promServer.ListenAndServe(); err != nil { + log.Error("[Diagnostics] Failure in running diagnostics server", "err", err) + } + }() + + diagMux.HandleFunc("/diag/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/diag") + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/diag") + diagMux.ServeHTTP(w, r) }) - SetupLogsAccess(ctx, debugMux) - SetupDbAccess(ctx, debugMux) - SetupCmdLineAccess(debugMux) - SetupFlagsAccess(ctx, debugMux) - SetupVersionAccess(debugMux) - SetupBlockBodyDownload(debugMux) - SetupHeaderDownloadStats(debugMux) - SetupNodeInfoAccess(debugMux, node) - SetupPeersAccess(ctx, debugMux, node, diagnostic) - SetupBootnodesAccess(debugMux, node) - SetupStagesAccess(debugMux, diagnostic) - SetupMemAccess(debugMux) - SetupHeadersAccess(debugMux, diagnostic) - SetupBodiesAccess(debugMux, diagnostic) + return diagMux +} +func SetupEndpoints(ctx *cli.Context, node *node.ErigonNode, diagMux *http.ServeMux, diagnostic *diaglib.DiagnosticClient) { + SetupLogsAccess(ctx, diagMux) + SetupDbAccess(ctx, diagMux) + SetupCmdLineAccess(diagMux) + SetupFlagsAccess(ctx, diagMux) + SetupVersionAccess(diagMux) + SetupBlockBodyDownload(diagMux) + SetupHeaderDownloadStats(diagMux) + SetupNodeInfoAccess(diagMux, node) + SetupPeersAccess(ctx, diagMux, node, diagnostic) + SetupBootnodesAccess(diagMux, node) + SetupStagesAccess(diagMux, diagnostic) + SetupMemAccess(diagMux) + SetupHeadersAccess(diagMux, diagnostic) + SetupBodiesAccess(diagMux, diagnostic) } diff --git a/erigon-lib/go.mod b/erigon-lib/go.mod index 6d23b87681f..f07c7696ba0 100644 --- a/erigon-lib/go.mod +++ b/erigon-lib/go.mod @@ -142,4 +142,4 @@ require ( zombiezen.com/go/sqlite v0.13.1 // indirect ) -replace github.com/anacrolix/torrent => github.com/erigontech/torrent v1.54.2-alpha +replace github.com/anacrolix/torrent => github.com/erigontech/torrent v1.54.2-alpha \ No newline at end of file diff --git a/erigon-lib/go.sum b/erigon-lib/go.sum index 8448cc70560..b78fe520cb6 100644 --- a/erigon-lib/go.sum +++ b/erigon-lib/go.sum @@ -688,4 +688,4 @@ modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= zombiezen.com/go/sqlite v0.13.1 h1:qDzxyWWmMtSSEH5qxamqBFmqA2BLSSbtODi3ojaE02o= -zombiezen.com/go/sqlite v0.13.1/go.mod h1:Ht/5Rg3Ae2hoyh1I7gbWtWAl89CNocfqeb/aAMTkJr4= +zombiezen.com/go/sqlite v0.13.1/go.mod h1:Ht/5Rg3Ae2hoyh1I7gbWtWAl89CNocfqeb/aAMTkJr4= \ No newline at end of file diff --git a/turbo/app/snapshots_cmd.go b/turbo/app/snapshots_cmd.go index 5acf0333ff8..d3c01fb9642 100644 --- a/turbo/app/snapshots_cmd.go +++ b/turbo/app/snapshots_cmd.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "io" - "net/http" "os" "path/filepath" "runtime" @@ -683,9 +682,8 @@ func doRetireCommand(cliCtx *cli.Context) error { func doUploaderCommand(cliCtx *cli.Context) error { var logger log.Logger var err error - var metricsMux *http.ServeMux - if logger, metricsMux, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } @@ -708,9 +706,7 @@ func doUploaderCommand(cliCtx *cli.Context) error { return err } - if metricsMux != nil { - diagnostics.Setup(cliCtx, metricsMux, ethNode) - } + diagnostics.Setup(cliCtx, ethNode) err = ethNode.Serve() if err != nil { From 129d0efcaf245fce475a274438081b49b74ff9ec Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 16:40:10 +0100 Subject: [PATCH 02/12] added flags --- cmd/utils/flags.go | 17 ++++++++++++++++- diagnostics/setup.go | 5 +---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 1097ad128f0..e9810bfca18 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -995,9 +995,24 @@ var ( Usage: "set the cors' allow origins", Value: cli.NewStringSlice(), } + DiagDisabledFlag = cli.BoolFlag{ + Name: "diagnostics.disabled", + Usage: "Disable diagnostics", + Value: false, + } + DiagEndpointAddrFlag = cli.StringFlag{ + Name: "diagnostics.addr", + Usage: "Diagnostics HTTP server listening interface", + Value: "127.0.0.1", + } + DiagEndpointPortFlag = cli.UintFlag{ + Name: "diagnostics.port", + Usage: "Diagnostics HTTP server listening port", + Value: 6059, + } ) -var MetricFlags = []cli.Flag{&MetricsEnabledFlag, &MetricsHTTPFlag, &MetricsPortFlag} +var MetricFlags = []cli.Flag{&MetricsEnabledFlag, &MetricsHTTPFlag, &MetricsPortFlag, &DiagDisabledFlag, &DiagEndpointAddrFlag, &DiagEndpointPortFlag} var DiagnosticsFlags = []cli.Flag{&DiagnosticsURLFlag, &DiagnosticsURLFlag, &DiagnosticsSessionsFlag} diff --git a/diagnostics/setup.go b/diagnostics/setup.go index 768f316ef6e..06b6d61f4df 100644 --- a/diagnostics/setup.go +++ b/diagnostics/setup.go @@ -14,17 +14,14 @@ import ( var ( diagnosticsDisabledFlag = cli.BoolFlag{ - Name: "diagnostics.disabled", - Usage: "Disable diagnostics", + Name: "diagnostics.disabled", } diagnosticsAddrFlag = cli.StringFlag{ Name: "diagnostics.addr", - Usage: "Diagnostics HTTP server listening interface", Value: "127.0.0.1", } diagnosticsPortFlag = cli.UintFlag{ Name: "diagnostics.port", - Usage: "Diagnostics HTTP server listening port", Value: 6059, } ) From 77b77254dfdd79edd4ac3afed51d96edc4a182b8 Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 17:24:57 +0100 Subject: [PATCH 03/12] tidy --- erigon-lib/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erigon-lib/go.mod b/erigon-lib/go.mod index f07c7696ba0..6d23b87681f 100644 --- a/erigon-lib/go.mod +++ b/erigon-lib/go.mod @@ -142,4 +142,4 @@ require ( zombiezen.com/go/sqlite v0.13.1 // indirect ) -replace github.com/anacrolix/torrent => github.com/erigontech/torrent v1.54.2-alpha \ No newline at end of file +replace github.com/anacrolix/torrent => github.com/erigontech/torrent v1.54.2-alpha From b2f9427a161d30deb4a09d8118a400e32d4eb2c2 Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 18:04:01 +0100 Subject: [PATCH 04/12] upd --- diagnostics/setup.go | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/diagnostics/setup.go b/diagnostics/setup.go index 06b6d61f4df..3cdba408e26 100644 --- a/diagnostics/setup.go +++ b/diagnostics/setup.go @@ -13,21 +13,13 @@ import ( ) var ( - diagnosticsDisabledFlag = cli.BoolFlag{ - Name: "diagnostics.disabled", - } - diagnosticsAddrFlag = cli.StringFlag{ - Name: "diagnostics.addr", - Value: "127.0.0.1", - } - diagnosticsPortFlag = cli.UintFlag{ - Name: "diagnostics.port", - Value: 6059, - } + diagnosticsDisabledFlag = "diagnostics.disabled" + diagnosticsAddrFlag = "diagnostics.addr" + diagnosticsPortFlag = "diagnostics.port" ) func Setup(ctx *cli.Context, node *node.ErigonNode) { - if ctx.Bool(diagnosticsDisabledFlag.Name) { + if ctx.Bool(diagnosticsDisabledFlag) { return } @@ -39,27 +31,20 @@ func Setup(ctx *cli.Context, node *node.ErigonNode) { } func SetupDiagnosticsEndpoint(ctx *cli.Context) *http.ServeMux { - address := diagnosticsAddrFlag.Value - if ctx.String(diagnosticsAddrFlag.Name) != "" { - address = ctx.String(diagnosticsAddrFlag.Name) - } - - port := diagnosticsPortFlag.Value - if ctx.Uint(diagnosticsPortFlag.Name) != 0 { - port = ctx.Uint(diagnosticsPortFlag.Name) - } + address := ctx.String(diagnosticsAddrFlag) + port := ctx.Uint(diagnosticsPortFlag) diagnosticsAddress := fmt.Sprintf("%s:%d", address, port) diagMux := http.NewServeMux() - promServer := &http.Server{ + diagServer := &http.Server{ Addr: diagnosticsAddress, Handler: diagMux, } go func() { - if err := promServer.ListenAndServe(); err != nil { + if err := diagServer.ListenAndServe(); err != nil { log.Error("[Diagnostics] Failure in running diagnostics server", "err", err) } }() From cce526bca301f82641e57e91d00f911e7f3a051a Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 18:56:11 +0100 Subject: [PATCH 05/12] removed metrix mux return --- cmd/caplin/main.go | 2 +- cmd/devnet/devnet/node.go | 8 ++------ cmd/erigon/main.go | 2 +- cmd/silkworm_api/snapshot_idx.go | 2 +- turbo/app/backup_cmd.go | 2 +- turbo/app/import_cmd.go | 2 +- turbo/app/init_cmd.go | 2 +- turbo/app/snapshots_cmd.go | 18 +++++++++--------- turbo/app/support_cmd.go | 2 +- turbo/debug/flags.go | 8 ++++---- 10 files changed, 22 insertions(+), 26 deletions(-) diff --git a/cmd/caplin/main.go b/cmd/caplin/main.go index 0c1fb0cab17..f37f6939072 100644 --- a/cmd/caplin/main.go +++ b/cmd/caplin/main.go @@ -55,7 +55,7 @@ func runCaplinNode(cliCtx *cli.Context) error { log.Error("[Phase1] Could not initialize caplin", "err", err) return err } - if _, _, err := debug.Setup(cliCtx, true /* root logger */); err != nil { + if _, err := debug.Setup(cliCtx, true /* root logger */); err != nil { return err } rcfg := beacon_router_configuration.RouterConfiguration{ diff --git a/cmd/devnet/devnet/node.go b/cmd/devnet/devnet/node.go index b1271c6efff..ab688424b19 100644 --- a/cmd/devnet/devnet/node.go +++ b/cmd/devnet/devnet/node.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "math/big" - "net/http" "sync" "github.com/c2h5oh/datasize" @@ -139,7 +138,6 @@ func (n *devnetNode) EnableMetrics(int) { func (n *devnetNode) run(ctx *cli.Context) error { var logger log.Logger var err error - var metricsMux *http.ServeMux defer n.done() defer func() { @@ -152,7 +150,7 @@ func (n *devnetNode) run(ctx *cli.Context) error { n.Unlock() }() - if logger, metricsMux, err = debug.Setup(ctx, false /* rootLogger */); err != nil { + if logger, err = debug.Setup(ctx, false /* rootLogger */); err != nil { return err } @@ -184,9 +182,7 @@ func (n *devnetNode) run(ctx *cli.Context) error { n.ethNode, err = enode.New(ctx.Context, n.nodeCfg, n.ethCfg, logger) - if metricsMux != nil { - diagnostics.Setup(ctx, n.ethNode) - } + diagnostics.Setup(ctx, n.ethNode) n.Lock() if n.startErr != nil { diff --git a/cmd/erigon/main.go b/cmd/erigon/main.go index 3420c4e8f07..3e4d1c1b4ce 100644 --- a/cmd/erigon/main.go +++ b/cmd/erigon/main.go @@ -43,7 +43,7 @@ func runErigon(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } diff --git a/cmd/silkworm_api/snapshot_idx.go b/cmd/silkworm_api/snapshot_idx.go index fc2bec288c5..0250baba471 100644 --- a/cmd/silkworm_api/snapshot_idx.go +++ b/cmd/silkworm_api/snapshot_idx.go @@ -55,7 +55,7 @@ func FindIf(segments []snaptype.FileInfo, predicate func(snaptype.FileInfo) bool } func buildIndex(cliCtx *cli.Context, dataDir string, snapshotPaths []string, minBlock uint64) error { - logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/app/backup_cmd.go b/turbo/app/backup_cmd.go index 74458c5980c..67b4b16c5dd 100644 --- a/turbo/app/backup_cmd.go +++ b/turbo/app/backup_cmd.go @@ -77,7 +77,7 @@ CloudDrives (and ssd) have bad-latency and good-parallel-throughput - then havin ) func doBackup(cliCtx *cli.Context) error { - logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/app/import_cmd.go b/turbo/app/import_cmd.go index 1d9eae3e43a..6589b104ce2 100644 --- a/turbo/app/import_cmd.go +++ b/turbo/app/import_cmd.go @@ -60,7 +60,7 @@ func importChain(cliCtx *cli.Context) error { if cliCtx.NArg() < 1 { utils.Fatalf("This command requires an argument.") } - logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/app/init_cmd.go b/turbo/app/init_cmd.go index 363f2825b64..285200be14b 100644 --- a/turbo/app/init_cmd.go +++ b/turbo/app/init_cmd.go @@ -37,7 +37,7 @@ It expects the genesis file as argument.`, func initGenesis(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } // Make sure we have a valid genesis JSON diff --git a/turbo/app/snapshots_cmd.go b/turbo/app/snapshots_cmd.go index d3c01fb9642..66993b65974 100644 --- a/turbo/app/snapshots_cmd.go +++ b/turbo/app/snapshots_cmd.go @@ -61,7 +61,7 @@ var snapshotCommand = cli.Command{ Name: "snapshots", Usage: `Managing snapshots (historical data partitions)`, Before: func(context *cli.Context) error { - _, _, err := debug.Setup(context, true /* rootLogger */) + _, err := debug.Setup(context, true /* rootLogger */) if err != nil { return err } @@ -195,7 +195,7 @@ var ( ) func doIntegrity(cliCtx *cli.Context) error { - logger, _, err := debug.Setup(cliCtx, true /* root logger */) + logger, err := debug.Setup(cliCtx, true /* root logger */) if err != nil { return err } @@ -266,7 +266,7 @@ func doDiff(cliCtx *cli.Context) error { } func doDecompressSpeed(cliCtx *cli.Context) error { - logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } @@ -308,7 +308,7 @@ func doDecompressSpeed(cliCtx *cli.Context) error { func doRam(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } defer logger.Info("Done") @@ -332,7 +332,7 @@ func doRam(cliCtx *cli.Context) error { } func doIndicesCommand(cliCtx *cli.Context) error { - logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } @@ -431,7 +431,7 @@ func openSnaps(ctx context.Context, cfg ethconfig.BlocksFreezing, dirs datadir.D func doUncompress(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } ctx := cliCtx.Context @@ -484,7 +484,7 @@ func doUncompress(cliCtx *cli.Context) error { func doCompress(cliCtx *cli.Context) error { var err error var logger log.Logger - if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } ctx := cliCtx.Context @@ -534,7 +534,7 @@ func doCompress(cliCtx *cli.Context) error { func doRetireCommand(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } defer logger.Info("Done") @@ -683,7 +683,7 @@ func doUploaderCommand(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, _, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } diff --git a/turbo/app/support_cmd.go b/turbo/app/support_cmd.go index 9de80045fa0..7287aff19eb 100644 --- a/turbo/app/support_cmd.go +++ b/turbo/app/support_cmd.go @@ -67,7 +67,7 @@ var supportCommand = cli.Command{ Usage: "Connect Erigon instance to a diagnostics system for support", ArgsUsage: "--diagnostics.addr --ids --metrics.urls ", Before: func(cliCtx *cli.Context) error { - _, _, err := debug.Setup(cliCtx, true /* rootLogger */) + _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/debug/flags.go b/turbo/debug/flags.go index 7ae0a844093..d1fe323eb59 100644 --- a/turbo/debug/flags.go +++ b/turbo/debug/flags.go @@ -182,7 +182,7 @@ func SetupCobra(cmd *cobra.Command, filePrefix string) log.Logger { // Setup initializes profiling and logging based on the CLI flags. // It should be called as early as possible in the program. -func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, *http.ServeMux, error) { +func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, error) { // ensure we've read in config file details before setting up metrics etc. if err := SetFlagsFromConfigFile(ctx); err != nil { log.Warn("failed setting config flags from yaml/toml file", "err", err) @@ -194,13 +194,13 @@ func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, *http.ServeMux, error if traceFile := ctx.String(traceFlag.Name); traceFile != "" { if err := Handler.StartGoTrace(traceFile); err != nil { - return logger, nil, err + return logger, err } } if cpuFile := ctx.String(cpuprofileFlag.Name); cpuFile != "" { if err := Handler.StartCPUProfile(cpuFile); err != nil { - return logger, nil, err + return logger, err } } pprofEnabled := ctx.Bool(pprofFlag.Name) @@ -228,7 +228,7 @@ func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, *http.ServeMux, error } } - return logger, metricsMux, nil + return logger, nil } func StartPProf(address string, metricsMux *http.ServeMux) { From 3f1e653365e62f1683ff0ad16596d2560868c5d5 Mon Sep 17 00:00:00 2001 From: dvovk Date: Fri, 26 Apr 2024 19:06:59 +0100 Subject: [PATCH 06/12] added dummy tests to shutup sonar cloud --- diagnostics/block_body_download_stats.go | 4 ++++ diagnostics/bodies_info.go | 4 ++++ diagnostics/bootnodes.go | 4 ++++ diagnostics/cmd_line.go | 4 ++++ diagnostics/db.go | 4 ++++ diagnostics/flags.go | 4 ++++ diagnostics/header_downloader_stats.go | 4 ++++ diagnostics/headers.go | 4 ++++ diagnostics/logs.go | 4 ++++ diagnostics/mem.go | 4 ++++ diagnostics/nodeinfo.go | 4 ++++ diagnostics/peers.go | 4 ++++ diagnostics/setup_test.go | 25 ++++++++++++++++++++++++ diagnostics/snapshot_sync.go | 4 ++++ diagnostics/version.go | 4 ++++ 15 files changed, 81 insertions(+) create mode 100644 diagnostics/setup_test.go diff --git a/diagnostics/block_body_download_stats.go b/diagnostics/block_body_download_stats.go index 4903e1a8c99..a97c4a6493c 100644 --- a/diagnostics/block_body_download_stats.go +++ b/diagnostics/block_body_download_stats.go @@ -10,6 +10,10 @@ import ( ) func SetupBlockBodyDownload(metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/block_body_download", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") writeBlockBodyDownload(w, r) diff --git a/diagnostics/bodies_info.go b/diagnostics/bodies_info.go index 2a619ecbe46..795d23c38b2 100644 --- a/diagnostics/bodies_info.go +++ b/diagnostics/bodies_info.go @@ -8,6 +8,10 @@ import ( ) func SetupBodiesAccess(metricsMux *http.ServeMux, diag *diaglib.DiagnosticClient) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/bodies", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/bootnodes.go b/diagnostics/bootnodes.go index fba0982881e..00fd24c25ed 100644 --- a/diagnostics/bootnodes.go +++ b/diagnostics/bootnodes.go @@ -8,6 +8,10 @@ import ( ) func SetupBootnodesAccess(metricsMux *http.ServeMux, node *node.ErigonNode) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/bootnodes", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/cmd_line.go b/diagnostics/cmd_line.go index db4d9dcfdf5..a2050ca4397 100644 --- a/diagnostics/cmd_line.go +++ b/diagnostics/cmd_line.go @@ -8,6 +8,10 @@ import ( ) func SetupCmdLineAccess(metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/cmdline", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/db.go b/diagnostics/db.go index 6769b29425e..e0c7a629561 100644 --- a/diagnostics/db.go +++ b/diagnostics/db.go @@ -16,6 +16,10 @@ import ( ) func SetupDbAccess(ctx *cli.Context, metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + var dataDir string if ctx.IsSet("datadir") { dataDir = ctx.String("datadir") diff --git a/diagnostics/flags.go b/diagnostics/flags.go index 9cdf0267031..cbcc11b3228 100644 --- a/diagnostics/flags.go +++ b/diagnostics/flags.go @@ -8,6 +8,10 @@ import ( ) func SetupFlagsAccess(ctx *cli.Context, metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/flags", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/header_downloader_stats.go b/diagnostics/header_downloader_stats.go index a388d6fb4ae..0b9c4b48a76 100644 --- a/diagnostics/header_downloader_stats.go +++ b/diagnostics/header_downloader_stats.go @@ -10,6 +10,10 @@ import ( ) func SetupHeaderDownloadStats(metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/headers_download", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") writeHeaderDownload(w, r) diff --git a/diagnostics/headers.go b/diagnostics/headers.go index 4f63ef8343e..82066609368 100644 --- a/diagnostics/headers.go +++ b/diagnostics/headers.go @@ -8,6 +8,10 @@ import ( ) func SetupHeadersAccess(metricsMux *http.ServeMux, diag *diaglib.DiagnosticClient) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/headers", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/logs.go b/diagnostics/logs.go index 72196aa79a4..66889f8f68f 100644 --- a/diagnostics/logs.go +++ b/diagnostics/logs.go @@ -19,6 +19,10 @@ import ( ) func SetupLogsAccess(ctx *cli.Context, metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + dirPath := ctx.String(logging.LogDirPathFlag.Name) if dirPath == "" { datadir := ctx.String("datadir") diff --git a/diagnostics/mem.go b/diagnostics/mem.go index e1d25e210b7..1ad34adea56 100644 --- a/diagnostics/mem.go +++ b/diagnostics/mem.go @@ -8,6 +8,10 @@ import ( ) func SetupMemAccess(metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/mem", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/nodeinfo.go b/diagnostics/nodeinfo.go index 198aa77d7d2..fc09c170436 100644 --- a/diagnostics/nodeinfo.go +++ b/diagnostics/nodeinfo.go @@ -8,6 +8,10 @@ import ( ) func SetupNodeInfoAccess(metricsMux *http.ServeMux, node *node.ErigonNode) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/nodeinfo", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") writeNodeInfo(w, node) diff --git a/diagnostics/peers.go b/diagnostics/peers.go index e2a59e650c0..8f2d7847396 100644 --- a/diagnostics/peers.go +++ b/diagnostics/peers.go @@ -37,6 +37,10 @@ type PeerResponse struct { } func SetupPeersAccess(ctxclient *cli.Context, metricsMux *http.ServeMux, node *node.ErigonNode, diag *diaglib.DiagnosticClient) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/peers", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/setup_test.go b/diagnostics/setup_test.go new file mode 100644 index 00000000000..dcee3668107 --- /dev/null +++ b/diagnostics/setup_test.go @@ -0,0 +1,25 @@ +package diagnostics_test + +import ( + "testing" + + "github.com/ledgerwatch/erigon/diagnostics" +) + +func TestSetupEndpoints(t *testing.T) { + diagnostics.SetupLogsAccess(nil, nil) + diagnostics.SetupDbAccess(nil, nil) + diagnostics.SetupCmdLineAccess(nil) + diagnostics.SetupFlagsAccess(nil, nil) + diagnostics.SetupVersionAccess(nil) + diagnostics.SetupBlockBodyDownload(nil) + diagnostics.SetupHeaderDownloadStats(nil) + diagnostics.SetupNodeInfoAccess(nil, nil) + diagnostics.SetupPeersAccess(nil, nil, nil, nil) + diagnostics.SetupBootnodesAccess(nil, nil) + diagnostics.SetupStagesAccess(nil, nil) + diagnostics.SetupMemAccess(nil) + diagnostics.SetupHeadersAccess(nil, nil) + diagnostics.SetupBodiesAccess(nil, nil) + +} diff --git a/diagnostics/snapshot_sync.go b/diagnostics/snapshot_sync.go index 4cfa90dbbcf..9100977ab5b 100644 --- a/diagnostics/snapshot_sync.go +++ b/diagnostics/snapshot_sync.go @@ -8,6 +8,10 @@ import ( ) func SetupStagesAccess(metricsMux *http.ServeMux, diag *diaglib.DiagnosticClient) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/snapshot-sync", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") diff --git a/diagnostics/version.go b/diagnostics/version.go index f54bfa73b64..6bf869e835f 100644 --- a/diagnostics/version.go +++ b/diagnostics/version.go @@ -10,6 +10,10 @@ import ( const Version = 3 func SetupVersionAccess(metricsMux *http.ServeMux) { + if metricsMux == nil { + return + } + metricsMux.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") From 7bcca9a8b5e7929581d015a4196b7be8becdb705 Mon Sep 17 00:00:00 2001 From: dvovk Date: Sat, 27 Apr 2024 12:48:14 +0100 Subject: [PATCH 07/12] removed dummy tests --- diagnostics/setup_test.go | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 diagnostics/setup_test.go diff --git a/diagnostics/setup_test.go b/diagnostics/setup_test.go deleted file mode 100644 index dcee3668107..00000000000 --- a/diagnostics/setup_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package diagnostics_test - -import ( - "testing" - - "github.com/ledgerwatch/erigon/diagnostics" -) - -func TestSetupEndpoints(t *testing.T) { - diagnostics.SetupLogsAccess(nil, nil) - diagnostics.SetupDbAccess(nil, nil) - diagnostics.SetupCmdLineAccess(nil) - diagnostics.SetupFlagsAccess(nil, nil) - diagnostics.SetupVersionAccess(nil) - diagnostics.SetupBlockBodyDownload(nil) - diagnostics.SetupHeaderDownloadStats(nil) - diagnostics.SetupNodeInfoAccess(nil, nil) - diagnostics.SetupPeersAccess(nil, nil, nil, nil) - diagnostics.SetupBootnodesAccess(nil, nil) - diagnostics.SetupStagesAccess(nil, nil) - diagnostics.SetupMemAccess(nil) - diagnostics.SetupHeadersAccess(nil, nil) - diagnostics.SetupBodiesAccess(nil, nil) - -} From b8d90bf2647bf2959043ec4a7043ceda5169df34 Mon Sep 17 00:00:00 2001 From: dvovk Date: Sat, 27 Apr 2024 16:50:26 +0100 Subject: [PATCH 08/12] setup diagnostics on the same port as metrics and pprof, added ability to specify address and port for diagnostics through flags --- cmd/caplin/main.go | 2 +- cmd/devnet/devnet/node.go | 6 ++- cmd/erigon/main.go | 6 ++- cmd/silkworm_api/snapshot_idx.go | 2 +- cmd/utils/flags.go | 6 +-- diagnostics/setup.go | 69 +++++++++++++++++++++----------- turbo/app/backup_cmd.go | 2 +- turbo/app/import_cmd.go | 2 +- turbo/app/init_cmd.go | 2 +- turbo/app/snapshots_cmd.go | 22 +++++----- turbo/app/support_cmd.go | 2 +- turbo/debug/flags.go | 55 +++++++++++++++++++++---- 12 files changed, 122 insertions(+), 54 deletions(-) diff --git a/cmd/caplin/main.go b/cmd/caplin/main.go index f37f6939072..0c1fb0cab17 100644 --- a/cmd/caplin/main.go +++ b/cmd/caplin/main.go @@ -55,7 +55,7 @@ func runCaplinNode(cliCtx *cli.Context) error { log.Error("[Phase1] Could not initialize caplin", "err", err) return err } - if _, err := debug.Setup(cliCtx, true /* root logger */); err != nil { + if _, _, err := debug.Setup(cliCtx, true /* root logger */); err != nil { return err } rcfg := beacon_router_configuration.RouterConfiguration{ diff --git a/cmd/devnet/devnet/node.go b/cmd/devnet/devnet/node.go index ab688424b19..55dd5e53ede 100644 --- a/cmd/devnet/devnet/node.go +++ b/cmd/devnet/devnet/node.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "math/big" + "net/http" "sync" "github.com/c2h5oh/datasize" @@ -138,6 +139,7 @@ func (n *devnetNode) EnableMetrics(int) { func (n *devnetNode) run(ctx *cli.Context) error { var logger log.Logger var err error + var metricsMux *http.ServeMux defer n.done() defer func() { @@ -150,7 +152,7 @@ func (n *devnetNode) run(ctx *cli.Context) error { n.Unlock() }() - if logger, err = debug.Setup(ctx, false /* rootLogger */); err != nil { + if logger, metricsMux, err = debug.Setup(ctx, false /* rootLogger */); err != nil { return err } @@ -182,7 +184,7 @@ func (n *devnetNode) run(ctx *cli.Context) error { n.ethNode, err = enode.New(ctx.Context, n.nodeCfg, n.ethCfg, logger) - diagnostics.Setup(ctx, n.ethNode) + diagnostics.Setup(ctx, n.ethNode, metricsMux) n.Lock() if n.startErr != nil { diff --git a/cmd/erigon/main.go b/cmd/erigon/main.go index 3e4d1c1b4ce..7686761ad3b 100644 --- a/cmd/erigon/main.go +++ b/cmd/erigon/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "net/http" "os" "github.com/ledgerwatch/log/v3" @@ -42,8 +43,9 @@ func main() { func runErigon(cliCtx *cli.Context) error { var logger log.Logger var err error + var metricsMux *http.ServeMux - if logger, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, metricsMux, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } @@ -66,7 +68,7 @@ func runErigon(cliCtx *cli.Context) error { return err } - diagnostics.Setup(cliCtx, ethNode) + diagnostics.Setup(cliCtx, ethNode, metricsMux) err = ethNode.Serve() if err != nil { diff --git a/cmd/silkworm_api/snapshot_idx.go b/cmd/silkworm_api/snapshot_idx.go index 0250baba471..fc2bec288c5 100644 --- a/cmd/silkworm_api/snapshot_idx.go +++ b/cmd/silkworm_api/snapshot_idx.go @@ -55,7 +55,7 @@ func FindIf(segments []snaptype.FileInfo, predicate func(snaptype.FileInfo) bool } func buildIndex(cliCtx *cli.Context, dataDir string, snapshotPaths []string, minBlock uint64) error { - logger, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index e9810bfca18..db85567da95 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1001,14 +1001,14 @@ var ( Value: false, } DiagEndpointAddrFlag = cli.StringFlag{ - Name: "diagnostics.addr", + Name: "diagnostics.endpoint.addr", Usage: "Diagnostics HTTP server listening interface", Value: "127.0.0.1", } DiagEndpointPortFlag = cli.UintFlag{ - Name: "diagnostics.port", + Name: "diagnostics.endpoint.port", Usage: "Diagnostics HTTP server listening port", - Value: 6059, + Value: 6060, } ) diff --git a/diagnostics/setup.go b/diagnostics/setup.go index 3cdba408e26..a1963415597 100644 --- a/diagnostics/setup.go +++ b/diagnostics/setup.go @@ -14,46 +14,69 @@ import ( var ( diagnosticsDisabledFlag = "diagnostics.disabled" - diagnosticsAddrFlag = "diagnostics.addr" - diagnosticsPortFlag = "diagnostics.port" + diagnosticsAddrFlag = "diagnostics.endpoint.addr" + diagnosticsPortFlag = "diagnostics.endpoint.port" + metricsHTTPFlag = "metrics.addr" + metricsPortFlag = "metrics.port" ) -func Setup(ctx *cli.Context, node *node.ErigonNode) { +func Setup(ctx *cli.Context, node *node.ErigonNode, metricsMux *http.ServeMux) { if ctx.Bool(diagnosticsDisabledFlag) { return } - diagMux := SetupDiagnosticsEndpoint(ctx) + var diagMux *http.ServeMux + + diagHost := ctx.String(diagnosticsAddrFlag) + diagPort := ctx.Int(diagnosticsPortFlag) + diagAddress := fmt.Sprintf("%s:%d", diagHost, diagPort) + + metricsHost := ctx.String(metricsHTTPFlag) + metricsPort := ctx.Int(metricsPortFlag) + metricsAddress := fmt.Sprintf("%s:%d", metricsHost, metricsPort) + + if diagAddress == metricsAddress { + diagMux = SetupDiagnosticsEndpoint(metricsMux, diagAddress) + } else { + diagMux = SetupDiagnosticsEndpoint(nil, diagAddress) + } + diagnostic := diaglib.NewDiagnosticClient(diagMux, node.Backend().DataDir()) diagnostic.Setup() SetupEndpoints(ctx, node, diagMux, diagnostic) } -func SetupDiagnosticsEndpoint(ctx *cli.Context) *http.ServeMux { - address := ctx.String(diagnosticsAddrFlag) - port := ctx.Uint(diagnosticsPortFlag) - - diagnosticsAddress := fmt.Sprintf("%s:%d", address, port) - +func SetupDiagnosticsEndpoint(metricsMux *http.ServeMux, addres string) *http.ServeMux { diagMux := http.NewServeMux() - diagServer := &http.Server{ - Addr: diagnosticsAddress, - Handler: diagMux, - } + if metricsMux != nil { + metricsMux.HandleFunc("/debug/diag/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/diag") + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/diag") + diagMux.ServeHTTP(w, r) + }) + } else { + middleMux := http.NewServeMux() + + middleMux.HandleFunc("/debug/diag/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/diag") + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/diag") + diagMux.ServeHTTP(w, r) + }) - go func() { - if err := diagServer.ListenAndServe(); err != nil { - log.Error("[Diagnostics] Failure in running diagnostics server", "err", err) + diagServer := &http.Server{ + Addr: addres, + Handler: middleMux, } - }() - diagMux.HandleFunc("/diag/", func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = strings.TrimPrefix(r.URL.Path, "/diag") - r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/diag") - diagMux.ServeHTTP(w, r) - }) + go func() { + if err := diagServer.ListenAndServe(); err != nil { + log.Error("[Diagnostics] Failure in running diagnostics server", "err", err) + } + }() + + } return diagMux } diff --git a/turbo/app/backup_cmd.go b/turbo/app/backup_cmd.go index 67b4b16c5dd..74458c5980c 100644 --- a/turbo/app/backup_cmd.go +++ b/turbo/app/backup_cmd.go @@ -77,7 +77,7 @@ CloudDrives (and ssd) have bad-latency and good-parallel-throughput - then havin ) func doBackup(cliCtx *cli.Context) error { - logger, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/app/import_cmd.go b/turbo/app/import_cmd.go index 6589b104ce2..1d9eae3e43a 100644 --- a/turbo/app/import_cmd.go +++ b/turbo/app/import_cmd.go @@ -60,7 +60,7 @@ func importChain(cliCtx *cli.Context) error { if cliCtx.NArg() < 1 { utils.Fatalf("This command requires an argument.") } - logger, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/app/init_cmd.go b/turbo/app/init_cmd.go index 285200be14b..363f2825b64 100644 --- a/turbo/app/init_cmd.go +++ b/turbo/app/init_cmd.go @@ -37,7 +37,7 @@ It expects the genesis file as argument.`, func initGenesis(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } // Make sure we have a valid genesis JSON diff --git a/turbo/app/snapshots_cmd.go b/turbo/app/snapshots_cmd.go index 66993b65974..032c54ff52f 100644 --- a/turbo/app/snapshots_cmd.go +++ b/turbo/app/snapshots_cmd.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "io" + "net/http" "os" "path/filepath" "runtime" @@ -61,7 +62,7 @@ var snapshotCommand = cli.Command{ Name: "snapshots", Usage: `Managing snapshots (historical data partitions)`, Before: func(context *cli.Context) error { - _, err := debug.Setup(context, true /* rootLogger */) + _, _, err := debug.Setup(context, true /* rootLogger */) if err != nil { return err } @@ -195,7 +196,7 @@ var ( ) func doIntegrity(cliCtx *cli.Context) error { - logger, err := debug.Setup(cliCtx, true /* root logger */) + logger, _, err := debug.Setup(cliCtx, true /* root logger */) if err != nil { return err } @@ -266,7 +267,7 @@ func doDiff(cliCtx *cli.Context) error { } func doDecompressSpeed(cliCtx *cli.Context) error { - logger, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } @@ -308,7 +309,7 @@ func doDecompressSpeed(cliCtx *cli.Context) error { func doRam(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } defer logger.Info("Done") @@ -332,7 +333,7 @@ func doRam(cliCtx *cli.Context) error { } func doIndicesCommand(cliCtx *cli.Context) error { - logger, err := debug.Setup(cliCtx, true /* rootLogger */) + logger, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } @@ -431,7 +432,7 @@ func openSnaps(ctx context.Context, cfg ethconfig.BlocksFreezing, dirs datadir.D func doUncompress(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } ctx := cliCtx.Context @@ -484,7 +485,7 @@ func doUncompress(cliCtx *cli.Context) error { func doCompress(cliCtx *cli.Context) error { var err error var logger log.Logger - if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } ctx := cliCtx.Context @@ -534,7 +535,7 @@ func doCompress(cliCtx *cli.Context) error { func doRetireCommand(cliCtx *cli.Context) error { var logger log.Logger var err error - if logger, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { + if logger, _, err = debug.Setup(cliCtx, true /* rootLogger */); err != nil { return err } defer logger.Info("Done") @@ -682,8 +683,9 @@ func doRetireCommand(cliCtx *cli.Context) error { func doUploaderCommand(cliCtx *cli.Context) error { var logger log.Logger var err error + var metricsMux *http.ServeMux - if logger, err = debug.Setup(cliCtx, true /* root logger */); err != nil { + if logger, metricsMux, err = debug.Setup(cliCtx, true /* root logger */); err != nil { return err } @@ -706,7 +708,7 @@ func doUploaderCommand(cliCtx *cli.Context) error { return err } - diagnostics.Setup(cliCtx, ethNode) + diagnostics.Setup(cliCtx, ethNode, metricsMux) err = ethNode.Serve() if err != nil { diff --git a/turbo/app/support_cmd.go b/turbo/app/support_cmd.go index 7287aff19eb..9de80045fa0 100644 --- a/turbo/app/support_cmd.go +++ b/turbo/app/support_cmd.go @@ -67,7 +67,7 @@ var supportCommand = cli.Command{ Usage: "Connect Erigon instance to a diagnostics system for support", ArgsUsage: "--diagnostics.addr --ids --metrics.urls ", Before: func(cliCtx *cli.Context) error { - _, err := debug.Setup(cliCtx, true /* rootLogger */) + _, _, err := debug.Setup(cliCtx, true /* rootLogger */) if err != nil { return err } diff --git a/turbo/debug/flags.go b/turbo/debug/flags.go index d1fe323eb59..9f38ee80542 100644 --- a/turbo/debug/flags.go +++ b/turbo/debug/flags.go @@ -23,6 +23,7 @@ import ( "net/http/pprof" //nolint:gosec "os" "path/filepath" + "strings" "github.com/ledgerwatch/erigon-lib/common/disk" "github.com/ledgerwatch/erigon-lib/common/mem" @@ -182,7 +183,7 @@ func SetupCobra(cmd *cobra.Command, filePrefix string) log.Logger { // Setup initializes profiling and logging based on the CLI flags. // It should be called as early as possible in the program. -func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, error) { +func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, *http.ServeMux, error) { // ensure we've read in config file details before setting up metrics etc. if err := SetFlagsFromConfigFile(ctx); err != nil { log.Warn("failed setting config flags from yaml/toml file", "err", err) @@ -194,13 +195,13 @@ func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, error) { if traceFile := ctx.String(traceFlag.Name); traceFile != "" { if err := Handler.StartGoTrace(traceFile); err != nil { - return logger, err + return logger, nil, err } } if cpuFile := ctx.String(cpuprofileFlag.Name); cpuFile != "" { if err := Handler.StartCPUProfile(cpuFile); err != nil { - return logger, err + return logger, nil, err } } pprofEnabled := ctx.Bool(pprofFlag.Name) @@ -222,21 +223,59 @@ func Setup(ctx *cli.Context, rootLogger bool) (log.Logger, error) { pprofPort := ctx.Int(pprofPortFlag.Name) address := fmt.Sprintf("%s:%d", pprofHost, pprofPort) if address == metricsAddress { - StartPProf(address, metricsMux) + metricsMux = StartPProf(address, metricsMux) } else { - StartPProf(address, nil) + metricsMux = StartPProf(address, nil) } } - return logger, nil + return logger, metricsMux, nil } -func StartPProf(address string, metricsMux *http.ServeMux) { +func StartPProf(address string, metricsMux *http.ServeMux) *http.ServeMux { cpuMsg := fmt.Sprintf("go tool pprof -lines -http=: http://%s/%s", address, "debug/pprof/profile?seconds=20") heapMsg := fmt.Sprintf("go tool pprof -lines -http=: http://%s/%s", address, "debug/pprof/heap") log.Info("Starting pprof server", "cpu", cpuMsg, "heap", heapMsg) + pprofMux := http.NewServeMux() + + pprofMux.HandleFunc("/", pprof.Index) + pprofMux.HandleFunc("/cmdline", pprof.Cmdline) + pprofMux.HandleFunc("/debug/pprof/profile", pprof.Profile) + pprofMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + pprofMux.HandleFunc("/debug/pprof/trace", pprof.Trace) + if metricsMux == nil { + middleMux := http.NewServeMux() + middleMux.HandleFunc("/debug/pprof/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/pprof") + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/pprof") + pprofMux.ServeHTTP(w, r) + }) + + pprofServer := &http.Server{ + Addr: address, + Handler: middleMux, + } + + go func() { + if err := pprofServer.ListenAndServe(); err != nil { + log.Error("Failure in running pprof server", "err", err) + } + }() + + return middleMux + } else { + metricsMux.HandleFunc("/debug/pprof/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/pprof") + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/pprof") + pprofMux.ServeHTTP(w, r) + }) + + return metricsMux + } + + /*if metricsMux == nil { go func() { if err := http.ListenAndServe(address, nil); err != nil { // nolint:gosec log.Error("Failure in running pprof server", "err", err) @@ -248,7 +287,7 @@ func StartPProf(address string, metricsMux *http.ServeMux) { metricsMux.HandleFunc("/debug/pprof/profile", pprof.Profile) metricsMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) metricsMux.HandleFunc("/debug/pprof/trace", pprof.Trace) - } + }*/ } // Exit stops all running profiles, flushing their output to the From 604d14351e6105fca113ce3bfc7ab6621a059b0f Mon Sep 17 00:00:00 2001 From: dvovk Date: Sat, 27 Apr 2024 16:59:33 +0100 Subject: [PATCH 09/12] remove duplicates --- diagnostics/setup.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/diagnostics/setup.go b/diagnostics/setup.go index a1963415597..8808eb94185 100644 --- a/diagnostics/setup.go +++ b/diagnostics/setup.go @@ -51,19 +51,10 @@ func SetupDiagnosticsEndpoint(metricsMux *http.ServeMux, addres string) *http.Se diagMux := http.NewServeMux() if metricsMux != nil { - metricsMux.HandleFunc("/debug/diag/", func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/diag") - r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/diag") - diagMux.ServeHTTP(w, r) - }) + SetupMiddleMuxHandler(diagMux, metricsMux, "/debug/diag") } else { middleMux := http.NewServeMux() - - middleMux.HandleFunc("/debug/diag/", func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = strings.TrimPrefix(r.URL.Path, "/debug/diag") - r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, "/debug/diag") - diagMux.ServeHTTP(w, r) - }) + SetupMiddleMuxHandler(diagMux, middleMux, "/debug/diag") diagServer := &http.Server{ Addr: addres, @@ -81,6 +72,14 @@ func SetupDiagnosticsEndpoint(metricsMux *http.ServeMux, addres string) *http.Se return diagMux } +func SetupMiddleMuxHandler(mux *http.ServeMux, middleMux *http.ServeMux, path string) { + middleMux.HandleFunc(path+"/", func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.TrimPrefix(r.URL.Path, path) + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, path) + mux.ServeHTTP(w, r) + }) +} + func SetupEndpoints(ctx *cli.Context, node *node.ErigonNode, diagMux *http.ServeMux, diagnostic *diaglib.DiagnosticClient) { SetupLogsAccess(ctx, diagMux) SetupDbAccess(ctx, diagMux) From fe4387fc6141cf8332fd954a277cb8907d5e9832 Mon Sep 17 00:00:00 2001 From: dvovk Date: Sat, 27 Apr 2024 20:44:26 +0100 Subject: [PATCH 10/12] removed commented code --- turbo/debug/flags.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/turbo/debug/flags.go b/turbo/debug/flags.go index 9f38ee80542..e76256120f9 100644 --- a/turbo/debug/flags.go +++ b/turbo/debug/flags.go @@ -274,20 +274,6 @@ func StartPProf(address string, metricsMux *http.ServeMux) *http.ServeMux { return metricsMux } - - /*if metricsMux == nil { - go func() { - if err := http.ListenAndServe(address, nil); err != nil { // nolint:gosec - log.Error("Failure in running pprof server", "err", err) - } - }() - } else { - metricsMux.HandleFunc("/debug/pprof/", pprof.Index) - metricsMux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) - metricsMux.HandleFunc("/debug/pprof/profile", pprof.Profile) - metricsMux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) - metricsMux.HandleFunc("/debug/pprof/trace", pprof.Trace) - }*/ } // Exit stops all running profiles, flushing their output to the From ebb7fa9a5623a1d717fd9aa856b73ad1858b2e66 Mon Sep 17 00:00:00 2001 From: dvovk Date: Mon, 29 Apr 2024 12:53:47 +0100 Subject: [PATCH 11/12] changed metrics,pproff,diagnostics default address to 0.0.0.0 --- cmd/utils/flags.go | 2 +- erigon-lib/common/metrics/metrics_enabled.go | 2 +- turbo/debug/flags.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index db85567da95..f1c2e5b08e1 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -1003,7 +1003,7 @@ var ( DiagEndpointAddrFlag = cli.StringFlag{ Name: "diagnostics.endpoint.addr", Usage: "Diagnostics HTTP server listening interface", - Value: "127.0.0.1", + Value: "0.0.0.0", } DiagEndpointPortFlag = cli.UintFlag{ Name: "diagnostics.endpoint.port", diff --git a/erigon-lib/common/metrics/metrics_enabled.go b/erigon-lib/common/metrics/metrics_enabled.go index dff5154390b..0f3b89bd6d6 100644 --- a/erigon-lib/common/metrics/metrics_enabled.go +++ b/erigon-lib/common/metrics/metrics_enabled.go @@ -28,6 +28,6 @@ type Config struct { //nolint:maligned var DefaultConfig = Config{ Enabled: false, EnabledExpensive: false, - HTTP: "127.0.0.1", + HTTP: "0.0.0.0", Port: 6060, } diff --git a/turbo/debug/flags.go b/turbo/debug/flags.go index e76256120f9..07affd9549e 100644 --- a/turbo/debug/flags.go +++ b/turbo/debug/flags.go @@ -71,7 +71,7 @@ var ( pprofAddrFlag = cli.StringFlag{ Name: "pprof.addr", Usage: "pprof HTTP server listening interface", - Value: "127.0.0.1", + Value: "0.0.0.0", } cpuprofileFlag = cli.StringFlag{ Name: "pprof.cpuprofile", From 94522051f95a8f26ea7c7b5180efebd19beecb04 Mon Sep 17 00:00:00 2001 From: dvovk Date: Mon, 29 Apr 2024 15:04:54 +0100 Subject: [PATCH 12/12] adjusted diagnostics urls --- turbo/app/support_cmd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/turbo/app/support_cmd.go b/turbo/app/support_cmd.go index 9de80045fa0..64e5054bebb 100644 --- a/turbo/app/support_cmd.go +++ b/turbo/app/support_cmd.go @@ -185,7 +185,7 @@ func tunnel(ctx context.Context, cancel context.CancelFunc, sigs chan os.Signal, nodes := map[string]*node{} for _, debugURL := range debugURLs { - debugResponse, err := metricsClient.Get(debugURL + "/debug/nodeinfo") + debugResponse, err := metricsClient.Get(debugURL + "/debug/diag/nodeinfo") if err != nil { return err @@ -326,7 +326,7 @@ func tunnel(ctx context.Context, cancel context.CancelFunc, sigs chan os.Signal, queryString = "?" + nodeRequest.QueryParams.Encode() } - debugURL := node.debugURL + "/debug/" + requests[0].Method + queryString + debugURL := node.debugURL + "/debug/diag/" + requests[0].Method + queryString debugResponse, err := metricsClient.Get(debugURL) if err != nil {