diff --git a/internal/cli/bootnode.go b/internal/cli/bootnode.go index 8051046a09..caf183f799 100644 --- a/internal/cli/bootnode.go +++ b/internal/cli/bootnode.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net" + "net/http" "os" "os/signal" "path/filepath" @@ -16,6 +17,8 @@ import ( "github.com/ethereum/go-ethereum/internal/cli/flagset" "github.com/ethereum/go-ethereum/internal/cli/server" "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/prometheus" "github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/nat" @@ -26,14 +29,16 @@ import ( type BootnodeCommand struct { UI cli.Ui - listenAddr string - v5 bool - verbosity int - logLevel string - nat string - nodeKey string - saveKey string - dryRun bool + listenAddr string + enableMetrics bool + prometheusAddr string + v5 bool + verbosity int + logLevel string + nat string + nodeKey string + saveKey string + dryRun bool } // Help implements the cli.Command interface @@ -60,6 +65,18 @@ func (b *BootnodeCommand) Flags() *flagset.Flagset { Usage: "listening address of bootnode (:)", Value: &b.listenAddr, }) + flags.BoolFlag(&flagset.BoolFlag{ + Name: "metrics", + Usage: "Enable metrics collection and reporting", + Value: &b.enableMetrics, + Default: true, + }) + flags.StringFlag(&flagset.StringFlag{ + Name: "prometheus-addr", + Default: "127.0.0.1:7071", + Usage: "listening address of bootnode (:)", + Value: &b.prometheusAddr, + }) flags.BoolFlag(&flagset.BoolFlag{ Name: "v5", Default: false, @@ -237,6 +254,25 @@ func (b *BootnodeCommand) Run(args []string) int { } } + if b.enableMetrics { + prometheusMux := http.NewServeMux() + + prometheusMux.Handle("/debug/metrics/prometheus", prometheus.Handler(metrics.DefaultRegistry)) + + promServer := &http.Server{ + Addr: b.prometheusAddr, + Handler: prometheusMux, + } + + go func() { + if err := promServer.ListenAndServe(); err != nil { + log.Error("Failure in running Prometheus server", "err", err) + } + }() + + log.Info("Enabling metrics export to prometheus", "path", fmt.Sprintf("http://%s/debug/metrics/prometheus", b.prometheusAddr)) + } + signalCh := make(chan os.Signal, 4) signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP)