github.com/evdatsion/aphelion-dpos-bft@v0.32.1/tools/tm-monitor/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"os"
     7  	"strings"
     8  
     9  	cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common"
    10  	"github.com/evdatsion/aphelion-dpos-bft/libs/log"
    11  	monitor "github.com/evdatsion/aphelion-dpos-bft/tools/tm-monitor/monitor"
    12  )
    13  
    14  var logger = log.NewNopLogger()
    15  
    16  func main() {
    17  	var listenAddr string
    18  	var noton bool
    19  
    20  	flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:26670", "HTTP and Websocket server listen address")
    21  	flag.BoolVar(&noton, "no-ton", false, "Do not show ton (table of nodes)")
    22  
    23  	flag.Usage = func() {
    24  		fmt.Println(`Tendermint monitor watches over one or more Tendermint core
    25  applications, collecting and providing various statistics to the user.
    26  
    27  Usage:
    28  	tm-monitor [-no-ton] [-listen-addr="tcp://0.0.0.0:26670"] [endpoints]
    29  
    30  Examples:
    31  	# monitor single instance
    32  	tm-monitor localhost:26657
    33  
    34  	# monitor a few instances by providing comma-separated list of RPC endpoints
    35  	tm-monitor host1:26657,host2:26657`)
    36  		fmt.Println("Flags:")
    37  		flag.PrintDefaults()
    38  	}
    39  
    40  	flag.Parse()
    41  
    42  	if flag.NArg() == 0 {
    43  		flag.Usage()
    44  		os.Exit(1)
    45  	}
    46  
    47  	if noton {
    48  		logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout))
    49  	}
    50  
    51  	monitor := startMonitor(flag.Arg(0))
    52  
    53  	listener := startRPC(listenAddr, monitor, logger)
    54  
    55  	var ton *Ton
    56  	if !noton {
    57  		ton = NewTon(monitor)
    58  		ton.Start()
    59  	}
    60  
    61  	// Stop upon receiving SIGTERM or CTRL-C.
    62  	cmn.TrapSignal(logger, func() {
    63  		if !noton {
    64  			ton.Stop()
    65  		}
    66  		monitor.Stop()
    67  		listener.Close()
    68  	})
    69  
    70  	// Run forever.
    71  	select {}
    72  }
    73  
    74  func startMonitor(endpoints string) *monitor.Monitor {
    75  	m := monitor.NewMonitor()
    76  	m.SetLogger(logger.With("component", "monitor"))
    77  
    78  	for _, e := range strings.Split(endpoints, ",") {
    79  		n := monitor.NewNode(e)
    80  		n.SetLogger(logger.With("node", e))
    81  		if err := m.Monitor(n); err != nil {
    82  			panic(err)
    83  		}
    84  	}
    85  
    86  	if err := m.Start(); err != nil {
    87  		panic(err)
    88  	}
    89  
    90  	return m
    91  }