package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
cmn "github.com/tendermint/go-common"
|
|
logger "github.com/tendermint/go-logger"
|
|
log15 "github.com/tendermint/log15"
|
|
)
|
|
|
|
var version = "0.2.0"
|
|
|
|
var log = logger.New()
|
|
|
|
func main() {
|
|
var listenAddr string
|
|
var verbose, noton bool
|
|
|
|
flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:46670", "HTTP and Websocket server listen address")
|
|
flag.BoolVar(&verbose, "v", false, "verbose logging")
|
|
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 [-v] [-no-ton] [-listen-addr="tcp://0.0.0.0:46670"] [endpoints]
|
|
|
|
Examples:
|
|
# monitor single instance
|
|
tm-monitor localhost:46657
|
|
|
|
# monitor a few instances by providing comma-separated list of RPC endpoints
|
|
tm-monitor host1:46657,host2:46657`)
|
|
fmt.Println("Flags:")
|
|
flag.PrintDefaults()
|
|
}
|
|
|
|
flag.Parse()
|
|
|
|
if flag.NArg() == 0 {
|
|
flag.Usage()
|
|
os.Exit(1)
|
|
}
|
|
|
|
m := startMonitor(flag.Arg(0))
|
|
|
|
startRPC(listenAddr, m)
|
|
|
|
var ton *Ton
|
|
if !noton {
|
|
logToFile("tm-monitor.log", verbose)
|
|
ton = NewTon(m)
|
|
ton.Start()
|
|
} else {
|
|
logToStdout(verbose)
|
|
}
|
|
|
|
cmn.TrapSignal(func() {
|
|
if !noton {
|
|
ton.Stop()
|
|
}
|
|
m.Stop()
|
|
})
|
|
}
|
|
|
|
func startMonitor(endpoints string) *Monitor {
|
|
m := NewMonitor()
|
|
|
|
for _, e := range strings.Split(endpoints, ",") {
|
|
if err := m.Monitor(NewNode(e)); err != nil {
|
|
log.Crit(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
if err := m.Start(); err != nil {
|
|
log.Crit(err.Error())
|
|
os.Exit(1)
|
|
}
|
|
|
|
return m
|
|
}
|
|
|
|
func logToStdout(verbose bool) {
|
|
if verbose {
|
|
log.SetHandler(logger.LvlFilterHandler(
|
|
logger.LvlDebug,
|
|
logger.BypassHandler(),
|
|
))
|
|
} else {
|
|
log.SetHandler(logger.LvlFilterHandler(
|
|
logger.LvlInfo,
|
|
logger.BypassHandler(),
|
|
))
|
|
}
|
|
}
|
|
|
|
func logToFile(filename string, verbose bool) {
|
|
if verbose {
|
|
log.SetHandler(logger.LvlFilterHandler(
|
|
logger.LvlDebug,
|
|
log15.Must.FileHandler(filename, log15.LogfmtFormat()),
|
|
))
|
|
} else {
|
|
log.SetHandler(logger.LvlFilterHandler(
|
|
logger.LvlInfo,
|
|
log15.Must.FileHandler(filename, log15.LogfmtFormat()),
|
|
))
|
|
}
|
|
}
|