From 73ced040a30e9e3e2a459d3f8c1458306f4f8064 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 28 Jul 2017 18:13:39 -0400 Subject: [PATCH 01/23] [tm-bench] updated deps --- tm-bench/glide.lock | 117 +++++++++++++++++------------------------ tm-bench/main.go | 7 +-- tm-bench/transacter.go | 12 ++--- 3 files changed, 58 insertions(+), 78 deletions(-) diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index bb3b5a034..8ad7ac42a 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,59 +1,39 @@ hash: 795aa94747f3d877df3ea1ec134e9a34e1c46713dd6eb59b6fdd6a33cb698234 -updated: 2017-04-20T19:19:22.26004087-04:00 +updated: 2017-07-28T22:01:53.225543833Z imports: - name: github.com/btcsuite/btcd - version: 583684b21bfbde9b5fc4403916fd7c807feb0289 + version: 47885ab8702485be6b6f87a03d4f3be0bc5c982c subpackages: - btcec -- name: github.com/BurntSushi/toml - version: 99064174e013895bbd9b025c31100bd1d9b590ca - name: github.com/go-kit/kit - version: b6f30a2e0632f5722fb26d8765d726335b79d3e6 + version: 19463ea8b215413a29c3513aa3a76181f4bac58d subpackages: - log + - log/level - log/term - term - name: github.com/go-logfmt/logfmt version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 - name: github.com/go-stack/stack - version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82 + version: 817915b46b97fd7bb80e8ab6b69f01a53ac3eebf - name: github.com/golang/protobuf - version: 69b215d01a5606c843240eab4937eab3acee6530 + version: 748d386b5c1ea99658fd69fe9f03991ce86a90c1 subpackages: - proto -- name: github.com/golang/snappy - version: 553a641470496b2327abcac10b36396bd98e45c9 + - ptypes + - ptypes/any + - ptypes/duration + - ptypes/timestamp - name: github.com/gorilla/websocket - version: 3ab3a8b8831546bd18fd182c20687ca853b2bb13 -- name: github.com/jmhodges/levigo - version: c42d9e0ca023e2198120196f842701bb4c55d7b9 + version: a69d9f6de432e2c6b296a947d8a5ee88f68522cf - name: github.com/kr/logfmt version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 -- name: github.com/mattn/go-colorable - version: d898aa9fb31c91f35dd28ca75db377eff023c076 -- name: github.com/mattn/go-isatty - version: dda3de49cbfcec471bd7a70e6cc01fcc3ff90109 - name: github.com/pkg/errors - version: bfd5150e4e41705ded2129ec33379de1cb90b513 + version: c605e284fe17294bda444b34710735b29d1a9d90 - name: github.com/rcrowley/go-metrics version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c -- name: github.com/syndtr/goleveldb - version: 3c5717caf1475fd25964109a0fc640bd150fce43 - subpackages: - - leveldb - - leveldb/cache - - leveldb/comparer - - leveldb/errors - - leveldb/filter - - leveldb/iterator - - leveldb/journal - - leveldb/memdb - - leveldb/opt - - leveldb/storage - - leveldb/table - - leveldb/util - name: github.com/tendermint/abci - version: 56e13d87f4e3ec1ea756957d6b23caa6ebcf0998 + version: 864d1f80b36b440bde030a5c18d8ac3aa8c2949d subpackages: - types - name: github.com/tendermint/ed25519 @@ -61,53 +41,42 @@ imports: subpackages: - edwards25519 - extra25519 -- name: github.com/tendermint/go-common - version: f9e3db037330c8a8d61d3966de8473eaf01154fa -- name: github.com/tendermint/go-config - version: 620dcbbd7d587cf3599dedbf329b64311b0c307a - name: github.com/tendermint/go-crypto - version: 0ca2c6fdb0706001ca4c4b9b80c9f428e8cf39da -- name: github.com/tendermint/go-data - version: e7fcc6d081ec8518912fcdc103188275f83a3ee5 -- name: github.com/tendermint/go-db - version: 9643f60bc2578693844aacf380a7c32e4c029fee -- name: github.com/tendermint/go-events - version: fddee66d90305fccb6f6d84d16c34fa65ea5b7f6 -- name: github.com/tendermint/go-flowrate - version: a20c98e61957faa93b4014fbd902f20ab9317a6a - subpackages: - - flowrate -- name: github.com/tendermint/go-logger - version: cefb3a45c0bf3c493a04e9bcd9b1540528be59f2 -- name: github.com/tendermint/go-merkle - version: 714d4d04557fd068a7c2a1748241ce8428015a96 -- name: github.com/tendermint/go-p2p - version: 17124989a93774833df33107fbf17157a7f8ef31 - subpackages: - - upnp + version: 95b7c9e09c49b91bfbb71bb63dd514eb55450f16 - name: github.com/tendermint/go-rpc - version: 1a42f946dc6bcd88f9f58c7f2fb86f785584d793 + version: 15d5b2ac497da95cd2dceb9c087910ccec4dacb2 subpackages: - client - types - name: github.com/tendermint/go-wire - version: 2f3b7aafe21c80b19b6ee3210ecb3e3d07c7a471 -- name: github.com/tendermint/log15 - version: ae0f3d6450da9eac7074b439c8e1c3cabf0d5ce6 + version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - - term + - data - name: github.com/tendermint/tendermint - version: 083fe959e25421fca3d41298d9111167a3b47122 + version: b467515719e686e4678e6da4e102f32a491b85a0 subpackages: + - config + - p2p + - p2p/upnp - rpc/core/types + - rpc/lib/client + - rpc/lib/types - types +- name: github.com/tendermint/tmlibs + version: 2f6f3e6aa70bb19b70a6e73210273fa127041070 + subpackages: + - common + - events + - flowrate + - log + - merkle - name: github.com/tendermint/tools - version: 12ce526668e384100afd32686ec7db3749423d51 + version: f427590622211c845626493e2adfb09e12c15e61 subpackages: - tm-monitor/eventmeter - tm-monitor/monitor - name: golang.org/x/crypto - version: 453249f01cfeb54c3d549ddb75ff152ca243f9d8 + version: 558b6879de74bc843225cde5686419267ff707ca subpackages: - curve25519 - nacl/box @@ -118,7 +87,7 @@ imports: - ripemd160 - salsa20/salsa - name: golang.org/x/net - version: 906cda9512f77671ab44f8c8563b13a8e707b230 + version: f5079bd7f6f74e23c4d65efa0f4ce14cbd6a3c0f subpackages: - context - http2 @@ -127,21 +96,31 @@ imports: - internal/timeseries - lex/httplex - trace -- name: golang.org/x/sys - version: 76cc09b634294339fa19ec41b5f2a0b3932cea8b +- name: golang.org/x/text + version: 836efe42bb4aa16aaa17b9c155d8813d336ed720 + subpackages: + - secure/bidirule + - transform + - unicode/bidi + - unicode/norm +- name: google.golang.org/genproto + version: b0a3dcfcd1a9bd48e63634bd8802960804cf8315 subpackages: - - unix + - googleapis/rpc/status - name: google.golang.org/grpc - version: 8b2e129857480cb0f07ef7d9d10b8b252c7ac984 + version: 971efedc2078cb1efd8111d12432813084bc628d subpackages: - codes - credentials + - grpclb/grpc_lb_v1 - grpclog - internal + - keepalive - metadata - naming - peer - stats + - status - tap - transport testImports: [] diff --git a/tm-bench/main.go b/tm-bench/main.go index b2b3e2daa..686a6e13f 100644 --- a/tm-bench/main.go +++ b/tm-bench/main.go @@ -8,10 +8,11 @@ import ( "text/tabwriter" "time" - "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/term" metrics "github.com/rcrowley/go-metrics" + tmtypes "github.com/tendermint/tendermint/types" + "github.com/tendermint/tmlibs/log" "github.com/tendermint/tools/tm-monitor/monitor" ) @@ -63,7 +64,7 @@ Examples: } return term.FgBgColor{} } - logger = term.NewLogger(os.Stdout, log.NewLogfmtLogger, colorFn) + logger = log.NewTMLoggerWithColorFn(log.NewSyncWriter(os.Stdout), colorFn) } fmt.Printf("Running %ds test @ %s\n", duration, flag.Arg(0)) @@ -123,7 +124,7 @@ func startNodes(endpoints []string, blockCh chan<- tmtypes.Header, blockLatencyC for i, e := range endpoints { n := monitor.NewNode(e) - n.SetLogger(log.With(logger, "node", e)) + n.SetLogger(logger.With("node", e)) n.SendBlocksTo(blockCh) n.SendBlockLatenciesTo(blockLatencyCh) if err := n.Start(); err != nil { diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 4a9161f4c..4720bf2e0 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -11,11 +11,11 @@ import ( "sync" "time" - "github.com/go-kit/kit/log" "github.com/gorilla/websocket" "github.com/pkg/errors" rpctypes "github.com/tendermint/go-rpc/types" + "github.com/tendermint/tmlibs/log" ) const ( @@ -91,7 +91,7 @@ func (t *transacter) receiveLoop(connIndex int) { _, _, err := c.ReadMessage() if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseNormalClosure) { - t.logger.Log("err", errors.Wrap(err, "failed to read response")) + t.logger.Error("failed to read response", "err", err) } return } @@ -104,7 +104,7 @@ func (t *transacter) receiveLoop(connIndex int) { // sendLoop generates transactions at a given rate. func (t *transacter) sendLoop(connIndex int) { c := t.conns[connIndex] - logger := log.With(t.logger, "addr", c.RemoteAddr()) + logger := t.logger.With("addr", c.RemoteAddr()) var txNumber = 0 @@ -142,12 +142,12 @@ func (t *transacter) sendLoop(connIndex int) { timeToSend := time.Now().Sub(startTime) time.Sleep(time.Second - timeToSend) - logger.Log("event", fmt.Sprintf("sent %d transactions", t.Rate), "took", timeToSend) + logger.Info(fmt.Sprintf("sent %d transactions", t.Rate), "took", timeToSend) case <-pingsTicker.C: // Right now go-rpc server closes the connection in the absence of pings c.SetWriteDeadline(time.Now().Add(sendTimeout)) if err := c.WriteMessage(websocket.PingMessage, []byte{}); err != nil { - logger.Log("err", errors.Wrap(err, "failed to write ping message")) + logger.Error("failed to write ping message", "err", err) } } @@ -157,7 +157,7 @@ func (t *transacter) sendLoop(connIndex int) { c.SetWriteDeadline(time.Now().Add(sendTimeout)) err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")) if err != nil { - logger.Log("err", errors.Wrap(err, "failed to write close message")) + logger.Error("failed to write close message", "err", err) } return From 7ab861358a7a80093ec17bece369c424a3f48282 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Sat, 29 Jul 2017 12:54:28 -0400 Subject: [PATCH 02/23] [tm-bench] update alpine version --- .gitignore | 1 + tm-bench/Dockerfile | 2 +- tm-bench/glide.yaml | 16 +++++++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 07fc221db..71e4bd648 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ */vendor +*/.glide diff --git a/tm-bench/Dockerfile b/tm-bench/Dockerfile index 6e08e6543..a663338d0 100644 --- a/tm-bench/Dockerfile +++ b/tm-bench/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.5 +FROM alpine:3.6 WORKDIR /app COPY tm-bench /app/tm-bench diff --git a/tm-bench/glide.yaml b/tm-bench/glide.yaml index 0a7584cce..37d128bd0 100644 --- a/tm-bench/glide.yaml +++ b/tm-bench/glide.yaml @@ -1,16 +1,22 @@ package: github.com/tendermint/tools/tm-bench import: +- package: github.com/go-kit/kit + subpackages: + - log/term +- package: github.com/gorilla/websocket - package: github.com/pkg/errors +- package: github.com/rcrowley/go-metrics - package: github.com/tendermint/go-rpc version: develop subpackages: - - client - types +- package: github.com/tendermint/tendermint + subpackages: + - types +- package: github.com/tendermint/tmlibs + subpackages: + - log - package: github.com/tendermint/tools version: develop subpackages: - tm-monitor/monitor -- package: github.com/go-kit/kit - subpackages: - - log - - term From 9f65485b626312d7ce2d4adf6552045ba4352dfb Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Sat, 29 Jul 2017 13:50:09 -0400 Subject: [PATCH 03/23] [tm-monitor] update docker alpine version --- tm-monitor/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tm-monitor/Dockerfile b/tm-monitor/Dockerfile index 543b6e9ea..7edfaca66 100644 --- a/tm-monitor/Dockerfile +++ b/tm-monitor/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.5 +FROM alpine:3.6 WORKDIR /app COPY tm-monitor /app/tm-monitor From 9181822f653020ee3efedf154c6632f2df630474 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Sat, 29 Jul 2017 13:50:33 -0400 Subject: [PATCH 04/23] [tm-monitor] update deps --- tm-monitor/eventmeter/eventmeter.go | 2 +- tm-monitor/glide.lock | 12 ++++++------ tm-monitor/glide.yaml | 5 ++--- tm-monitor/mock/mock.go | 11 +++++------ tm-monitor/monitor/monitor_test.go | 6 +++--- tm-monitor/monitor/node.go | 2 +- tm-monitor/monitor/node_test.go | 8 ++++---- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/tm-monitor/eventmeter/eventmeter.go b/tm-monitor/eventmeter/eventmeter.go index 9e49cee75..3979d07b3 100644 --- a/tm-monitor/eventmeter/eventmeter.go +++ b/tm-monitor/eventmeter/eventmeter.go @@ -22,7 +22,7 @@ import ( // Meter for a particular event // Closure to enable side effects from receiving an event -type EventCallbackFunc func(em *EventMetric, data events.EventData) +type EventCallbackFunc func(em *EventMetric, data interface{}) // Metrics for a given event type EventMetric struct { diff --git a/tm-monitor/glide.lock b/tm-monitor/glide.lock index 2acd9cd19..33b827d25 100644 --- a/tm-monitor/glide.lock +++ b/tm-monitor/glide.lock @@ -1,5 +1,5 @@ -hash: 80c204190057df1e74d32ecd7095e8a1a865c3a06671f1a31d5240e1e3ff2c64 -updated: 2017-05-20T17:49:23.646798165-04:00 +hash: 30b649bc544a4ebd2b2a6188ce314cb72e6c28be8f3e57ec22e7cb83fd974814 +updated: 2017-07-29T18:47:33.199177142Z imports: - name: github.com/btcsuite/btcd version: 583684b21bfbde9b5fc4403916fd7c807feb0289 @@ -24,7 +24,7 @@ imports: - name: github.com/kr/logfmt version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 - name: github.com/pkg/errors - version: bfd5150e4e41705ded2129ec33379de1cb90b513 + version: 645ef00459ed84a119197bfb8d8205042c6df63d - name: github.com/rcrowley/go-metrics version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c - name: github.com/tendermint/abci @@ -39,13 +39,13 @@ imports: - edwards25519 - extra25519 - name: github.com/tendermint/go-crypto - version: 7dff40942a64cdeefefa9446b2d104750b349f8a + version: 95b7c9e09c49b91bfbb71bb63dd514eb55450f16 - name: github.com/tendermint/go-wire version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - data - name: github.com/tendermint/tendermint - version: 267f134d44e76efb2adef5f0c993da8a5d5bd1b8 + version: e9b7221292afe25ce956ea85ab83bb5708eb2992 subpackages: - config - p2p @@ -56,7 +56,7 @@ imports: - rpc/lib/types - types - name: github.com/tendermint/tmlibs - version: 306795ae1d8e4f4a10dcc8bdb32a00455843c9d5 + version: 2f6f3e6aa70bb19b70a6e73210273fa127041070 subpackages: - common - events diff --git a/tm-monitor/glide.yaml b/tm-monitor/glide.yaml index 53637fb44..e68ff6970 100644 --- a/tm-monitor/glide.yaml +++ b/tm-monitor/glide.yaml @@ -1,8 +1,5 @@ package: github.com/tendermint/tools/tm-monitor import: -- package: github.com/go-kit/kit - subpackages: - - log - package: github.com/gorilla/websocket - package: github.com/pkg/errors - package: github.com/rcrowley/go-metrics @@ -15,7 +12,9 @@ import: - rpc/lib/server - types - package: github.com/tendermint/tmlibs + version: develop subpackages: + - common - events - log testImport: diff --git a/tm-monitor/mock/mock.go b/tm-monitor/mock/mock.go index b614e5953..949afe992 100644 --- a/tm-monitor/mock/mock.go +++ b/tm-monitor/mock/mock.go @@ -1,11 +1,10 @@ package mock import ( - "log" + stdlog "log" "reflect" - gokitlog "github.com/go-kit/kit/log" - ctypes "github.com/tendermint/tendermint/rpc/core/types" + "github.com/tendermint/tmlibs/log" em "github.com/tendermint/tools/tm-monitor/eventmeter" ) @@ -17,7 +16,7 @@ type EventMeter struct { func (e *EventMeter) Start() error { return nil } func (e *EventMeter) Stop() {} -func (e *EventMeter) SetLogger(l gokitlog.Logger) {} +func (e *EventMeter) SetLogger(l log.Logger) {} func (e *EventMeter) RegisterLatencyCallback(cb em.LatencyCallbackFunc) { e.latencyCallback = cb } func (e *EventMeter) RegisterDisconnectCallback(cb em.DisconnectCallbackFunc) { e.disconnectCallback = cb @@ -43,13 +42,13 @@ func (e *EventMeter) Call(callback string, args ...interface{}) { } type RpcClient struct { - Stubs map[string]ctypes.TMResult + Stubs map[string]interface{} } func (c *RpcClient) Call(method string, params map[string]interface{}, result interface{}) (interface{}, error) { s, ok := c.Stubs[method] if !ok { - log.Fatalf("Call to %s, but no stub is defined for it", method) + stdlog.Fatalf("Call to %s, but no stub is defined for it", method) } rv, rt := reflect.ValueOf(result), reflect.TypeOf(result) diff --git a/tm-monitor/monitor/monitor_test.go b/tm-monitor/monitor/monitor_test.go index 1a4dd7114..d12d81e3f 100644 --- a/tm-monitor/monitor/monitor_test.go +++ b/tm-monitor/monitor/monitor_test.go @@ -61,10 +61,10 @@ func startMonitor(t *testing.T) *monitor.Monitor { func createValidatorNode(t *testing.T) (n *monitor.Node, emMock *mock.EventMeter) { emMock = &mock.EventMeter{} - stubs := make(map[string]ctypes.TMResult) + stubs := make(map[string]interface{}) pubKey := crypto.GenPrivKeyEd25519().PubKey() - stubs["validators"] = &ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} - stubs["status"] = &ctypes.ResultStatus{PubKey: pubKey} + stubs["validators"] = ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} + stubs["status"] = ctypes.ResultStatus{PubKey: pubKey} rpcClientMock := &mock.RpcClient{stubs} n = monitor.NewNodeWithEventMeterAndRpcClient("tcp://127.0.0.1:46657", emMock, rpcClientMock) diff --git a/tm-monitor/monitor/node.go b/tm-monitor/monitor/node.go index 32af6aadd..2c2352a77 100644 --- a/tm-monitor/monitor/node.go +++ b/tm-monitor/monitor/node.go @@ -125,7 +125,7 @@ func (n *Node) Stop() { // implements eventmeter.EventCallbackFunc func newBlockCallback(n *Node) em.EventCallbackFunc { - return func(metric *em.EventMetric, data events.EventData) { + return func(metric *em.EventMetric, data interface{}) { block := data.(tmtypes.TMEventData).Unwrap().(tmtypes.EventDataNewBlockHeader).Header n.Height = uint64(block.Height) diff --git a/tm-monitor/monitor/node_test.go b/tm-monitor/monitor/node_test.go index a379701c0..b8691a785 100644 --- a/tm-monitor/monitor/node_test.go +++ b/tm-monitor/monitor/node_test.go @@ -37,7 +37,7 @@ func TestNodeNewBlockReceived(t *testing.T) { n.SendBlocksTo(blockCh) blockHeader := &tmtypes.Header{Height: 5} - emMock.Call("eventCallback", &em.EventMetric{}, tmtypes.EventDataNewBlockHeader{blockHeader}) + emMock.Call("eventCallback", &em.EventMetric{}, tmtypes.TMEventData{tmtypes.EventDataNewBlockHeader{blockHeader}}) assert.Equal(uint64(5), n.Height) assert.Equal(*blockHeader, <-blockCh) @@ -89,10 +89,10 @@ func TestNumValidators(t *testing.T) { func startValidatorNode(t *testing.T) (n *monitor.Node, emMock *mock.EventMeter) { emMock = &mock.EventMeter{} - stubs := make(map[string]ctypes.TMResult) + stubs := make(map[string]interface{}) pubKey := crypto.GenPrivKeyEd25519().PubKey() - stubs["validators"] = &ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} - stubs["status"] = &ctypes.ResultStatus{PubKey: pubKey} + stubs["validators"] = ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} + stubs["status"] = ctypes.ResultStatus{PubKey: pubKey} rpcClientMock := &mock.RpcClient{stubs} n = monitor.NewNodeWithEventMeterAndRpcClient("tcp://127.0.0.1:46657", emMock, rpcClientMock) From fa3864c226bf849bbd1196c88b461aa2dcb8b0a8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Sat, 29 Jul 2017 14:52:55 -0400 Subject: [PATCH 05/23] [tm-bench] update deps --- tm-bench/glide.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index 8ad7ac42a..fbc00868b 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,5 +1,5 @@ -hash: 795aa94747f3d877df3ea1ec134e9a34e1c46713dd6eb59b6fdd6a33cb698234 -updated: 2017-07-28T22:01:53.225543833Z +hash: b963733b341869e0667dde0c93f9be17fdf002ab4e92ae8778562a2b94580de8 +updated: 2017-07-29T18:52:35.221739544Z imports: - name: github.com/btcsuite/btcd version: 47885ab8702485be6b6f87a03d4f3be0bc5c982c @@ -11,7 +11,6 @@ imports: - log - log/level - log/term - - term - name: github.com/go-logfmt/logfmt version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 - name: github.com/go-stack/stack @@ -35,6 +34,8 @@ imports: - name: github.com/tendermint/abci version: 864d1f80b36b440bde030a5c18d8ac3aa8c2949d subpackages: + - client + - example/dummy - types - name: github.com/tendermint/ed25519 version: 1f52c6f8b8a5c7908aff4497c186af344b428925 @@ -46,7 +47,6 @@ imports: - name: github.com/tendermint/go-rpc version: 15d5b2ac497da95cd2dceb9c087910ccec4dacb2 subpackages: - - client - types - name: github.com/tendermint/go-wire version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb @@ -63,7 +63,7 @@ imports: - rpc/lib/types - types - name: github.com/tendermint/tmlibs - version: 2f6f3e6aa70bb19b70a6e73210273fa127041070 + version: 7ce4da1eee6004d627e780c8fe91e96d9b99e459 subpackages: - common - events @@ -71,7 +71,7 @@ imports: - log - merkle - name: github.com/tendermint/tools - version: f427590622211c845626493e2adfb09e12c15e61 + version: d205ae1f98c946b2a057f62bfcd505b40ea52031 subpackages: - tm-monitor/eventmeter - tm-monitor/monitor From 34fe5274e08af6086b58414872584ecbabf334e7 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 11 Jul 2017 16:22:21 +0300 Subject: [PATCH 06/23] take into account status codes by leveraging `--fail` curl option (Refs #37) --- mintnet-kubernetes/app.template.yaml | 4 ++-- mintnet-kubernetes/examples/basecoin/app.yaml | 8 ++++---- mintnet-kubernetes/examples/counter/app.yaml | 4 ++-- mintnet-kubernetes/examples/dummy/app.yaml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mintnet-kubernetes/app.template.yaml b/mintnet-kubernetes/app.template.yaml index 781767100..b55fb67e3 100644 --- a/mintnet-kubernetes/app.template.yaml +++ b/mintnet-kubernetes/app.template.yaml @@ -129,11 +129,11 @@ spec: # wait until validator generates priv/pub key pair set +e - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? while [ "$ERR" != 0 ]; do sleep 5 - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? done set -e diff --git a/mintnet-kubernetes/examples/basecoin/app.yaml b/mintnet-kubernetes/examples/basecoin/app.yaml index fe667a8e4..1e35c4e27 100644 --- a/mintnet-kubernetes/examples/basecoin/app.yaml +++ b/mintnet-kubernetes/examples/basecoin/app.yaml @@ -188,11 +188,11 @@ spec: # wait until validator generates priv/pub key pair set +e - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? while [ "$ERR" != 0 ]; do sleep 5 - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? done set -e @@ -247,11 +247,11 @@ spec: # wait until pod starts to serve its pub_key set +e - curl -s "http://$pod.$fqdn_suffix/app_pub_key.json" > /dev/null + curl -s --fail "http://$pod.$fqdn_suffix/app_pub_key.json" > /dev/null ERR=$? while [ "$ERR" != 0 ]; do sleep 5 - curl -s "http://$pod.$fqdn_suffix/app_pub_key.json" > /dev/null + curl -s --fail "http://$pod.$fqdn_suffix/app_pub_key.json" > /dev/null ERR=$? done set -e diff --git a/mintnet-kubernetes/examples/counter/app.yaml b/mintnet-kubernetes/examples/counter/app.yaml index 0a92631ab..2e1bdc6d3 100644 --- a/mintnet-kubernetes/examples/counter/app.yaml +++ b/mintnet-kubernetes/examples/counter/app.yaml @@ -121,11 +121,11 @@ spec: # wait until validator generates priv/pub key pair set +e - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? while [ "$ERR" != 0 ]; do sleep 5 - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? done set -e diff --git a/mintnet-kubernetes/examples/dummy/app.yaml b/mintnet-kubernetes/examples/dummy/app.yaml index 27ecdc0a1..d03be8ed5 100644 --- a/mintnet-kubernetes/examples/dummy/app.yaml +++ b/mintnet-kubernetes/examples/dummy/app.yaml @@ -121,11 +121,11 @@ spec: # wait until validator generates priv/pub key pair set +e - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? while [ "$ERR" != 0 ]; do sleep 5 - curl -s "http://$v.$fqdn_suffix/pub_key.json" > /dev/null + curl -s --fail "http://$v.$fqdn_suffix/pub_key.json" > /dev/null ERR=$? done set -e From d294200176f1f524a46a883b4f91940d60ecc693 Mon Sep 17 00:00:00 2001 From: Zach Date: Sat, 29 Jul 2017 22:11:43 -0400 Subject: [PATCH 07/23] Create README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..61d3486c8 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# tools +Tools for working with tendermint and associated technologies From af04238bb9015e971e3c7d536b778e46eff31eef Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 31 Jul 2017 14:01:09 -0400 Subject: [PATCH 08/23] [tm-monitor] rename var --- tm-monitor/eventmeter/eventmeter.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tm-monitor/eventmeter/eventmeter.go b/tm-monitor/eventmeter/eventmeter.go index 3979d07b3..127423836 100644 --- a/tm-monitor/eventmeter/eventmeter.go +++ b/tm-monitor/eventmeter/eventmeter.go @@ -48,9 +48,9 @@ type EventMetric struct { } func (metric *EventMetric) Copy() *EventMetric { - metric2 := *metric - metric2.meter = metric.meter.Snapshot() - return &metric2 + metricCopy := *metric + metricCopy.meter = metric.meter.Snapshot() + return &metricCopy } // called on GetMetric From 330f38a77afe3168d9a425be9b53c1a6c82982a4 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 3 Aug 2017 16:01:28 -0400 Subject: [PATCH 09/23] [tm-monitor] update WSClient --- tm-monitor/eventmeter/eventmeter.go | 222 +++++++++------------ tm-monitor/glide.lock | 16 +- tm-monitor/glide.yaml | 2 +- tm-monitor/main.go | 2 +- tm-monitor/mock/{mock.go => eventmeter.go} | 0 tm-monitor/monitor/node.go | 19 +- tm-monitor/rpc.go | 3 +- 7 files changed, 118 insertions(+), 146 deletions(-) rename tm-monitor/mock/{mock.go => eventmeter.go} (100%) diff --git a/tm-monitor/eventmeter/eventmeter.go b/tm-monitor/eventmeter/eventmeter.go index 127423836..9fe56fa60 100644 --- a/tm-monitor/eventmeter/eventmeter.go +++ b/tm-monitor/eventmeter/eventmeter.go @@ -1,30 +1,28 @@ +// eventmeter - generic system to subscribe to events and record their frequency. package eventmeter import ( + "context" "encoding/json" "fmt" "sync" "time" - "github.com/gorilla/websocket" - "github.com/pkg/errors" metrics "github.com/rcrowley/go-metrics" client "github.com/tendermint/tendermint/rpc/lib/client" "github.com/tendermint/tmlibs/events" "github.com/tendermint/tmlibs/log" ) -//------------------------------------------------------ -// Generic system to subscribe to events and record their frequency -//------------------------------------------------------ +const ( + // Get ping/pong latency and call LatencyCallbackFunc with this period. + latencyPeriod = 1 * time.Second -//------------------------------------------------------ -// Meter for a particular event - -// Closure to enable side effects from receiving an event -type EventCallbackFunc func(em *EventMetric, data interface{}) + // Check if the WS client is connected every + connectionCheckPeriod = 100 * time.Millisecond +) -// Metrics for a given event +// EventMetric exposes metrics for an event. type EventMetric struct { ID string `json:"id"` Started time.Time `json:"start_time"` @@ -42,8 +40,8 @@ type EventMetric struct { Rate15 float64 `json:"rate_15" wire:"unsafe"` RateMean float64 `json:"rate_mean" wire:"unsafe"` - // so the event can have effects in the event-meter's consumer. - // runs in a go routine + // so the event can have effects in the eventmeter's consumer. runs in a go + // routine. callback EventCallbackFunc } @@ -63,35 +61,32 @@ func (metric *EventMetric) fillMetric() *EventMetric { return metric } -//------------------------------------------------------ -// Websocket client and event meter for many events - -const maxPingsPerPong = 30 // if we haven't received a pong in this many attempted pings we kill the conn +// EventCallbackFunc is a closure to enable side effects from receiving an +// event. +type EventCallbackFunc func(em *EventMetric, data interface{}) -// Get the eventID and data out of the raw json received over the go-rpc websocket +// EventUnmarshalFunc is a closure to get the eventType and data out of the raw +// JSON received over the RPC WebSocket. type EventUnmarshalFunc func(b json.RawMessage) (string, events.EventData, error) -// Closure to enable side effects from receiving a pong +// LatencyCallbackFunc is a closure to enable side effects from receiving a latency. type LatencyCallbackFunc func(meanLatencyNanoSeconds float64) -// Closure to notify consumer that the connection died +// DisconnectCallbackFunc is a closure to notify a consumer that the connection +// has died. type DisconnectCallbackFunc func() -// Each node gets an event meter to track events for that node +// EventMeter tracks events, reports latency and disconnects. type EventMeter struct { wsc *client.WSClient mtx sync.Mutex events map[string]*EventMetric - // to record ws latency - timer metrics.Timer - lastPing time.Time - receivedPong bool + unmarshalEvent EventUnmarshalFunc latencyCallback LatencyCallbackFunc disconnectCallback DisconnectCallbackFunc - - unmarshalEvent EventUnmarshalFunc + subscribed bool quit chan struct{} @@ -99,54 +94,44 @@ type EventMeter struct { } func NewEventMeter(addr string, unmarshalEvent EventUnmarshalFunc) *EventMeter { - em := &EventMeter{ - wsc: client.NewWSClient(addr, "/websocket"), + return &EventMeter{ + wsc: client.NewWSClient(addr, "/websocket", client.PingPong(1*time.Second, 2*time.Second)), events: make(map[string]*EventMetric), - timer: metrics.NewTimer(), - receivedPong: true, unmarshalEvent: unmarshalEvent, logger: log.NewNopLogger(), } - return em } -// SetLogger lets you set your own logger +// SetLogger lets you set your own logger. func (em *EventMeter) SetLogger(l log.Logger) { em.logger = l + em.wsc.SetLogger(l.With("module", "rpcclient")) } +// String returns a string representation of event meter. func (em *EventMeter) String() string { return em.wsc.Address } +// Start boots up event meter. func (em *EventMeter) Start() error { - if _, err := em.wsc.Reset(); err != nil { - return err - } - if _, err := em.wsc.Start(); err != nil { return err } - em.wsc.Conn.SetPongHandler(func(m string) error { - // NOTE: https://github.com/gorilla/websocket/issues/97 - em.mtx.Lock() - defer em.mtx.Unlock() - em.receivedPong = true - em.timer.UpdateSince(em.lastPing) - if em.latencyCallback != nil { - go em.latencyCallback(em.timer.Mean()) - } - return nil - }) - em.quit = make(chan struct{}) go em.receiveRoutine() + go em.disconnectRoutine() - return em.resubscribe() + err := em.subscribe() + if err != nil { + return err + } + em.subscribed = true + return nil } -// Stop stops the EventMeter. +// Stop stops event meter. func (em *EventMeter) Stop() { close(em.quit) @@ -158,9 +143,7 @@ func (em *EventMeter) Stop() { // StopAndCallDisconnectCallback stops the EventMeter and calls // disconnectCallback if present. func (em *EventMeter) StopAndCallDisconnectCallback() { - if em.wsc.IsRunning() { - em.wsc.Stop() - } + em.Stop() em.mtx.Lock() defer em.mtx.Unlock() @@ -169,74 +152,70 @@ func (em *EventMeter) StopAndCallDisconnectCallback() { } } -func (em *EventMeter) Subscribe(eventID string, cb EventCallbackFunc) error { +// Subscribe for the given event type. Callback function will be called upon +// receiving an event. +func (em *EventMeter) Subscribe(eventType string, cb EventCallbackFunc) error { em.mtx.Lock() defer em.mtx.Unlock() - if _, ok := em.events[eventID]; ok { + if _, ok := em.events[eventType]; ok { return fmt.Errorf("subscribtion already exists") } - if err := em.wsc.Subscribe(eventID); err != nil { + if err := em.wsc.Subscribe(context.TODO(), eventType); err != nil { return err } metric := &EventMetric{ - ID: eventID, - Started: time.Now(), - MinDuration: 1 << 62, - meter: metrics.NewMeter(), - callback: cb, + meter: metrics.NewMeter(), + callback: cb, } - em.events[eventID] = metric + em.events[eventType] = metric return nil } -func (em *EventMeter) Unsubscribe(eventID string) error { +// Unsubscribe from the given event type. +func (em *EventMeter) Unsubscribe(eventType string) error { em.mtx.Lock() defer em.mtx.Unlock() - if err := em.wsc.Unsubscribe(eventID); err != nil { + if err := em.wsc.Unsubscribe(context.TODO(), eventType); err != nil { return err } // XXX: should we persist or save this info first? - delete(em.events, eventID) + delete(em.events, eventType) return nil } -// Fill in the latest data for an event and return a copy -func (em *EventMeter) GetMetric(eventID string) (*EventMetric, error) { +// GetMetric fills in the latest data for an event and return a copy. +func (em *EventMeter) GetMetric(eventType string) (*EventMetric, error) { em.mtx.Lock() defer em.mtx.Unlock() - metric, ok := em.events[eventID] + metric, ok := em.events[eventType] if !ok { - return nil, fmt.Errorf("Unknown event %s", eventID) + return nil, fmt.Errorf("unknown event: %s", eventType) } return metric.fillMetric().Copy(), nil } -// Return the average latency over the websocket -func (em *EventMeter) Latency() float64 { - em.mtx.Lock() - defer em.mtx.Unlock() - return em.timer.Mean() -} - +// RegisterLatencyCallback allows you to set latency callback. func (em *EventMeter) RegisterLatencyCallback(f LatencyCallbackFunc) { em.mtx.Lock() defer em.mtx.Unlock() em.latencyCallback = f } +// RegisterDisconnectCallback allows you to set disconnect callback. func (em *EventMeter) RegisterDisconnectCallback(f DisconnectCallbackFunc) { em.mtx.Lock() defer em.mtx.Unlock() em.disconnectCallback = f } -//------------------------------------------------------ +/////////////////////////////////////////////////////////////////////////////// +// Private -func (em *EventMeter) resubscribe() error { - for eventID, _ := range em.events { - if err := em.wsc.Subscribe(eventID); err != nil { +func (em *EventMeter) subscribe() error { + for eventType, _ := range em.events { + if err := em.wsc.Subscribe(context.TODO(), eventType); err != nil { return err } } @@ -244,39 +223,32 @@ func (em *EventMeter) resubscribe() error { } func (em *EventMeter) receiveRoutine() { - pingTime := time.Second * 1 - pingTicker := time.NewTicker(pingTime) - pingAttempts := 0 // if this hits maxPingsPerPong we kill the conn - - var err error + latencyTicker := time.NewTicker(latencyPeriod) for { select { - case <-pingTicker.C: - if pingAttempts, err = em.pingForLatency(pingAttempts); err != nil { - em.logger.Error("err", errors.Wrap(err, "failed to write ping message on websocket")) - em.StopAndCallDisconnectCallback() - return - } else if pingAttempts >= maxPingsPerPong { - em.logger.Error("err", errors.Errorf("Have not received a pong in %v", time.Duration(pingAttempts)*pingTime)) - em.StopAndCallDisconnectCallback() - return - } - case r := <-em.wsc.ResultsCh: - if r == nil { - em.logger.Error("err", errors.New("Expected some event, received nil")) - em.StopAndCallDisconnectCallback() - return + case rawEvent := <-em.wsc.ResultsCh: + if rawEvent == nil { + em.logger.Error("expected some event, got nil") + continue } - eventID, data, err := em.unmarshalEvent(r) + eventType, data, err := em.unmarshalEvent(rawEvent) if err != nil { - em.logger.Error("err", errors.Wrap(err, "failed to unmarshal event")) + em.logger.Error("failed to unmarshal event", "err", err) continue } - if eventID != "" { - em.updateMetric(eventID, data) + if eventType != "" { // FIXME how can it be an empty string? + em.updateMetric(eventType, data) + } + case err := <-em.wsc.ErrorsCh: + if err != nil { + em.logger.Error("expected some event, got error", "err", err) + } + case <-latencyTicker.C: + if em.wsc.IsActive() { + em.latencyCallback(em.wsc.PingPongLatencyTimer.Mean()) } case <-em.wsc.Quit: - em.logger.Error("err", errors.New("WSClient closed unexpectedly")) + em.logger.Error("WebSocket client closed unexpectedly") em.StopAndCallDisconnectCallback() return case <-em.quit: @@ -285,29 +257,33 @@ func (em *EventMeter) receiveRoutine() { } } -func (em *EventMeter) pingForLatency(pingAttempts int) (int, error) { - em.mtx.Lock() - defer em.mtx.Unlock() - - // ping to record latency - if !em.receivedPong { - return pingAttempts + 1, nil - } - - em.lastPing = time.Now() - em.receivedPong = false - err := em.wsc.Conn.WriteMessage(websocket.PingMessage, []byte{}) - if err != nil { - return pingAttempts, err +func (em *EventMeter) disconnectRoutine() { + ticker := time.NewTicker(connectionCheckPeriod) + for { + select { + case <-ticker.C: + if em.wsc.IsReconnecting() && em.subscribed { // notify user about disconnect only once + em.mtx.Lock() + if em.disconnectCallback != nil { + go em.disconnectCallback() + } + em.mtx.Unlock() + em.subscribed = false + } else if !em.wsc.IsReconnecting() && !em.subscribed { // resubscribe + em.subscribe() + em.subscribed = true + } + case <-em.quit: + return + } } - return 0, nil } -func (em *EventMeter) updateMetric(eventID string, data events.EventData) { +func (em *EventMeter) updateMetric(eventType string, data events.EventData) { em.mtx.Lock() defer em.mtx.Unlock() - metric, ok := em.events[eventID] + metric, ok := em.events[eventType] if !ok { // we already unsubscribed, or got an unexpected event return diff --git a/tm-monitor/glide.lock b/tm-monitor/glide.lock index 33b827d25..fb49f9b74 100644 --- a/tm-monitor/glide.lock +++ b/tm-monitor/glide.lock @@ -1,5 +1,5 @@ -hash: 30b649bc544a4ebd2b2a6188ce314cb72e6c28be8f3e57ec22e7cb83fd974814 -updated: 2017-07-29T18:47:33.199177142Z +hash: 3e3601085c1862570e37cfa6c7024df03e3921a43dc78be08372b1e9fbb1620d +updated: 2017-08-04T14:44:28.484044469Z imports: - name: github.com/btcsuite/btcd version: 583684b21bfbde9b5fc4403916fd7c807feb0289 @@ -13,6 +13,12 @@ imports: - log/term - name: github.com/go-logfmt/logfmt version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 +- name: github.com/go-playground/locales + version: 1e5f1161c6416a5ff48840eb8724a394e48cc534 + subpackages: + - currency +- name: github.com/go-playground/universal-translator + version: 71201497bace774495daed26a3874fd339e0b538 - name: github.com/go-stack/stack version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82 - name: github.com/golang/protobuf @@ -45,7 +51,7 @@ imports: subpackages: - data - name: github.com/tendermint/tendermint - version: e9b7221292afe25ce956ea85ab83bb5708eb2992 + version: 0013053fae3fb7611c392ebcff15352bb7ec717b subpackages: - config - p2p @@ -56,7 +62,7 @@ imports: - rpc/lib/types - types - name: github.com/tendermint/tmlibs - version: 2f6f3e6aa70bb19b70a6e73210273fa127041070 + version: 75372988e737a9f672c0e7f6308042620bd3e151 subpackages: - common - events @@ -97,6 +103,8 @@ imports: - stats - tap - transport +- name: gopkg.in/go-playground/validator.v9 + version: 0f6f568263a1ab5105b57f66f446d2625e4f545c testImports: - name: github.com/davecgh/go-spew version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 diff --git a/tm-monitor/glide.yaml b/tm-monitor/glide.yaml index e68ff6970..8256fc32b 100644 --- a/tm-monitor/glide.yaml +++ b/tm-monitor/glide.yaml @@ -5,7 +5,7 @@ import: - package: github.com/rcrowley/go-metrics - package: github.com/tendermint/go-crypto - package: github.com/tendermint/tendermint - version: develop + version: 0013053fae3fb7611c392ebcff15352bb7ec717b subpackages: - rpc/core/types - rpc/lib/client diff --git a/tm-monitor/main.go b/tm-monitor/main.go index 0c841c756..54901c6cb 100644 --- a/tm-monitor/main.go +++ b/tm-monitor/main.go @@ -47,7 +47,7 @@ Examples: } if noton { - logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "tm-monitor") + logger = log.NewTMLogger(log.NewSyncWriter(os.Stdout)) } m := startMonitor(flag.Arg(0)) diff --git a/tm-monitor/mock/mock.go b/tm-monitor/mock/eventmeter.go similarity index 100% rename from tm-monitor/mock/mock.go rename to tm-monitor/mock/eventmeter.go diff --git a/tm-monitor/monitor/node.go b/tm-monitor/monitor/node.go index 2c2352a77..53f76f332 100644 --- a/tm-monitor/monitor/node.go +++ b/tm-monitor/monitor/node.go @@ -129,7 +129,7 @@ func newBlockCallback(n *Node) em.EventCallbackFunc { block := data.(tmtypes.TMEventData).Unwrap().(tmtypes.EventDataNewBlockHeader).Header n.Height = uint64(block.Height) - n.logger.Info("event", "new block", "height", block.Height, "numTxs", block.NumTxs) + n.logger.Info("new block", "height", block.Height, "numTxs", block.NumTxs) if n.blockCh != nil { n.blockCh <- *block @@ -141,7 +141,7 @@ func newBlockCallback(n *Node) em.EventCallbackFunc { func latencyCallback(n *Node) em.LatencyCallbackFunc { return func(latency float64) { n.BlockLatency = latency / 1000000.0 // ns to ms - n.logger.Info("event", "new block latency", "latency", n.BlockLatency) + n.logger.Info("new block latency", "latency", n.BlockLatency) if n.blockLatencyCh != nil { n.blockLatencyCh <- latency @@ -158,17 +158,6 @@ func disconnectCallback(n *Node) em.DisconnectCallbackFunc { if n.disconnectCh != nil { n.disconnectCh <- true } - - if err := n.RestartEventMeterBackoff(); err != nil { - n.logger.Info("err", errors.Wrap(err, "restart failed")) - } else { - n.Online = true - n.logger.Info("status", "online") - - if n.disconnectCh != nil { - n.disconnectCh <- false - } - } } } @@ -180,7 +169,7 @@ func (n *Node) RestartEventMeterBackoff() error { time.Sleep(d * time.Second) if err := n.em.Start(); err != nil { - n.logger.Info("err", errors.Wrap(err, "restart failed")) + n.logger.Info("restart failed", "err", err) } else { // TODO: authenticate pubkey return nil @@ -231,7 +220,7 @@ func (n *Node) checkIsValidator() { } } } else { - n.logger.Info("err", errors.Wrap(err, "check is validator failed")) + n.logger.Info("check is validator failed", "err", err) } } diff --git a/tm-monitor/rpc.go b/tm-monitor/rpc.go index bbf508a9e..52e98eeb3 100644 --- a/tm-monitor/rpc.go +++ b/tm-monitor/rpc.go @@ -12,9 +12,8 @@ import ( func startRPC(listenAddr string, m *monitor.Monitor, logger log.Logger) { routes := routes(m) - // serve http and ws mux := http.NewServeMux() - wm := rpc.NewWebsocketManager(routes, nil) // TODO: evsw + wm := rpc.NewWebsocketManager(routes, nil) mux.HandleFunc("/websocket", wm.WebsocketHandler) rpc.RegisterRPCFuncs(mux, routes, logger) if _, err := rpc.StartHTTPServer(listenAddr, mux, logger); err != nil { From 877e8e31f75d608c0e3edef187d3c369f2e2ebc7 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 4 Aug 2017 13:11:43 -0400 Subject: [PATCH 10/23] [tm-bench] update tm-monitor --- tm-bench/glide.lock | 22 +++++++++------------- tm-bench/glide.yaml | 8 +++----- tm-bench/transacter.go | 15 +++++++++++---- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index fbc00868b..4f1cab8c8 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,12 +1,12 @@ -hash: b963733b341869e0667dde0c93f9be17fdf002ab4e92ae8778562a2b94580de8 -updated: 2017-07-29T18:52:35.221739544Z +hash: c6b00494f233e07baa1f506054b4a17fbd9230b7a7cf83469ddf32c1afb0aa6f +updated: 2017-08-04T16:23:50.471665666Z imports: - name: github.com/btcsuite/btcd version: 47885ab8702485be6b6f87a03d4f3be0bc5c982c subpackages: - btcec - name: github.com/go-kit/kit - version: 19463ea8b215413a29c3513aa3a76181f4bac58d + version: 8e03b4c61a9cf94dd91cd842c7cdc669729e873f subpackages: - log - log/level @@ -44,16 +44,12 @@ imports: - extra25519 - name: github.com/tendermint/go-crypto version: 95b7c9e09c49b91bfbb71bb63dd514eb55450f16 -- name: github.com/tendermint/go-rpc - version: 15d5b2ac497da95cd2dceb9c087910ccec4dacb2 - subpackages: - - types - name: github.com/tendermint/go-wire version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - data - name: github.com/tendermint/tendermint - version: b467515719e686e4678e6da4e102f32a491b85a0 + version: 0013053fae3fb7611c392ebcff15352bb7ec717b subpackages: - config - p2p @@ -71,12 +67,12 @@ imports: - log - merkle - name: github.com/tendermint/tools - version: d205ae1f98c946b2a057f62bfcd505b40ea52031 + version: 0b1866f431f544592a5db4789859cf451b8250c4 subpackages: - tm-monitor/eventmeter - tm-monitor/monitor - name: golang.org/x/crypto - version: 558b6879de74bc843225cde5686419267ff707ca + version: 42ff06aea7c329876e5a0fe94acc96902accf0ad subpackages: - curve25519 - nacl/box @@ -97,18 +93,18 @@ imports: - lex/httplex - trace - name: golang.org/x/text - version: 836efe42bb4aa16aaa17b9c155d8813d336ed720 + version: 3bd178b88a8180be2df394a1fbb81313916f0e7b subpackages: - secure/bidirule - transform - unicode/bidi - unicode/norm - name: google.golang.org/genproto - version: b0a3dcfcd1a9bd48e63634bd8802960804cf8315 + version: 09f6ed296fc66555a25fe4ce95173148778dfa85 subpackages: - googleapis/rpc/status - name: google.golang.org/grpc - version: 971efedc2078cb1efd8111d12432813084bc628d + version: 53ae6b7e909cb0bc4525c4c4454756a43da867dd subpackages: - codes - credentials diff --git a/tm-bench/glide.yaml b/tm-bench/glide.yaml index 37d128bd0..f29969c74 100644 --- a/tm-bench/glide.yaml +++ b/tm-bench/glide.yaml @@ -6,17 +6,15 @@ import: - package: github.com/gorilla/websocket - package: github.com/pkg/errors - package: github.com/rcrowley/go-metrics -- package: github.com/tendermint/go-rpc - version: develop - subpackages: - - types - package: github.com/tendermint/tendermint + version: 0013053fae3fb7611c392ebcff15352bb7ec717b subpackages: + - rpc/lib/types - types - package: github.com/tendermint/tmlibs subpackages: - log - package: github.com/tendermint/tools - version: develop + version: 0b1866f431f544592a5db4789859cf451b8250c4 subpackages: - tm-monitor/monitor diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 4720bf2e0..7a7ffb109 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -3,6 +3,7 @@ package main import ( "encoding/binary" "encoding/hex" + "encoding/json" "fmt" "math/rand" "net/http" @@ -14,12 +15,12 @@ import ( "github.com/gorilla/websocket" "github.com/pkg/errors" - rpctypes "github.com/tendermint/go-rpc/types" + rpctypes "github.com/tendermint/tendermint/rpc/lib/types" "github.com/tendermint/tmlibs/log" ) const ( - sendTimeout = 500 * time.Millisecond + sendTimeout = 10 * time.Second // see https://github.com/tendermint/go-rpc/blob/develop/server/handlers.go#L313 pingPeriod = (30 * 9 / 10) * time.Second ) @@ -124,13 +125,19 @@ func (t *transacter) sendLoop(connIndex int) { for i := 0; i < t.Rate; i++ { // each transaction embeds connection index and tx number tx := generateTx(connIndex, txNumber) + paramsJson, err := json.Marshal(map[string]interface{}{"tx": hex.EncodeToString(tx)}) + if err != nil { + fmt.Printf("failed to encode params: %v\n", err) + os.Exit(1) + } + rawParamsJson := json.RawMessage(paramsJson) c.SetWriteDeadline(time.Now().Add(sendTimeout)) - err := c.WriteJSON(rpctypes.RPCRequest{ + err = c.WriteJSON(rpctypes.RPCRequest{ JSONRPC: "2.0", ID: "", Method: "broadcast_tx_async", - Params: []interface{}{hex.EncodeToString(tx)}, + Params: &rawParamsJson, }) if err != nil { fmt.Printf("%v. Try increasing the connections count and reducing the rate.\n", errors.Wrap(err, "txs send failed")) From 081bd0805efd60ac50875b72b27572a4b5955726 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 8 Aug 2017 15:25:25 -0400 Subject: [PATCH 11/23] [tm-bench] increase pong write timeout by overriding the default handler --- tm-bench/transacter.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 7a7ffb109..ad30ff45d 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "math/rand" + "net" "net/http" "net/url" "os" @@ -91,7 +92,7 @@ func (t *transacter) receiveLoop(connIndex int) { for { _, _, err := c.ReadMessage() if err != nil { - if websocket.IsUnexpectedCloseError(err, websocket.CloseNormalClosure) { + if !websocket.IsCloseError(err, websocket.CloseNormalClosure) { t.logger.Error("failed to read response", "err", err) } return @@ -105,6 +106,17 @@ func (t *transacter) receiveLoop(connIndex int) { // sendLoop generates transactions at a given rate. func (t *transacter) sendLoop(connIndex int) { c := t.conns[connIndex] + + c.SetPingHandler(func(message string) error { + err := c.WriteControl(websocket.PongMessage, []byte(message), time.Now().Add(sendTimeout)) + if err == websocket.ErrCloseSent { + return nil + } else if e, ok := err.(net.Error); ok && e.Temporary() { + return nil + } + return err + }) + logger := t.logger.With("addr", c.RemoteAddr()) var txNumber = 0 From 42f58ceb4bb3b93d17e8669c1fb6d693b15435ca Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 8 Aug 2017 15:44:16 -0400 Subject: [PATCH 12/23] [tm-monitor] call latency callback in a separate goroutine --- tm-bench/transacter.go | 4 +-- tm-monitor/eventmeter/eventmeter.go | 40 ++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index ad30ff45d..894d133f0 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -152,7 +152,7 @@ func (t *transacter) sendLoop(connIndex int) { Params: &rawParamsJson, }) if err != nil { - fmt.Printf("%v. Try increasing the connections count and reducing the rate.\n", errors.Wrap(err, "txs send failed")) + fmt.Printf("%v. Try reducing the connections count and increasing the rate.\n", errors.Wrap(err, "txs send failed")) os.Exit(1) } @@ -163,7 +163,7 @@ func (t *transacter) sendLoop(connIndex int) { time.Sleep(time.Second - timeToSend) logger.Info(fmt.Sprintf("sent %d transactions", t.Rate), "took", timeToSend) case <-pingsTicker.C: - // Right now go-rpc server closes the connection in the absence of pings + // go-rpc server closes the connection in the absence of pings c.SetWriteDeadline(time.Now().Add(sendTimeout)) if err := c.WriteMessage(websocket.PingMessage, []byte{}); err != nil { logger.Error("failed to write ping message", "err", err) diff --git a/tm-monitor/eventmeter/eventmeter.go b/tm-monitor/eventmeter/eventmeter.go index 9fe56fa60..a96b425e0 100644 --- a/tm-monitor/eventmeter/eventmeter.go +++ b/tm-monitor/eventmeter/eventmeter.go @@ -140,18 +140,6 @@ func (em *EventMeter) Stop() { } } -// StopAndCallDisconnectCallback stops the EventMeter and calls -// disconnectCallback if present. -func (em *EventMeter) StopAndCallDisconnectCallback() { - em.Stop() - - em.mtx.Lock() - defer em.mtx.Unlock() - if em.disconnectCallback != nil { - go em.disconnectCallback() - } -} - // Subscribe for the given event type. Callback function will be called upon // receiving an event. func (em *EventMeter) Subscribe(eventType string, cb EventCallbackFunc) error { @@ -245,11 +233,9 @@ func (em *EventMeter) receiveRoutine() { } case <-latencyTicker.C: if em.wsc.IsActive() { - em.latencyCallback(em.wsc.PingPongLatencyTimer.Mean()) + em.callLatencyCallback(em.wsc.PingPongLatencyTimer.Mean()) } case <-em.wsc.Quit: - em.logger.Error("WebSocket client closed unexpectedly") - em.StopAndCallDisconnectCallback() return case <-em.quit: return @@ -263,16 +249,14 @@ func (em *EventMeter) disconnectRoutine() { select { case <-ticker.C: if em.wsc.IsReconnecting() && em.subscribed { // notify user about disconnect only once - em.mtx.Lock() - if em.disconnectCallback != nil { - go em.disconnectCallback() - } - em.mtx.Unlock() + em.callDisconnectCallback() em.subscribed = false } else if !em.wsc.IsReconnecting() && !em.subscribed { // resubscribe em.subscribe() em.subscribed = true } + case <-em.wsc.Quit: + return case <-em.quit: return } @@ -304,3 +288,19 @@ func (em *EventMeter) updateMetric(eventType string, data events.EventData) { go metric.callback(metric.Copy(), data) } } + +func (em *EventMeter) callDisconnectCallback() { + em.mtx.Lock() + if em.disconnectCallback != nil { + go em.disconnectCallback() + } + em.mtx.Unlock() +} + +func (em *EventMeter) callLatencyCallback(meanLatencyNanoSeconds float64) { + em.mtx.Lock() + if em.latencyCallback != nil { + go em.latencyCallback(meanLatencyNanoSeconds) + } + em.mtx.Unlock() +} From 9667e027f3f2da1ec022f4ad9b5ce198f099db2e Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 8 Aug 2017 15:57:10 -0400 Subject: [PATCH 13/23] [tm-monitor] fix TestNodeConnectionLost test --- tm-monitor/monitor/node_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tm-monitor/monitor/node_test.go b/tm-monitor/monitor/node_test.go index b8691a785..0f57629b5 100644 --- a/tm-monitor/monitor/node_test.go +++ b/tm-monitor/monitor/node_test.go @@ -68,10 +68,7 @@ func TestNodeConnectionLost(t *testing.T) { emMock.Call("disconnectCallback") assert.Equal(true, <-disconnectCh) - assert.Equal(false, <-disconnectCh) - - // we're back in a race - assert.Equal(true, n.Online) + assert.Equal(false, n.Online) } func TestNumValidators(t *testing.T) { From e1e50843ed003923c3ad425d183ae2fdf6e7bf80 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 14 Aug 2017 14:47:11 -0400 Subject: [PATCH 14/23] update tm-monitor --- tm-monitor/eventmeter/eventmeter.go | 2 +- tm-monitor/glide.lock | 8 ++++---- tm-monitor/glide.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tm-monitor/eventmeter/eventmeter.go b/tm-monitor/eventmeter/eventmeter.go index a96b425e0..552b4a746 100644 --- a/tm-monitor/eventmeter/eventmeter.go +++ b/tm-monitor/eventmeter/eventmeter.go @@ -95,7 +95,7 @@ type EventMeter struct { func NewEventMeter(addr string, unmarshalEvent EventUnmarshalFunc) *EventMeter { return &EventMeter{ - wsc: client.NewWSClient(addr, "/websocket", client.PingPong(1*time.Second, 2*time.Second)), + wsc: client.NewWSClient(addr, "/websocket", client.PingPeriod(1*time.Second)), events: make(map[string]*EventMetric), unmarshalEvent: unmarshalEvent, logger: log.NewNopLogger(), diff --git a/tm-monitor/glide.lock b/tm-monitor/glide.lock index fb49f9b74..b279e2f25 100644 --- a/tm-monitor/glide.lock +++ b/tm-monitor/glide.lock @@ -1,5 +1,5 @@ -hash: 3e3601085c1862570e37cfa6c7024df03e3921a43dc78be08372b1e9fbb1620d -updated: 2017-08-04T14:44:28.484044469Z +hash: 93b135dd9e360743acb6d8f82fea7b86f5a318e627a7479f41a5f3ad96b86b0b +updated: 2017-08-10T21:56:38.148200545Z imports: - name: github.com/btcsuite/btcd version: 583684b21bfbde9b5fc4403916fd7c807feb0289 @@ -51,7 +51,7 @@ imports: subpackages: - data - name: github.com/tendermint/tendermint - version: 0013053fae3fb7611c392ebcff15352bb7ec717b + version: 2fd8496bc109d010c6c2e415604131b500550e37 subpackages: - config - p2p @@ -104,7 +104,7 @@ imports: - tap - transport - name: gopkg.in/go-playground/validator.v9 - version: 0f6f568263a1ab5105b57f66f446d2625e4f545c + version: d529ee1b0f30352444f507cc6cdac96bfd12decc testImports: - name: github.com/davecgh/go-spew version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 diff --git a/tm-monitor/glide.yaml b/tm-monitor/glide.yaml index 8256fc32b..03f4c8375 100644 --- a/tm-monitor/glide.yaml +++ b/tm-monitor/glide.yaml @@ -5,7 +5,7 @@ import: - package: github.com/rcrowley/go-metrics - package: github.com/tendermint/go-crypto - package: github.com/tendermint/tendermint - version: 0013053fae3fb7611c392ebcff15352bb7ec717b + version: 2fd8496bc109d010c6c2e415604131b500550e37 subpackages: - rpc/core/types - rpc/lib/client From cd5173f9a5c6fbb04d4190d5a18c0371f356cfb2 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 14 Aug 2017 14:56:47 -0400 Subject: [PATCH 15/23] update tm-bench --- tm-bench/glide.lock | 23 ++++++++++++----------- tm-bench/glide.yaml | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index 4f1cab8c8..833b53224 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,12 +1,12 @@ -hash: c6b00494f233e07baa1f506054b4a17fbd9230b7a7cf83469ddf32c1afb0aa6f -updated: 2017-08-04T16:23:50.471665666Z +hash: 87a19f23803b3b2d23693942bf43dc598e5475dc92b87cd6f534b2ce8d664602 +updated: 2017-08-14T18:50:15.367518383Z imports: - name: github.com/btcsuite/btcd - version: 47885ab8702485be6b6f87a03d4f3be0bc5c982c + version: fd081f5ae4bfe9430189ceff89606213d827c7bc subpackages: - btcec - name: github.com/go-kit/kit - version: 8e03b4c61a9cf94dd91cd842c7cdc669729e873f + version: bcc4b7720576e21b922974d4a4397f576ba7ef35 subpackages: - log - log/level @@ -16,7 +16,7 @@ imports: - name: github.com/go-stack/stack version: 817915b46b97fd7bb80e8ab6b69f01a53ac3eebf - name: github.com/golang/protobuf - version: 748d386b5c1ea99658fd69fe9f03991ce86a90c1 + version: 1909bc2f63dc92bb931deace8b8312c4db72d12f subpackages: - proto - ptypes @@ -49,7 +49,7 @@ imports: subpackages: - data - name: github.com/tendermint/tendermint - version: 0013053fae3fb7611c392ebcff15352bb7ec717b + version: 2fd8496bc109d010c6c2e415604131b500550e37 subpackages: - config - p2p @@ -67,12 +67,12 @@ imports: - log - merkle - name: github.com/tendermint/tools - version: 0b1866f431f544592a5db4789859cf451b8250c4 + version: 4368c04d98487f4d733618ba7ac32933e8fb7d04 subpackages: - tm-monitor/eventmeter - tm-monitor/monitor - name: golang.org/x/crypto - version: 42ff06aea7c329876e5a0fe94acc96902accf0ad + version: b176d7def5d71bdd214203491f89843ed217f420 subpackages: - curve25519 - nacl/box @@ -83,7 +83,7 @@ imports: - ripemd160 - salsa20/salsa - name: golang.org/x/net - version: f5079bd7f6f74e23c4d65efa0f4ce14cbd6a3c0f + version: 1c05540f6879653db88113bc4a2b70aec4bd491f subpackages: - context - http2 @@ -93,7 +93,7 @@ imports: - lex/httplex - trace - name: golang.org/x/text - version: 3bd178b88a8180be2df394a1fbb81313916f0e7b + version: e56139fd9c5bc7244c76116c68e500765bb6db6b subpackages: - secure/bidirule - transform @@ -104,9 +104,10 @@ imports: subpackages: - googleapis/rpc/status - name: google.golang.org/grpc - version: 53ae6b7e909cb0bc4525c4c4454756a43da867dd + version: 43d1787a0c69bbee488da207f010368a8f4d980d subpackages: - codes + - connectivity - credentials - grpclb/grpc_lb_v1 - grpclog diff --git a/tm-bench/glide.yaml b/tm-bench/glide.yaml index f29969c74..582cffe74 100644 --- a/tm-bench/glide.yaml +++ b/tm-bench/glide.yaml @@ -7,7 +7,7 @@ import: - package: github.com/pkg/errors - package: github.com/rcrowley/go-metrics - package: github.com/tendermint/tendermint - version: 0013053fae3fb7611c392ebcff15352bb7ec717b + version: 2fd8496bc109d010c6c2e415604131b500550e37 subpackages: - rpc/lib/types - types @@ -15,6 +15,6 @@ import: subpackages: - log - package: github.com/tendermint/tools - version: 0b1866f431f544592a5db4789859cf451b8250c4 + version: 4368c04d98487f4d733618ba7ac32933e8fb7d04 subpackages: - tm-monitor/monitor From 45a7ae2e62b19ca752c066a4285827f5668be584 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 23 Aug 2017 10:57:14 -0400 Subject: [PATCH 16/23] Fixes to tm-bench transaction content - Initialize random with current time as seed so transaction messages are different at every run - Added hash of hostname to make transactions coming from different hosts different in every case - Added current time to transaction to make sure that messages are different even if random numbers are the same in subsequent runs - Shortened the transaction size to 64 bytes from the original 250 --- tm-bench/main.go | 14 +++++++++++++- tm-bench/transacter.go | 31 ++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/tm-bench/main.go b/tm-bench/main.go index 686a6e13f..f0cbaead8 100644 --- a/tm-bench/main.go +++ b/tm-bench/main.go @@ -14,6 +14,8 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/tmlibs/log" "github.com/tendermint/tools/tm-monitor/monitor" + "math/rand" + "crypto/md5" ) var version = "0.1.0" @@ -74,6 +76,8 @@ Examples: blockCh := make(chan tmtypes.Header, 100) blockLatencyCh := make(chan float64, 100) + rand.Seed(time.Now().Unix()) + nodes := startNodes(endpoints, blockCh, blockLatencyCh) transacters := startTransacters(endpoints, connections, txsRate) @@ -138,10 +142,18 @@ func startNodes(endpoints []string, blockCh chan<- tmtypes.Header, blockLatencyC } func startTransacters(endpoints []string, connections int, txsRate int) []*transacter { + + var hostHash [16]byte + if hostName , err := os.Hostname(); err != nil { + hostHash = md5.Sum([]byte("127.0.0.1")) + } else { + hostHash = md5.Sum([]byte(hostName)) + } + transacters := make([]*transacter, len(endpoints)) for i, e := range endpoints { - t := newTransacter(e, connections, txsRate) + t := newTransacter(e, connections, txsRate, hostHash) t.SetLogger(logger) if err := t.Start(); err != nil { fmt.Println(err) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 894d133f0..25e7442a1 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -30,6 +30,7 @@ type transacter struct { Target string Rate int Connections int + HostHash [16]byte conns []*websocket.Conn wg sync.WaitGroup @@ -38,11 +39,12 @@ type transacter struct { logger log.Logger } -func newTransacter(target string, connections int, rate int) *transacter { +func newTransacter(target string, connections int, rate int, hosthash [16]byte) *transacter { return &transacter{ Target: target, Rate: rate, Connections: connections, + HostHash: hosthash, conns: make([]*websocket.Conn, connections), logger: log.NewNopLogger(), } @@ -136,7 +138,7 @@ func (t *transacter) sendLoop(connIndex int) { for i := 0; i < t.Rate; i++ { // each transaction embeds connection index and tx number - tx := generateTx(connIndex, txNumber) + tx := generateTx(connIndex, txNumber, t.HostHash) paramsJson, err := json.Marshal(map[string]interface{}{"tx": hex.EncodeToString(tx)}) if err != nil { fmt.Printf("failed to encode params: %v\n", err) @@ -189,11 +191,26 @@ func connect(host string) (*websocket.Conn, *http.Response, error) { return websocket.DefaultDialer.Dial(u.String(), nil) } -func generateTx(a int, b int) []byte { - tx := make([]byte, 250) - binary.PutUvarint(tx[:32], uint64(a)) - binary.PutUvarint(tx[32:64], uint64(b)) - if _, err := rand.Read(tx[234:]); err != nil { +func generateTx(a int, b int, hosthash [16]byte) []byte { + // 64 byte transaction + tx := make([]byte, 64) + + // 0-8 connection number + binary.PutUvarint(tx[:8], uint64(a)) + + // 8-16 transaction number + binary.PutUvarint(tx[8:16], uint64(b)) + + // 16-32 hostname hash + for i:=0; i < 16 ; i++ { + tx[16+i] = hosthash[i] + } + + // 32-40 current time + PutUvarint(tx[32:40], uint64(time.Now().Unix())) + + // 40-64 random data + if _, err := rand.Read(tx[40:]); err != nil { panic(errors.Wrap(err, "failed to generate transaction")) } return tx From 279d6a0ebb0b1aea482ddba937d28e6f4bce6c71 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 23 Aug 2017 11:04:04 -0400 Subject: [PATCH 17/23] Typo fix in transacter.go --- tm-bench/transacter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 25e7442a1..ebe07a149 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -207,7 +207,7 @@ func generateTx(a int, b int, hosthash [16]byte) []byte { } // 32-40 current time - PutUvarint(tx[32:40], uint64(time.Now().Unix())) + binary.PutUvarint(tx[32:40], uint64(time.Now().Unix())) // 40-64 random data if _, err := rand.Read(tx[40:]); err != nil { From 76da726d2a42661eae6035fb5468f63a374dea13 Mon Sep 17 00:00:00 2001 From: Greg Szabo Date: Wed, 23 Aug 2017 14:42:54 -0400 Subject: [PATCH 18/23] Changed transaction message size to 250 bytes --- tm-bench/transacter.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index ebe07a149..320b2078f 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -192,8 +192,8 @@ func connect(host string) (*websocket.Conn, *http.Response, error) { } func generateTx(a int, b int, hosthash [16]byte) []byte { - // 64 byte transaction - tx := make([]byte, 64) + // 250 byte transaction + tx := make([]byte, 250) // 0-8 connection number binary.PutUvarint(tx[:8], uint64(a)) @@ -209,7 +209,7 @@ func generateTx(a int, b int, hosthash [16]byte) []byte { // 32-40 current time binary.PutUvarint(tx[32:40], uint64(time.Now().Unix())) - // 40-64 random data + // 40- random data if _, err := rand.Read(tx[40:]); err != nil { panic(errors.Wrap(err, "failed to generate transaction")) } From cd7666c4cef759d356aefed6f637d9bbe47d2059 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 6 Oct 2017 11:04:40 +0400 Subject: [PATCH 19/23] [tm-monitor] update deps rename get_deps to get_vendor_deps --- tm-monitor/Dockerfile.dev | 2 +- tm-monitor/Makefile | 4 ++-- tm-monitor/glide.lock | 14 +++++++------- tm-monitor/glide.yaml | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tm-monitor/Dockerfile.dev b/tm-monitor/Dockerfile.dev index 4b610fd17..a730b8a0d 100644 --- a/tm-monitor/Dockerfile.dev +++ b/tm-monitor/Dockerfile.dev @@ -7,6 +7,6 @@ COPY Makefile /go/src/github.com/tendermint/tools/tm-monitor/ COPY glide.yaml /go/src/github.com/tendermint/tools/tm-monitor/ COPY glide.lock /go/src/github.com/tendermint/tools/tm-monitor/ -RUN make get_deps +RUN make get_vendor_deps COPY . /go/src/github.com/tendermint/tools/tm-monitor diff --git a/tm-monitor/Makefile b/tm-monitor/Makefile index 42091eaa1..3e99f7f79 100644 --- a/tm-monitor/Makefile +++ b/tm-monitor/Makefile @@ -8,7 +8,7 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') tools: go get -v $(GOTOOLS) -get_deps: tools +get_vendor_deps: tools glide install build: @@ -45,4 +45,4 @@ clean: rm -f ./tm-monitor rm -rf ./dist -.PHONY: tools get_deps build install test build-all dist clean build-docker +.PHONY: tools get_vendor_deps build install test build-all dist clean build-docker diff --git a/tm-monitor/glide.lock b/tm-monitor/glide.lock index b279e2f25..90107cd5d 100644 --- a/tm-monitor/glide.lock +++ b/tm-monitor/glide.lock @@ -1,5 +1,5 @@ -hash: 93b135dd9e360743acb6d8f82fea7b86f5a318e627a7479f41a5f3ad96b86b0b -updated: 2017-08-10T21:56:38.148200545Z +hash: 1a38134bef18f688b42d6d52fcb02682604e8c1c9e308f6e2ce8c4a461c903a9 +updated: 2017-10-06T06:57:56.777237539Z imports: - name: github.com/btcsuite/btcd version: 583684b21bfbde9b5fc4403916fd7c807feb0289 @@ -34,7 +34,7 @@ imports: - name: github.com/rcrowley/go-metrics version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c - name: github.com/tendermint/abci - version: 864d1f80b36b440bde030a5c18d8ac3aa8c2949d + version: 191c4b6d176169ffc7f9972d490fa362a3b7d940 subpackages: - client - example/dummy @@ -45,13 +45,13 @@ imports: - edwards25519 - extra25519 - name: github.com/tendermint/go-crypto - version: 95b7c9e09c49b91bfbb71bb63dd514eb55450f16 + version: 311e8c1bf00fa5868daad4f8ea56dcad539182c0 - name: github.com/tendermint/go-wire version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - data - name: github.com/tendermint/tendermint - version: 2fd8496bc109d010c6c2e415604131b500550e37 + version: 7682ad9a60162dd17fd6f61aeed7049a8635ac78 subpackages: - config - p2p @@ -62,7 +62,7 @@ imports: - rpc/lib/types - types - name: github.com/tendermint/tmlibs - version: 75372988e737a9f672c0e7f6308042620bd3e151 + version: 7dd6b3d3f8a7a998a79bdd0d8222252b309570f3 subpackages: - common - events @@ -104,7 +104,7 @@ imports: - tap - transport - name: gopkg.in/go-playground/validator.v9 - version: d529ee1b0f30352444f507cc6cdac96bfd12decc + version: a021b2ec9a8a8bb970f3f15bc42617cb520e8a64 testImports: - name: github.com/davecgh/go-spew version: 04cdfd42973bb9c8589fd6a731800cf222fde1a9 diff --git a/tm-monitor/glide.yaml b/tm-monitor/glide.yaml index 03f4c8375..7f593c04f 100644 --- a/tm-monitor/glide.yaml +++ b/tm-monitor/glide.yaml @@ -5,7 +5,7 @@ import: - package: github.com/rcrowley/go-metrics - package: github.com/tendermint/go-crypto - package: github.com/tendermint/tendermint - version: 2fd8496bc109d010c6c2e415604131b500550e37 + version: v0.11.0 subpackages: - rpc/core/types - rpc/lib/client From 9708c66576d3e7d4fd0a5cdec7d951f1ef002efc Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 6 Oct 2017 11:05:43 +0400 Subject: [PATCH 20/23] [tm-monitor] bump version to 0.3.0 --- tm-monitor/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tm-monitor/main.go b/tm-monitor/main.go index 54901c6cb..3a51e2b15 100644 --- a/tm-monitor/main.go +++ b/tm-monitor/main.go @@ -11,7 +11,7 @@ import ( monitor "github.com/tendermint/tools/tm-monitor/monitor" ) -var version = "0.2.1" +var version = "0.3.0" var logger = log.NewNopLogger() From 989ff83c4c1894a03b7d2ac4a2a19fa7a7c4c37b Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 6 Oct 2017 11:34:34 +0400 Subject: [PATCH 21/23] [tm-bench] refactor code - set ID in RPCRequest - rename get_deps to get_vendor_deps --- tm-bench/Dockerfile.dev | 2 +- tm-bench/Makefile | 4 ++-- tm-bench/glide.lock | 46 +++++++++++++++++++++++--------------- tm-bench/glide.yaml | 4 ++-- tm-bench/main.go | 14 +----------- tm-bench/transacter.go | 49 ++++++++++++++++++++++------------------- 6 files changed, 60 insertions(+), 59 deletions(-) diff --git a/tm-bench/Dockerfile.dev b/tm-bench/Dockerfile.dev index 8e4c2d618..22c172133 100644 --- a/tm-bench/Dockerfile.dev +++ b/tm-bench/Dockerfile.dev @@ -7,6 +7,6 @@ COPY Makefile /go/src/github.com/tendermint/tools/tm-bench/ COPY glide.yaml /go/src/github.com/tendermint/tools/tm-bench/ COPY glide.lock /go/src/github.com/tendermint/tools/tm-bench/ -RUN make get_deps +RUN make get_vendor_deps COPY . /go/src/github.com/tendermint/tools/tm-bench diff --git a/tm-bench/Makefile b/tm-bench/Makefile index 1d4c8a49b..e985dadb6 100644 --- a/tm-bench/Makefile +++ b/tm-bench/Makefile @@ -7,7 +7,7 @@ GOTOOLS = \ tools: go get -v $(GOTOOLS) -get_deps: tools +get_vendor_deps: tools glide install build: @@ -44,4 +44,4 @@ clean: rm -f ./tm-bench rm -rf ./dist -.PHONY: tools get_deps build install test build-all dist clean build-docker +.PHONY: tools get_vendor_deps build install test build-all dist clean build-docker diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index 833b53224..796487e0b 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,22 +1,28 @@ -hash: 87a19f23803b3b2d23693942bf43dc598e5475dc92b87cd6f534b2ce8d664602 -updated: 2017-08-14T18:50:15.367518383Z +hash: d196c017846efa4f180164cea76c9a950f1d22989fdb157d3e7bb858b0f5a86d +updated: 2017-10-06T07:26:42.070129304Z imports: - name: github.com/btcsuite/btcd - version: fd081f5ae4bfe9430189ceff89606213d827c7bc + version: 4803a8291c92a1d2d41041b942a9a9e37deab065 subpackages: - btcec - name: github.com/go-kit/kit - version: bcc4b7720576e21b922974d4a4397f576ba7ef35 + version: 4dc7be5d2d12881735283bcab7352178e190fc71 subpackages: - log - log/level - log/term - name: github.com/go-logfmt/logfmt version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5 +- name: github.com/go-playground/locales + version: 1e5f1161c6416a5ff48840eb8724a394e48cc534 + subpackages: + - currency +- name: github.com/go-playground/universal-translator + version: 71201497bace774495daed26a3874fd339e0b538 - name: github.com/go-stack/stack version: 817915b46b97fd7bb80e8ab6b69f01a53ac3eebf - name: github.com/golang/protobuf - version: 1909bc2f63dc92bb931deace8b8312c4db72d12f + version: 130e6b02ab059e7b717a096f397c5b60111cae74 subpackages: - proto - ptypes @@ -24,15 +30,15 @@ imports: - ptypes/duration - ptypes/timestamp - name: github.com/gorilla/websocket - version: a69d9f6de432e2c6b296a947d8a5ee88f68522cf + version: 4201258b820c74ac8e6922fc9e6b52f71fe46f8d - name: github.com/kr/logfmt version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0 - name: github.com/pkg/errors - version: c605e284fe17294bda444b34710735b29d1a9d90 + version: 2b3a18b5f0fb6b4f9190549597d3f962c02bc5eb - name: github.com/rcrowley/go-metrics version: 1f30fe9094a513ce4c700b9a54458bbb0c96996c - name: github.com/tendermint/abci - version: 864d1f80b36b440bde030a5c18d8ac3aa8c2949d + version: 191c4b6d176169ffc7f9972d490fa362a3b7d940 subpackages: - client - example/dummy @@ -43,13 +49,13 @@ imports: - edwards25519 - extra25519 - name: github.com/tendermint/go-crypto - version: 95b7c9e09c49b91bfbb71bb63dd514eb55450f16 + version: 311e8c1bf00fa5868daad4f8ea56dcad539182c0 - name: github.com/tendermint/go-wire version: 5f88da3dbc1a72844e6dfaf274ce87f851d488eb subpackages: - data - name: github.com/tendermint/tendermint - version: 2fd8496bc109d010c6c2e415604131b500550e37 + version: 7682ad9a60162dd17fd6f61aeed7049a8635ac78 subpackages: - config - p2p @@ -59,7 +65,7 @@ imports: - rpc/lib/types - types - name: github.com/tendermint/tmlibs - version: 7ce4da1eee6004d627e780c8fe91e96d9b99e459 + version: 096dcb90e60aa00b748b3fe49a4b95e48ebf1e13 subpackages: - common - events @@ -67,12 +73,12 @@ imports: - log - merkle - name: github.com/tendermint/tools - version: 4368c04d98487f4d733618ba7ac32933e8fb7d04 + version: 213b11a6cad7b3c7fdedd2cc05b74e62b4f318b1 subpackages: - tm-monitor/eventmeter - tm-monitor/monitor - name: golang.org/x/crypto - version: b176d7def5d71bdd214203491f89843ed217f420 + version: 9419663f5a44be8b34ca85f08abc5fe1be11f8a3 subpackages: - curve25519 - nacl/box @@ -83,7 +89,7 @@ imports: - ripemd160 - salsa20/salsa - name: golang.org/x/net - version: 1c05540f6879653db88113bc4a2b70aec4bd491f + version: a04bdaca5b32abe1c069418fb7088ae607de5bd0 subpackages: - context - http2 @@ -93,31 +99,35 @@ imports: - lex/httplex - trace - name: golang.org/x/text - version: e56139fd9c5bc7244c76116c68e500765bb6db6b + version: d82c1812e304abfeeabd31e995a115a2855bf642 subpackages: - secure/bidirule - transform - unicode/bidi - unicode/norm - name: google.golang.org/genproto - version: 09f6ed296fc66555a25fe4ce95173148778dfa85 + version: f676e0f3ac6395ff1a529ae59a6670878a8371a6 subpackages: - googleapis/rpc/status - name: google.golang.org/grpc - version: 43d1787a0c69bbee488da207f010368a8f4d980d + version: 5279edf262dc22329b1e53281ce9d55c0a998216 subpackages: + - balancer - codes - connectivity - credentials - - grpclb/grpc_lb_v1 + - grpclb/grpc_lb_v1/messages - grpclog - internal - keepalive - metadata - naming - peer + - resolver - stats - status - tap - transport +- name: gopkg.in/go-playground/validator.v9 + version: a021b2ec9a8a8bb970f3f15bc42617cb520e8a64 testImports: [] diff --git a/tm-bench/glide.yaml b/tm-bench/glide.yaml index 582cffe74..5756a90ba 100644 --- a/tm-bench/glide.yaml +++ b/tm-bench/glide.yaml @@ -7,7 +7,7 @@ import: - package: github.com/pkg/errors - package: github.com/rcrowley/go-metrics - package: github.com/tendermint/tendermint - version: 2fd8496bc109d010c6c2e415604131b500550e37 + version: v0.11.0 subpackages: - rpc/lib/types - types @@ -15,6 +15,6 @@ import: subpackages: - log - package: github.com/tendermint/tools - version: 4368c04d98487f4d733618ba7ac32933e8fb7d04 + version: 213b11a6cad7b3c7fdedd2cc05b74e62b4f318b1 subpackages: - tm-monitor/monitor diff --git a/tm-bench/main.go b/tm-bench/main.go index f0cbaead8..686a6e13f 100644 --- a/tm-bench/main.go +++ b/tm-bench/main.go @@ -14,8 +14,6 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/tendermint/tmlibs/log" "github.com/tendermint/tools/tm-monitor/monitor" - "math/rand" - "crypto/md5" ) var version = "0.1.0" @@ -76,8 +74,6 @@ Examples: blockCh := make(chan tmtypes.Header, 100) blockLatencyCh := make(chan float64, 100) - rand.Seed(time.Now().Unix()) - nodes := startNodes(endpoints, blockCh, blockLatencyCh) transacters := startTransacters(endpoints, connections, txsRate) @@ -142,18 +138,10 @@ func startNodes(endpoints []string, blockCh chan<- tmtypes.Header, blockLatencyC } func startTransacters(endpoints []string, connections int, txsRate int) []*transacter { - - var hostHash [16]byte - if hostName , err := os.Hostname(); err != nil { - hostHash = md5.Sum([]byte("127.0.0.1")) - } else { - hostHash = md5.Sum([]byte(hostName)) - } - transacters := make([]*transacter, len(endpoints)) for i, e := range endpoints { - t := newTransacter(e, connections, txsRate, hostHash) + t := newTransacter(e, connections, txsRate) t.SetLogger(logger) if err := t.Start(); err != nil { fmt.Println(err) diff --git a/tm-bench/transacter.go b/tm-bench/transacter.go index 320b2078f..ba6d0b7d1 100644 --- a/tm-bench/transacter.go +++ b/tm-bench/transacter.go @@ -1,6 +1,7 @@ package main import ( + "crypto/md5" "encoding/binary" "encoding/hex" "encoding/json" @@ -24,13 +25,15 @@ const ( sendTimeout = 10 * time.Second // see https://github.com/tendermint/go-rpc/blob/develop/server/handlers.go#L313 pingPeriod = (30 * 9 / 10) * time.Second + + // the size of a transaction in bytes. + txSize = 250 ) type transacter struct { Target string Rate int Connections int - HostHash [16]byte conns []*websocket.Conn wg sync.WaitGroup @@ -39,12 +42,11 @@ type transacter struct { logger log.Logger } -func newTransacter(target string, connections int, rate int, hosthash [16]byte) *transacter { +func newTransacter(target string, connections int, rate int) *transacter { return &transacter{ Target: target, Rate: rate, Connections: connections, - HostHash: hosthash, conns: make([]*websocket.Conn, connections), logger: log.NewNopLogger(), } @@ -60,6 +62,8 @@ func (t *transacter) SetLogger(l log.Logger) { func (t *transacter) Start() error { t.stopped = false + rand.Seed(time.Now().Unix()) + for i := 0; i < t.Connections; i++ { c, _, err := connect(t.Target) if err != nil { @@ -131,14 +135,22 @@ func (t *transacter) sendLoop(connIndex int) { t.wg.Done() }() + // hash of the host name is a part of each tx + var hostnameHash [md5.Size]byte + hostname, err := os.Hostname() + if err != nil { + hostname = "127.0.0.1" + } + hostnameHash = md5.Sum([]byte(hostname)) + for { select { case <-txsTicker.C: startTime := time.Now() for i := 0; i < t.Rate; i++ { - // each transaction embeds connection index and tx number - tx := generateTx(connIndex, txNumber, t.HostHash) + // each transaction embeds connection index, tx number and hash of the hostname + tx := generateTx(connIndex, txNumber, hostnameHash) paramsJson, err := json.Marshal(map[string]interface{}{"tx": hex.EncodeToString(tx)}) if err != nil { fmt.Printf("failed to encode params: %v\n", err) @@ -149,7 +161,7 @@ func (t *transacter) sendLoop(connIndex int) { c.SetWriteDeadline(time.Now().Add(sendTimeout)) err = c.WriteJSON(rpctypes.RPCRequest{ JSONRPC: "2.0", - ID: "", + ID: "tm-bench", Method: "broadcast_tx_async", Params: &rawParamsJson, }) @@ -191,27 +203,18 @@ func connect(host string) (*websocket.Conn, *http.Response, error) { return websocket.DefaultDialer.Dial(u.String(), nil) } -func generateTx(a int, b int, hosthash [16]byte) []byte { - // 250 byte transaction - tx := make([]byte, 250) - - // 0-8 connection number - binary.PutUvarint(tx[:8], uint64(a)) +func generateTx(connIndex int, txNumber int, hostnameHash [md5.Size]byte) []byte { + tx := make([]byte, txSize) - // 8-16 transaction number - binary.PutUvarint(tx[8:16], uint64(b)) - - // 16-32 hostname hash - for i:=0; i < 16 ; i++ { - tx[16+i] = hosthash[i] - } - - // 32-40 current time + binary.PutUvarint(tx[:8], uint64(connIndex)) + binary.PutUvarint(tx[8:16], uint64(txNumber)) + copy(tx[16:32], hostnameHash[:16]) binary.PutUvarint(tx[32:40], uint64(time.Now().Unix())) - // 40- random data + // 40-* random data if _, err := rand.Read(tx[40:]); err != nil { - panic(errors.Wrap(err, "failed to generate transaction")) + panic(errors.Wrap(err, "failed to read random bytes")) } + return tx } From 769c7d015e321e053351651d5c29c754f00d531d Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 6 Oct 2017 11:36:07 +0400 Subject: [PATCH 22/23] [tm-bench] bump version to 0.2.0 --- tm-bench/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tm-bench/main.go b/tm-bench/main.go index 686a6e13f..e34d16f4b 100644 --- a/tm-bench/main.go +++ b/tm-bench/main.go @@ -16,7 +16,7 @@ import ( "github.com/tendermint/tools/tm-monitor/monitor" ) -var version = "0.1.0" +var version = "0.2.0" var logger = log.NewNopLogger() From 4c4a94565811b10daadd0df4961a79dfa6ee3367 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 6 Oct 2017 12:04:44 +0400 Subject: [PATCH 23/23] [tm-bench] update deps --- tm-bench/glide.lock | 6 +++--- tm-bench/glide.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tm-bench/glide.lock b/tm-bench/glide.lock index 796487e0b..cb0d1f5b7 100644 --- a/tm-bench/glide.lock +++ b/tm-bench/glide.lock @@ -1,5 +1,5 @@ -hash: d196c017846efa4f180164cea76c9a950f1d22989fdb157d3e7bb858b0f5a86d -updated: 2017-10-06T07:26:42.070129304Z +hash: 765fd22d79f7d7123197548b3228ebf56f72be9541b64b04cde875f2d09214f8 +updated: 2017-10-06T07:40:33.279710782Z imports: - name: github.com/btcsuite/btcd version: 4803a8291c92a1d2d41041b942a9a9e37deab065 @@ -73,7 +73,7 @@ imports: - log - merkle - name: github.com/tendermint/tools - version: 213b11a6cad7b3c7fdedd2cc05b74e62b4f318b1 + version: 9708c66576d3e7d4fd0a5cdec7d951f1ef002efc subpackages: - tm-monitor/eventmeter - tm-monitor/monitor diff --git a/tm-bench/glide.yaml b/tm-bench/glide.yaml index 5756a90ba..c6ddfe432 100644 --- a/tm-bench/glide.yaml +++ b/tm-bench/glide.yaml @@ -15,6 +15,6 @@ import: subpackages: - log - package: github.com/tendermint/tools - version: 213b11a6cad7b3c7fdedd2cc05b74e62b4f318b1 + version: 9708c66576d3e7d4fd0a5cdec7d951f1ef002efc subpackages: - tm-monitor/monitor