@@ -26,13 +26,17 @@ pub use libp2p::identity::Keypair;
2626#[ allow( clippy:: mutable_key_type) ] // PeerId in hashmaps are no longer permitted by clippy
2727pub mod peerdb;
2828
29+ use crate :: peer_manager:: peerdb:: client:: ClientKind ;
30+ use libp2p:: multiaddr;
2931pub use peerdb:: peer_info:: {
3032 ConnectionDirection , PeerConnectionStatus , PeerConnectionStatus :: * , PeerInfo ,
3133} ;
3234use peerdb:: score:: { PeerAction , ReportSource } ;
3335pub use peerdb:: sync_status:: { SyncInfo , SyncStatus } ;
3436use std:: collections:: { hash_map:: Entry , HashMap } ;
3537use std:: net:: IpAddr ;
38+ use strum:: IntoEnumIterator ;
39+
3640pub mod config;
3741mod network_behaviour;
3842
@@ -464,19 +468,6 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
464468 "observed_address" => ?info. observed_addr,
465469 "protocols" => ?info. protocols
466470 ) ;
467-
468- // update the peer client kind metric if the peer is connected
469- if matches ! (
470- peer_info. connection_status( ) ,
471- PeerConnectionStatus :: Connected { .. }
472- | PeerConnectionStatus :: Disconnecting { .. }
473- ) {
474- metrics:: inc_gauge_vec (
475- & metrics:: PEERS_PER_CLIENT ,
476- & [ peer_info. client ( ) . kind . as_ref ( ) ] ,
477- ) ;
478- metrics:: dec_gauge_vec ( & metrics:: PEERS_PER_CLIENT , & [ previous_kind. as_ref ( ) ] ) ;
479- }
480471 }
481472 } else {
482473 error ! ( self . log, "Received an Identify response from an unknown peer" ; "peer_id" => peer_id. to_string( ) ) ;
@@ -812,11 +803,8 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
812803 // start a ping and status timer for the peer
813804 self . status_peers . insert ( * peer_id) ;
814805
815- let connected_peers = self . network_globals . connected_peers ( ) as i64 ;
816-
817806 // increment prometheus metrics
818807 metrics:: inc_counter ( & metrics:: PEER_CONNECT_EVENT_COUNT ) ;
819- metrics:: set_gauge ( & metrics:: PEERS_CONNECTED , connected_peers) ;
820808
821809 true
822810 }
@@ -1267,6 +1255,70 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
12671255 ) ;
12681256 }
12691257 }
1258+
1259+ // Update peer count related metrics.
1260+ fn update_peer_count_metrics ( & self ) {
1261+ let mut peers_connected = 0 ;
1262+ let mut clients_per_peer = HashMap :: new ( ) ;
1263+ let mut peers_connected_mutli: HashMap < ( & str , & str ) , i32 > = HashMap :: new ( ) ;
1264+
1265+ for ( _, peer_info) in self . network_globals . peers . read ( ) . connected_peers ( ) {
1266+ peers_connected += 1 ;
1267+
1268+ * clients_per_peer
1269+ . entry ( peer_info. client ( ) . kind . to_string ( ) )
1270+ . or_default ( ) += 1 ;
1271+
1272+ let direction = match peer_info. connection_direction ( ) {
1273+ Some ( ConnectionDirection :: Incoming ) => "inbound" ,
1274+ Some ( ConnectionDirection :: Outgoing ) => "outbound" ,
1275+ None => "none" ,
1276+ } ;
1277+ // Note: the `transport` is set to `unknown` if the `listening_addresses` list is empty.
1278+ // This situation occurs when the peer is initially registered in PeerDB, but the peer
1279+ // info has not yet been updated at `PeerManager::identify`.
1280+ let transport = peer_info
1281+ . listening_addresses ( )
1282+ . iter ( )
1283+ . find_map ( |addr| {
1284+ addr. iter ( ) . find_map ( |proto| match proto {
1285+ multiaddr:: Protocol :: QuicV1 => Some ( "quic" ) ,
1286+ multiaddr:: Protocol :: Tcp ( _) => Some ( "tcp" ) ,
1287+ _ => None ,
1288+ } )
1289+ } )
1290+ . unwrap_or ( "unknown" ) ;
1291+ * peers_connected_mutli
1292+ . entry ( ( direction, transport) )
1293+ . or_default ( ) += 1 ;
1294+ }
1295+
1296+ // PEERS_CONNECTED
1297+ metrics:: set_gauge ( & metrics:: PEERS_CONNECTED , peers_connected) ;
1298+
1299+ // PEERS_PER_CLIENT
1300+ for client_kind in ClientKind :: iter ( ) {
1301+ let value = clients_per_peer. get ( & client_kind. to_string ( ) ) . unwrap_or ( & 0 ) ;
1302+ metrics:: set_gauge_vec (
1303+ & metrics:: PEERS_PER_CLIENT ,
1304+ & [ client_kind. as_ref ( ) ] ,
1305+ * value as i64 ,
1306+ ) ;
1307+ }
1308+
1309+ // PEERS_CONNECTED_MULTI
1310+ for direction in [ "inbound" , "outbound" , "none" ] {
1311+ for transport in [ "quic" , "tcp" , "unknown" ] {
1312+ metrics:: set_gauge_vec (
1313+ & metrics:: PEERS_CONNECTED_MULTI ,
1314+ & [ direction, transport] ,
1315+ * peers_connected_mutli
1316+ . get ( & ( direction, transport) )
1317+ . unwrap_or ( & 0 ) as i64 ,
1318+ ) ;
1319+ }
1320+ }
1321+ }
12701322}
12711323
12721324enum ConnectingType {
0 commit comments