- package main
-
- import (
- "flag"
- "fmt"
- "os"
- "strings"
- "time"
-
- "github.com/tendermint/tools/tm-monitor/monitor"
- )
-
- var version = "0.1.0.pre"
-
- func main() {
- var listenAddr string
- var duration, txsRate int
-
- flag.StringVar(&listenAddr, "listen-addr", "tcp://0.0.0.0:46670", "HTTP and Websocket server listen address")
- flag.IntVar(&duration, "T", 10, "Exit after the specified amount of time in seconds")
- flag.IntVar(&txsRate, "r", 1000, "Txs per second to send in a connection")
-
- flag.Usage = func() {
- fmt.Println(`Tendermint bench.
-
- Usage:
- tm-bench [-listen-addr="tcp://0.0.0.0:46670"] [-T 10] [-r 1000] [endpoints]
-
- Examples:
- tm-bench localhost:46657`)
- fmt.Println("Flags:")
- flag.PrintDefaults()
- }
-
- flag.Parse()
-
- if flag.NArg() == 0 {
- flag.Usage()
- os.Exit(1)
- }
-
- fmt.Printf("Running %ds test @ %s\n", duration, flag.Arg(0))
-
- m := startMonitor(flag.Arg(0))
-
- endpoints := strings.Split(flag.Arg(0), ",")
- transacters := make([]*transacter, len(endpoints))
- for i, e := range endpoints {
- t := newTransacter(e, txsRate)
- if err := t.Start(); err != nil {
- panic(err)
- }
- transacters[i] = t
- }
-
- select {
- case <-time.After(time.Duration(duration) * time.Second):
- for _, t := range transacters {
- t.Stop()
- }
- collectAndPrintResults(m)
- m.Stop()
- }
- }
-
- func startMonitor(endpoints string) *monitor.Monitor {
- m := monitor.NewMonitor()
-
- for _, e := range strings.Split(endpoints, ",") {
- if err := m.Monitor(monitor.NewNode(e)); err != nil {
- panic(err)
- }
- }
-
- if err := m.Start(); err != nil {
- panic(err)
- }
-
- return m
- }
-
- func collectAndPrintResults(m *monitor.Monitor) {
- n := m.Network
- fmt.Println("===")
- fmt.Printf("Avg block time: %.3f ms\n", n.AvgBlockTime)
- fmt.Printf("Avg tx throughput: %.0f per sec\n", n.AvgTxThroughput)
- fmt.Printf("Avg block latency: %.3f ms\n", n.AvgBlockLatency)
- fmt.Println("===")
- }
|