From 7dbbdcc41768ed82722e8340406f249e15dd0208 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 1 Nov 2019 04:25:27 +0300 Subject: [PATCH 1/3] Add API to reset bandwidth counters --- go.mod | 4 ++++ go.sum | 4 ++++ metrics/bandwidth.go | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/go.mod b/go.mod index a632955..766208b 100644 --- a/go.mod +++ b/go.mod @@ -18,4 +18,8 @@ require ( golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 ) +//replace github.com/libp2p/go-flow-metrics v0.0.1 => github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4 // Stebalien's version + +replace github.com/libp2p/go-flow-metrics v0.0.1 => github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222 // kpp's version + go 1.12 diff --git a/go.sum b/go.sum index 6a06c8b..e13a8a8 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,10 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222 h1:6Pnw+RUnFR7FY6wEQbqFj+aPrp7bMptn02jEAruMPLk= +github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= +github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4 h1:wZFgH2qCaRIN+wb0B8e2HuI2JzdrLOMvVxU0cqvZB2g= +github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/metrics/bandwidth.go b/metrics/bandwidth.go index e2c8acf..aa758e8 100644 --- a/metrics/bandwidth.go +++ b/metrics/bandwidth.go @@ -151,3 +151,15 @@ func (bwc *BandwidthCounter) GetBandwidthByProtocol() map[protocol.ID]Stats { return protocols } + +// Reset clears all stats. +func (bwc *BandwidthCounter) Reset() { + bwc.totalIn.Reset() + bwc.totalOut.Reset() + + bwc.protocolIn.Clear() + bwc.protocolOut.Clear() + + bwc.peerIn.Clear() + bwc.peerOut.Clear() +} From 91d2454e8c6337e80f421cf73513a8050c54fb13 Mon Sep 17 00:00:00 2001 From: Roman Proskuryakov Date: Fri, 1 Nov 2019 04:46:48 +0300 Subject: [PATCH 2/3] Add a test for BandwidthCounter::Reset --- metrics/bandwidth_test.go | 57 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/metrics/bandwidth_test.go b/metrics/bandwidth_test.go index de7b0fd..49309b0 100644 --- a/metrics/bandwidth_test.go +++ b/metrics/bandwidth_test.go @@ -143,6 +143,63 @@ func TestBandwidthCounter(t *testing.T) { } } +func TestResetBandwidthCounter(t *testing.T) { + bwc := NewBandwidthCounter() + + p := peer.ID("peer-0") + proto := protocol.ID("proto-0") + + bwc.LogSentMessage(42) + bwc.LogRecvMessage(24) + bwc.LogSentMessageStream(100, proto, p) + bwc.LogRecvMessageStream(50, proto, p) + + time.Sleep(1 * time.Second) + + { + stats := bwc.GetBandwidthTotals() + assertEq(t, 42, stats.TotalOut) + assertEq(t, 24, stats.TotalIn) + } + + { + stats := bwc.GetBandwidthByProtocol() + assertApproxEq(t, 1, float64(len(stats))) + stat := stats[proto] + assertApproxEq(t, 100, stat.RateOut) + assertApproxEq(t, 50, stat.RateIn) + } + + { + stats := bwc.GetBandwidthByPeer() + assertApproxEq(t, 1, float64(len(stats))) + stat := stats[p] + assertApproxEq(t, 100, stat.RateOut) + assertApproxEq(t, 50, stat.RateIn) + } + + bwc.Reset() + { + stats := bwc.GetBandwidthTotals() + assertEq(t, 0, stats.TotalOut) + assertEq(t, 0, stats.TotalIn) + } + + { + byProtocol := bwc.GetBandwidthByProtocol() + if len(byProtocol) != 0 { + t.Errorf("expected 0 protocols, got %d", len(byProtocol)) + } + } + + { + byPeer := bwc.GetBandwidthByPeer() + if len(byPeer) != 0 { + t.Errorf("expected 0 peers, got %d", len(byPeer)) + } + } +} + func assertEq(t *testing.T, expected, actual int64) { if expected != actual { t.Errorf("expected %d, got %d", expected, actual) From b1df0aa8b13529b9c9fcfcc8a7630ff1c0c3fccd Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 31 Oct 2019 23:47:34 -0700 Subject: [PATCH 3/3] fix(metrics): update go-flow-metrics and fix tests for upstream changes --- go.mod | 6 +----- go.sum | 8 ++------ metrics/bandwidth_test.go | 28 ++++++++++++++++++++++------ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 766208b..09a1036 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/gogo/protobuf v1.3.1 github.com/ipfs/go-cid v0.0.3 github.com/jbenet/goprocess v0.1.3 - github.com/libp2p/go-flow-metrics v0.0.1 + github.com/libp2p/go-flow-metrics v0.0.2 github.com/libp2p/go-msgio v0.0.4 github.com/libp2p/go-openssl v0.0.3 github.com/minio/sha256-simd v0.1.1 @@ -18,8 +18,4 @@ require ( golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 ) -//replace github.com/libp2p/go-flow-metrics v0.0.1 => github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4 // Stebalien's version - -replace github.com/libp2p/go-flow-metrics v0.0.1 => github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222 // kpp's version - go 1.12 diff --git a/go.sum b/go.sum index e13a8a8..919e82c 100644 --- a/go.sum +++ b/go.sum @@ -59,10 +59,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222 h1:6Pnw+RUnFR7FY6wEQbqFj+aPrp7bMptn02jEAruMPLk= -github.com/kpp/go-flow-metrics v0.0.2-0.20191031231915-edeb2d90f222/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= -github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4 h1:wZFgH2qCaRIN+wb0B8e2HuI2JzdrLOMvVxU0cqvZB2g= -github.com/kpp/go-flow-metrics v0.0.2-0.20191101005412-ce5ebda5e4a4/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -70,8 +66,8 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= -github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= -github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-flow-metrics v0.0.2 h1:U5TvqfoyR6GVRM+bC15Ux1ltar1kbj6Zw6xOVR02CZs= +github.com/libp2p/go-flow-metrics v0.0.2/go.mod h1:HeoSNUrOJVK1jEpDqVEiUOIXqhbnS27omG0uWU5slZs= github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA= github.com/libp2p/go-msgio v0.0.4 h1:agEFehY3zWJFUHK6SEMR7UYmk2z6kC3oeCM7ybLhguA= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= diff --git a/metrics/bandwidth_test.go b/metrics/bandwidth_test.go index 49309b0..a3232e1 100644 --- a/metrics/bandwidth_test.go +++ b/metrics/bandwidth_test.go @@ -48,8 +48,8 @@ func round(bwc *BandwidthCounter, b *testing.B) { b.StopTimer() } -// Allow 7% errors for bw calculations. -const acceptableError = 0.07 +// Allow 1% errors for bw calculations. +const acceptableError = 0.01 func TestBandwidthCounter(t *testing.T) { bwc := NewBandwidthCounter() @@ -62,12 +62,19 @@ func TestBandwidthCounter(t *testing.T) { proto := protocol.ID(fmt.Sprintf("proto-%d", j)) go func() { defer wg.Done() + + // make sure the bandwidth counters are active + bwc.LogSentMessage(100) + bwc.LogRecvMessage(50) + bwc.LogSentMessageStream(100, proto, p) + bwc.LogRecvMessageStream(50, proto, p) + <-start t := time.NewTicker(100 * time.Millisecond) defer t.Stop() - for i := 0; i < 40; i++ { + for i := 0; i < 39; i++ { bwc.LogSentMessage(100) bwc.LogRecvMessage(50) bwc.LogSentMessageStream(100, proto, p) @@ -104,6 +111,7 @@ func TestBandwidthCounter(t *testing.T) { } } + time.Sleep(time.Second) close(start) time.Sleep(2*time.Second + 100*time.Millisecond) @@ -149,17 +157,25 @@ func TestResetBandwidthCounter(t *testing.T) { p := peer.ID("peer-0") proto := protocol.ID("proto-0") + // We don't calculate bandwidth till we've been active for a second. bwc.LogSentMessage(42) bwc.LogRecvMessage(24) bwc.LogSentMessageStream(100, proto, p) bwc.LogRecvMessageStream(50, proto, p) - time.Sleep(1 * time.Second) + time.Sleep(1*time.Second + time.Millisecond) + + bwc.LogSentMessage(42) + bwc.LogRecvMessage(24) + bwc.LogSentMessageStream(100, proto, p) + bwc.LogRecvMessageStream(50, proto, p) + + time.Sleep(1*time.Second + time.Millisecond) { stats := bwc.GetBandwidthTotals() - assertEq(t, 42, stats.TotalOut) - assertEq(t, 24, stats.TotalIn) + assertEq(t, 84, stats.TotalOut) + assertEq(t, 48, stats.TotalIn) } {