go-libp2p-peerstore/metrics.go

59 lines
1.3 KiB
Go
Raw Normal View History

2016-06-01 02:31:50 +08:00
package peerstore
2015-10-01 06:42:55 +08:00
import (
"sync"
"time"
2016-06-01 02:31:50 +08:00
"github.com/libp2p/go-libp2p-core/peer"
2015-10-01 06:42:55 +08:00
)
2021-10-23 20:31:58 +08:00
// LatencyEWMASmoothing governs the decay of the EWMA (the speed
2015-10-01 06:42:55 +08:00
// at which it changes). This must be a normalized (0-1) value.
// 1 is 100% change, 0 is no change.
var LatencyEWMASmoothing = 0.1
type metrics struct {
2021-10-23 20:31:58 +08:00
mutex sync.RWMutex
2016-06-01 02:31:50 +08:00
latmap map[peer.ID]time.Duration
2015-10-01 06:42:55 +08:00
}
2016-10-05 09:01:51 +08:00
func NewMetrics() *metrics {
2015-10-01 06:42:55 +08:00
return &metrics{
2016-06-01 02:31:50 +08:00
latmap: make(map[peer.ID]time.Duration),
2015-10-01 06:42:55 +08:00
}
}
// RecordLatency records a new latency measurement
2016-06-01 02:31:50 +08:00
func (m *metrics) RecordLatency(p peer.ID, next time.Duration) {
2015-10-01 06:42:55 +08:00
nextf := float64(next)
s := LatencyEWMASmoothing
if s > 1 || s < 0 {
s = 0.1 // ignore the knob. it's broken. look, it jiggles.
}
2021-10-23 20:31:58 +08:00
m.mutex.Lock()
2015-10-01 06:42:55 +08:00
ewma, found := m.latmap[p]
ewmaf := float64(ewma)
if !found {
m.latmap[p] = next // when no data, just take it as the mean.
} else {
nextf = ((1.0 - s) * ewmaf) + (s * nextf)
m.latmap[p] = time.Duration(nextf)
}
2021-10-23 20:31:58 +08:00
m.mutex.Unlock()
2015-10-01 06:42:55 +08:00
}
// LatencyEWMA returns an exponentially-weighted moving avg.
// of all measurements of a peer's latency.
2016-06-01 02:31:50 +08:00
func (m *metrics) LatencyEWMA(p peer.ID) time.Duration {
2021-10-23 20:31:58 +08:00
m.mutex.RLock()
defer m.mutex.RUnlock()
return m.latmap[p]
}
func (m *metrics) RemovePeer(p peer.ID) {
m.mutex.Lock()
delete(m.latmap, p)
m.mutex.Unlock()
2015-10-01 06:42:55 +08:00
}