package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/go-kit/kit/log"
|
|
"github.com/go-kit/kit/log/term"
|
|
cmn "github.com/tendermint/go-common"
|
|
monitor "github.com/tendermint/tools/tm-monitor/monitor"
|
|
)
|
|
|
|
var version = "0.2.1"
|
|
|
|
var logger = log.NewNopLogger()
|
|
|
|
func main() {
|
|
var listenAddr string
|
|
var noton bool
|
|
|
|
flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:46670", "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: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)
|
|
}
|
|
|
|
if noton {
|
|
// Color errors red
|
|
colorFn := func(keyvals ...interface{}) term.FgBgColor {
|
|
for i := 1; i < len(keyvals); i += 2 {
|
|
if _, ok := keyvals[i].(error); ok {
|
|
return term.FgBgColor{Fg: term.White, Bg: term.Red}
|
|
}
|
|
}
|
|
return term.FgBgColor{}
|
|
}
|
|
|
|
logger = term.NewLogger(os.Stdout, log.NewLogfmtLogger, colorFn)
|
|
}
|
|
|
|
m := startMonitor(flag.Arg(0))
|
|
|
|
startRPC(listenAddr, m)
|
|
|
|
var ton *Ton
|
|
if !noton {
|
|
ton = NewTon(m)
|
|
ton.Start()
|
|
}
|
|
|
|
cmn.TrapSignal(func() {
|
|
if !noton {
|
|
ton.Stop()
|
|
}
|
|
m.Stop()
|
|
})
|
|
}
|
|
|
|
func startMonitor(endpoints string) *monitor.Monitor {
|
|
m := monitor.NewMonitor()
|
|
m.SetLogger(log.With(logger, "component", "monitor"))
|
|
|
|
for _, e := range strings.Split(endpoints, ",") {
|
|
n := monitor.NewNode(e)
|
|
n.SetLogger(log.With(logger, "node", e))
|
|
if err := m.Monitor(n); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
if err := m.Start(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
return m
|
|
}
|