Skip to content

Commit

Permalink
Merge pull request #7 from tendermint/feature/extract-lib
Browse files Browse the repository at this point in the history
[tm-monitor] extract lib to monitor/ dir
  • Loading branch information
melekes committed Mar 16, 2017
2 parents ce69eaa + 31a54b0 commit fb28fd4
Show file tree
Hide file tree
Showing 12 changed files with 111 additions and 84 deletions.
4 changes: 2 additions & 2 deletions tm-monitor/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ VERSION := $(shell perl -ne '/^var version.*"([^"]+)".*$$/ && print "v$$1\n"' ma
GOTOOLS = \
github.com/Masterminds/glide \
github.com/mitchellh/gox
PACKAGES=$(shell go list ./... | grep -v '/vendor/')

tools:
go get -v $(GOTOOLS)
Expand All @@ -17,7 +18,7 @@ install:
go install -ldflags "-X main.version=${VERSION}"

test:
go test
@go test $(PACKAGES)

build-all: tools
gox -verbose \
Expand All @@ -41,7 +42,6 @@ build-docker:
docker build -t "tendermint/monitor" .

clean:
rm -f ./tm-monitor.log
rm -f ./tm-monitor
rm -rf ./dist

Expand Down
14 changes: 12 additions & 2 deletions tm-monitor/glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions tm-monitor/glide.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,8 @@ import:
subpackages:
- client
- package: github.com/tendermint/log15
- package: github.com/go-kit/kit
subpackages:
- log
- term
- package: github.com/pkg/errors
75 changes: 28 additions & 47 deletions tm-monitor/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,29 @@ import (
"os"
"strings"

"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/term"
cmn "github.com/tendermint/go-common"
logger "github.com/tendermint/go-logger"
log15 "github.com/tendermint/log15"
em "github.com/tendermint/tools/tm-monitor/eventmeter"
monitor "github.com/tendermint/tools/tm-monitor/monitor"
)

var version = "0.3.0.pre"

var log = logger.New()
var logger = log.NewNopLogger()

func main() {
var listenAddr string
var verbose, noton bool
var 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(&noton, "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]
tm-monitor [-no-ton] [-listen-addr="tcp://0.0.0.0:46670"] [endpoints]
Examples:
# monitor single instance
Expand All @@ -48,17 +47,28 @@ Examples:
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 {
logToFile("tm-monitor.log", verbose)
ton = NewTon(m)
ton.Start()
} else {
logToStdout(verbose)
}

cmn.TrapSignal(func() {
Expand All @@ -69,50 +79,21 @@ Examples:
})
}

func startMonitor(endpoints string) *Monitor {
m := NewMonitor()
func startMonitor(endpoints string) *monitor.Monitor {
m := monitor.NewMonitor()
m.SetLogger(log.With(logger, "component", "monitor"))

for _, e := range strings.Split(endpoints, ",") {
if err := m.Monitor(NewNode(e)); err != nil {
log.Crit(err.Error())
os.Exit(1)
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 {
log.Crit(err.Error())
os.Exit(1)
panic(err)
}

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(),
))
}
em.Log = log
}

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()),
))
}
em.Log = log
}
18 changes: 16 additions & 2 deletions tm-monitor/monitor.go → tm-monitor/monitor/monitor.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package main
package monitor

import (
"fmt"
"math/rand"
"time"

"github.com/go-kit/kit/log"
"github.com/pkg/errors"
tmtypes "github.com/tendermint/tendermint/types"
)

Expand All @@ -23,6 +26,8 @@ type Monitor struct {

recalculateNetworkUptimeEvery time.Duration
numValidatorsUpdateInterval time.Duration

logger log.Logger
}

// NewMonitor creates new instance of a Monitor. You can provide options to
Expand All @@ -38,6 +43,7 @@ func NewMonitor(options ...func(*Monitor)) *Monitor {
nodeQuit: make(map[string]chan struct{}),
recalculateNetworkUptimeEvery: 10 * time.Second,
numValidatorsUpdateInterval: 5 * time.Second,
logger: log.NewNopLogger(),
}

for _, option := range options {
Expand All @@ -61,6 +67,11 @@ func SetNumValidatorsUpdateInterval(d time.Duration) func(m *Monitor) {
}
}

// SetLogger lets you set your own logger
func (m *Monitor) SetLogger(l log.Logger) {
m.logger = l
}

// Monitor begins to monitor the node `n`. The node will be started and added
// to the monitor.
func (m *Monitor) Monitor(n *Node) error {
Expand Down Expand Up @@ -116,6 +127,8 @@ func (m *Monitor) Stop() {

// main loop where we listen for events from the node
func (m *Monitor) listen(nodeName string, blockCh <-chan tmtypes.Header, blockLatencyCh <-chan float64, disconnectCh <-chan bool, quit <-chan struct{}) {
logger := log.With(m.logger, "node", nodeName)

for {
select {
case <-quit:
Expand All @@ -133,6 +146,7 @@ func (m *Monitor) listen(nodeName string, blockCh <-chan tmtypes.Header, blockLa
m.Network.NodeIsOnline(nodeName)
}
case <-time.After(nodeLivenessTimeout):
logger.Log("event", fmt.Sprintf("node was not responding for %v", nodeLivenessTimeout))
m.Network.NodeIsDown(nodeName)
}
}
Expand Down Expand Up @@ -176,7 +190,7 @@ func (m *Monitor) updateNumValidatorLoop() {
if i == randomNodeIndex {
height, num, err = n.NumValidators()
if err != nil {
log.Debug(err.Error())
m.logger.Log("err", errors.Wrap(err, "update num validators failed"))
}
break
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main_test
package monitor_test

import (
"testing"
Expand All @@ -10,8 +10,8 @@ import (
crypto "github.com/tendermint/go-crypto"
ctypes "github.com/tendermint/tendermint/rpc/core/types"
tmtypes "github.com/tendermint/tendermint/types"
monitor "github.com/tendermint/tools/tm-monitor"
mock "github.com/tendermint/tools/tm-monitor/mock"
monitor "github.com/tendermint/tools/tm-monitor/monitor"
)

func TestMonitorUpdatesNumberOfValidators(t *testing.T) {
Expand Down
4 changes: 1 addition & 3 deletions tm-monitor/network.go → tm-monitor/monitor/network.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package monitor

import (
"sync"
Expand Down Expand Up @@ -74,11 +74,9 @@ func (n *Network) NewBlock(b tmtypes.Header) {
defer n.mu.Unlock()

if n.Height >= uint64(b.Height) {
log.Debug("Received new block with height <= current", "received", b.Height, "current", n.Height)
return
}

log.Debug("Received new block", "height", b.Height, "ntxs", b.NumTxs)
n.Height = uint64(b.Height)

n.blockTimeMeter.Mark(1)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package main_test
package monitor_test

import (
"testing"
"time"

"github.com/stretchr/testify/assert"
tmtypes "github.com/tendermint/tendermint/types"
monitor "github.com/tendermint/tools/tm-monitor"
monitor "github.com/tendermint/tools/tm-monitor/monitor"
)

func TestNetworkNewBlock(t *testing.T) {
Expand Down

0 comments on commit fb28fd4

Please sign in to comment.