From bcc38873d754999207f847ce0a07233768207dc9 Mon Sep 17 00:00:00 2001 From: weiihann Date: Thu, 7 Dec 2023 12:13:39 +0800 Subject: [PATCH] p2p: add serve metrics --- p2p/metrics.go | 38 +++++++++++++++++++++++++++++++++++++- p2p/server.go | 2 ++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/p2p/metrics.go b/p2p/metrics.go index a6e36b91a8..c01a4be253 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -49,7 +49,7 @@ var ( dialSuccessMeter metrics.Meter = metrics.NilMeter{} dialConnectionError metrics.Meter = metrics.NilMeter{} - // handshake error meters + // dial error meters dialTooManyPeers = metrics.NewRegisteredMeter("p2p/dials/error/saturated", nil) dialAlreadyConnected = metrics.NewRegisteredMeter("p2p/dials/error/known", nil) dialSelf = metrics.NewRegisteredMeter("p2p/dials/error/self", nil) @@ -57,6 +57,15 @@ var ( dialUnexpectedIdentity = metrics.NewRegisteredMeter("p2p/dials/error/id/unexpected", nil) dialEncHandshakeError = metrics.NewRegisteredMeter("p2p/dials/error/rlpx/enc", nil) dialProtoHandshakeError = metrics.NewRegisteredMeter("p2p/dials/error/rlpx/proto", nil) + + // serve error meters + 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) + serveProtoHandshakeError = metrics.NewRegisteredMeter("p2p/serves/error/rlpx/proto", nil) ) func init() { @@ -99,6 +108,33 @@ func markDialError(err error) { } } +// markServeError matches errors that occur while setting up a serve connection +// to the corresponding meter. +func markServeError(err error) { + if !metrics.Enabled { + return + } + if err2 := errors.Unwrap(err); err2 != nil { + err = err2 + } + switch err { + case DiscTooManyPeers: + serveTooManyPeers.Mark(1) + case DiscAlreadyConnected: + serveAlreadyConnected.Mark(1) + case DiscSelf: + serveSelf.Mark(1) + case DiscUselessPeer: + serveUselessPeer.Mark(1) + case DiscUnexpectedIdentity: + serveUnexpectedIdentity.Mark(1) + case errEncHandshakeError: + serveEncHandshakeError.Mark(1) + case errProtoHandshakeError: + serveProtoHandshakeError.Mark(1) + } +} + // meteredConn is a wrapper around a net.Conn that meters both the // inbound and outbound network traffic. type meteredConn struct { diff --git a/p2p/server.go b/p2p/server.go index 0c6e0b7ee0..3eee8796a2 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -1003,6 +1003,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) }