diff --git a/plugins/metrics/autopeering.go b/plugins/metrics/autopeering.go index de0fa3b2049fb11b2010b701ab679e4eb6bc08c2..7a20ac62cd59a8de6483da83eaa86a03a8e22306 100644 --- a/plugins/metrics/autopeering.go +++ b/plugins/metrics/autopeering.go @@ -7,6 +7,7 @@ import ( gossipPkg "github.com/iotaledger/goshimmer/packages/gossip" "github.com/iotaledger/hive.go/autopeering/selection" "github.com/iotaledger/hive.go/events" + "go.uber.org/atomic" ) var ( @@ -14,11 +15,12 @@ var ( neighborConnectionsLifeTime time.Duration neighborMutex sync.RWMutex - connectionsCount uint64 - sumDistance uint64 - minDistance = uint64(^uint32(0)) - maxDistance uint64 - distanceMutex sync.RWMutex + neighborConnectionsCount atomic.Uint64 + autopeeringConnectionsCount uint64 + sumDistance uint64 + minDistance = uint64(^uint32(0)) + maxDistance uint64 + distanceMutex sync.RWMutex ) var ( @@ -29,10 +31,14 @@ var ( neighborConnectionsLifeTime += time.Since(n.ConnectionEstablished()) }) + onNeighborAdded = events.NewClosure(func(_ *gossipPkg.Neighbor) { + neighborConnectionsCount.Inc() + }) + onAutopeeringSelection = events.NewClosure(func(ev *selection.PeeringEvent) { distanceMutex.Lock() defer distanceMutex.Unlock() - connectionsCount++ + autopeeringConnectionsCount++ distance := uint64(ev.Distance) if distance < minDistance { minDistance = distance @@ -61,11 +67,9 @@ func AvgNeighborConnectionLifeTime() float64 { return float64(neighborConnectionsLifeTime.Milliseconds()) / float64(neighborDropCount) } -// ConnectionsCount returns the neighbors connections count. -func ConnectionsCount() uint64 { - distanceMutex.RLock() - defer distanceMutex.RUnlock() - return connectionsCount +// NeighborConnectionsCount returns the neighbors connections count. +func NeighborConnectionsCount() uint64 { + return neighborConnectionsCount.Load() } // AutopeeringDistanceStats returns statistics of the autopeering distance function. @@ -73,10 +77,10 @@ func AutopeeringDistanceStats() (min, max uint64, avg float64) { distanceMutex.RLock() defer distanceMutex.RUnlock() min, max = minDistance, maxDistance - if connectionsCount == 0 { + if autopeeringConnectionsCount == 0 { avg = 0 return } - avg = float64(sumDistance) / float64(connectionsCount) + avg = float64(sumDistance) / float64(autopeeringConnectionsCount) return } diff --git a/plugins/metrics/plugin.go b/plugins/metrics/plugin.go index 0f51f900c700bb14e1f2149ca6f221862d674ba6..c7c295f17667e0167c1242f2d66395acfe70ec7c 100644 --- a/plugins/metrics/plugin.go +++ b/plugins/metrics/plugin.go @@ -130,6 +130,7 @@ func registerLocalMetrics() { })) gossip.Manager().Events().NeighborRemoved.Attach(onNeighborRemoved) + gossip.Manager().Events().NeighborAdded.Attach(onNeighborAdded) autopeering.Selection().Events().IncomingPeering.Attach(onAutopeeringSelection) autopeering.Selection().Events().OutgoingPeering.Attach(onAutopeeringSelection) diff --git a/plugins/prometheus/autopeering.go b/plugins/prometheus/autopeering.go index bb8c9971f92f5d85376efe48f1263df5bdd28b8e..bd4b743536de3063ab95c326bbf66023b99d6466 100644 --- a/plugins/prometheus/autopeering.go +++ b/plugins/prometheus/autopeering.go @@ -58,7 +58,7 @@ func registerAutopeeringMetrics() { func collectAutopeeringMetrics() { neighborDropCount.Set(float64(metrics.NeighborDropCount())) avgNeighborConnectionLifeTime.Set(metrics.AvgNeighborConnectionLifeTime()) - connectionsCount.Set(float64(metrics.ConnectionsCount())) + connectionsCount.Set(float64(metrics.NeighborConnectionsCount())) min, max, avg := metrics.AutopeeringDistanceStats() minDistance.Set(float64(min)) maxDistance.Set(float64(max))