1
0
Fork 0
forked from forks/go-ethereum

p2p: better dial/serve success metrics (#31629)

Our previous success metrics gave success even if a peer disconnected
right after connection. These metrics only count peers that stayed
connected for at least 1 min. The 1 min limit is an arbitrary choice. We do
not use this for decision logic, only statistics.
This commit is contained in:
Csaba Kiraly 2025-04-14 10:13:45 +02:00 committed by GitHub
parent 80753ba147
commit ecd5c18610
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 0 deletions

View file

@ -51,6 +51,10 @@ var (
dialSuccessMeter = metrics.NewRegisteredMeter("p2p/dials/success", nil)
dialConnectionError = metrics.NewRegisteredMeter("p2p/dials/error/connection", nil)
// count peers that stayed connected for at least 1 min
serve1MinSuccessMeter = metrics.NewRegisteredMeter("p2p/serves/success/1min", nil)
dial1MinSuccessMeter = metrics.NewRegisteredMeter("p2p/dials/success/1min", nil)
// handshake error meters
dialTooManyPeers = metrics.NewRegisteredMeter("p2p/dials/error/saturated", nil)
dialAlreadyConnected = metrics.NewRegisteredMeter("p2p/dials/error/known", nil)

View file

@ -254,6 +254,8 @@ func (p *Peer) run() (remoteRequested bool, err error) {
p.wg.Add(2)
go p.readLoop(readErr)
go p.pingLoop()
live1min := time.NewTimer(1 * time.Minute)
defer live1min.Stop()
// Start all protocol handlers.
writeStart <- struct{}{}
@ -285,6 +287,12 @@ loop:
case err = <-p.disc:
reason = discReasonForError(err)
break loop
case <-live1min.C:
if p.Inbound() {
serve1MinSuccessMeter.Mark(1)
} else {
dial1MinSuccessMeter.Mark(1)
}
}
}