package main import ( "flag" "fmt" "os" "strings" cmn "github.com/tendermint/tendermint/libs/common" "github.com/tendermint/tendermint/libs/log" monitor "github.com/tendermint/tendermint/tools/tm-monitor/monitor" ) var logger = log.NewNopLogger() func main() { var listenAddr string var noton bool flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:26670", "HTTP and Websocket server listen address") flag.BoolVar(¬on, "no-ton", false, "Do not show ton (table of nodes)") flag.Usage = func() { fmt.Println(`Tendermint monitor watches over one or more Tendermint core applications, collecting and providing various statistics to the user. Usage: tm-monitor [-no-ton] [-listen-addr="tcp://0.0.0.0:26670"] [endpoints] Examples: # monitor single instance tm-monitor localhost:26657 # monitor a few instances by providing comma-separated list of RPC endpoints tm-monitor host1:26657,host2:26657`) fmt.Println("Flags:") flag.PrintDefaults() } flag.Parse() if flag.NArg() == 0 { flag.Usage() os.Exit(1) } if noton { logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)) } monitor := startMonitor(flag.Arg(0)) listener := startRPC(listenAddr, monitor, logger) var ton *Ton if !noton { ton = NewTon(monitor) ton.Start() } // Stop upon receiving SIGTERM or CTRL-C. cmn.TrapSignal(logger, func() { if !noton { ton.Stop() } monitor.Stop() listener.Close() }) // Run forever. select {} } func startMonitor(endpoints string) *monitor.Monitor { m := monitor.NewMonitor() m.SetLogger(logger.With("component", "monitor")) for _, e := range strings.Split(endpoints, ",") { n := monitor.NewNode(e) n.SetLogger(logger.With("node", e)) if err := m.Monitor(n); err != nil { panic(err) } } if err := m.Start(); err != nil { panic(err) } return m }