1
0
Fork 0
forked from forks/go-ethereum

p2p: add metrics for inbound connection errors (#31652)

Add metics detailing reasons we reject inbound connections for, and
reasons these connections fail during the handshake.
This commit is contained in:
Csaba Kiraly 2025-05-07 15:34:52 +02:00 committed by GitHub
parent 3e356d69ef
commit 0d5de826da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 44 additions and 0 deletions

View file

@ -66,6 +66,18 @@ var (
// capture the rest of errors that are not handled by the above meters
dialOtherError = metrics.NewRegisteredMeter("p2p/dials/error/other", nil)
// handshake error meters for inbound connections
serveTooManyPeers = metrics.NewRegisteredMeter("p2p/serves/error/saturated", nil)
serveAlreadyConnected = metrics.NewRegisteredMeter("p2p/serves/error/known", nil)
serveSelf = metrics.NewRegisteredMeter("p2p/serves/error/self", nil)
serveUselessPeer = metrics.NewRegisteredMeter("p2p/serves/error/useless", nil)
serveUnexpectedIdentity = metrics.NewRegisteredMeter("p2p/serves/error/id/unexpected", nil)
serveEncHandshakeError = metrics.NewRegisteredMeter("p2p/serves/error/rlpx/enc", nil) //EOF; connection reset during handshake; (message too big?)
serveProtoHandshakeError = metrics.NewRegisteredMeter("p2p/serves/error/rlpx/proto", nil)
// capture the rest of errors that are not handled by the above meters
serveOtherError = metrics.NewRegisteredMeter("p2p/serves/error/other", nil)
)
// markDialError matches errors that occur while setting up a dial connection to the
@ -99,6 +111,36 @@ func markDialError(err error) {
}
}
// markServeError matches errors that occur while serving an inbound connection
// to the corresponding meter.
func markServeError(err error) {
if !metrics.Enabled() {
return
}
var reason DiscReason
var handshakeErr *protoHandshakeError
d := errors.As(err, &reason)
switch {
case d && reason == DiscTooManyPeers:
serveTooManyPeers.Mark(1)
case d && reason == DiscAlreadyConnected:
serveAlreadyConnected.Mark(1)
case d && reason == DiscSelf:
serveSelf.Mark(1)
case d && reason == DiscUselessPeer:
serveUselessPeer.Mark(1)
case d && reason == DiscUnexpectedIdentity:
serveUnexpectedIdentity.Mark(1)
case errors.As(err, &handshakeErr):
serveProtoHandshakeError.Mark(1)
case errors.Is(err, errEncHandshakeError):
serveEncHandshakeError.Mark(1)
default:
serveOtherError.Mark(1)
}
}
// meteredConn is a wrapper around a net.Conn that meters both the
// inbound and outbound network traffic.
type meteredConn struct {

View file

@ -864,6 +864,8 @@ func (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Node)
if err != nil {
if !c.is(inboundConn) {
markDialError(err)
} else {
markServeError(err)
}
c.close(err)
}