diff --git a/go.mod b/go.mod index a632955..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 diff --git a/go.sum b/go.sum index 6a06c8b..919e82c 100644 --- a/go.sum +++ b/go.sum @@ -66,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.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() +} diff --git a/metrics/bandwidth_test.go b/metrics/bandwidth_test.go index de7b0fd..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) @@ -143,6 +151,71 @@ func TestBandwidthCounter(t *testing.T) { } } +func TestResetBandwidthCounter(t *testing.T) { + bwc := NewBandwidthCounter() + + 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.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, 84, stats.TotalOut) + assertEq(t, 48, 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)