mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-12 02:14:10 +00:00
Fix peer count metrics (#5404)
* Set the peers_per_client metrics directly, rather than using increment/decrement * Move PEERS_CONNECTED related update to the same place * Move PEERS_CONNECTED_MULTI related update to the same place * Rename * Remove unused variables
This commit is contained in:
@@ -26,6 +26,8 @@ pub use libp2p::identity::Keypair;
|
||||
#[allow(clippy::mutable_key_type)] // PeerId in hashmaps are no longer permitted by clippy
|
||||
pub mod peerdb;
|
||||
|
||||
use crate::peer_manager::peerdb::client::ClientKind;
|
||||
use libp2p::multiaddr;
|
||||
pub use peerdb::peer_info::{
|
||||
ConnectionDirection, PeerConnectionStatus, PeerConnectionStatus::*, PeerInfo,
|
||||
};
|
||||
@@ -33,6 +35,8 @@ use peerdb::score::{PeerAction, ReportSource};
|
||||
pub use peerdb::sync_status::{SyncInfo, SyncStatus};
|
||||
use std::collections::{hash_map::Entry, HashMap};
|
||||
use std::net::IpAddr;
|
||||
use strum::IntoEnumIterator;
|
||||
|
||||
pub mod config;
|
||||
mod network_behaviour;
|
||||
|
||||
@@ -464,19 +468,6 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
|
||||
"observed_address" => ?info.observed_addr,
|
||||
"protocols" => ?info.protocols
|
||||
);
|
||||
|
||||
// update the peer client kind metric if the peer is connected
|
||||
if matches!(
|
||||
peer_info.connection_status(),
|
||||
PeerConnectionStatus::Connected { .. }
|
||||
| PeerConnectionStatus::Disconnecting { .. }
|
||||
) {
|
||||
metrics::inc_gauge_vec(
|
||||
&metrics::PEERS_PER_CLIENT,
|
||||
&[peer_info.client().kind.as_ref()],
|
||||
);
|
||||
metrics::dec_gauge_vec(&metrics::PEERS_PER_CLIENT, &[previous_kind.as_ref()]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
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> {
|
||||
// start a ping and status timer for the peer
|
||||
self.status_peers.insert(*peer_id);
|
||||
|
||||
let connected_peers = self.network_globals.connected_peers() as i64;
|
||||
|
||||
// increment prometheus metrics
|
||||
metrics::inc_counter(&metrics::PEER_CONNECT_EVENT_COUNT);
|
||||
metrics::set_gauge(&metrics::PEERS_CONNECTED, connected_peers);
|
||||
|
||||
true
|
||||
}
|
||||
@@ -1267,6 +1255,70 @@ impl<TSpec: EthSpec> PeerManager<TSpec> {
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Update peer count related metrics.
|
||||
fn update_peer_count_metrics(&self) {
|
||||
let mut peers_connected = 0;
|
||||
let mut clients_per_peer = HashMap::new();
|
||||
let mut peers_connected_mutli: HashMap<(&str, &str), i32> = HashMap::new();
|
||||
|
||||
for (_, peer_info) in self.network_globals.peers.read().connected_peers() {
|
||||
peers_connected += 1;
|
||||
|
||||
*clients_per_peer
|
||||
.entry(peer_info.client().kind.to_string())
|
||||
.or_default() += 1;
|
||||
|
||||
let direction = match peer_info.connection_direction() {
|
||||
Some(ConnectionDirection::Incoming) => "inbound",
|
||||
Some(ConnectionDirection::Outgoing) => "outbound",
|
||||
None => "none",
|
||||
};
|
||||
// Note: the `transport` is set to `unknown` if the `listening_addresses` list is empty.
|
||||
// This situation occurs when the peer is initially registered in PeerDB, but the peer
|
||||
// info has not yet been updated at `PeerManager::identify`.
|
||||
let transport = peer_info
|
||||
.listening_addresses()
|
||||
.iter()
|
||||
.find_map(|addr| {
|
||||
addr.iter().find_map(|proto| match proto {
|
||||
multiaddr::Protocol::QuicV1 => Some("quic"),
|
||||
multiaddr::Protocol::Tcp(_) => Some("tcp"),
|
||||
_ => None,
|
||||
})
|
||||
})
|
||||
.unwrap_or("unknown");
|
||||
*peers_connected_mutli
|
||||
.entry((direction, transport))
|
||||
.or_default() += 1;
|
||||
}
|
||||
|
||||
// PEERS_CONNECTED
|
||||
metrics::set_gauge(&metrics::PEERS_CONNECTED, peers_connected);
|
||||
|
||||
// PEERS_PER_CLIENT
|
||||
for client_kind in ClientKind::iter() {
|
||||
let value = clients_per_peer.get(&client_kind.to_string()).unwrap_or(&0);
|
||||
metrics::set_gauge_vec(
|
||||
&metrics::PEERS_PER_CLIENT,
|
||||
&[client_kind.as_ref()],
|
||||
*value as i64,
|
||||
);
|
||||
}
|
||||
|
||||
// PEERS_CONNECTED_MULTI
|
||||
for direction in ["inbound", "outbound", "none"] {
|
||||
for transport in ["quic", "tcp", "unknown"] {
|
||||
metrics::set_gauge_vec(
|
||||
&metrics::PEERS_CONNECTED_MULTI,
|
||||
&[direction, transport],
|
||||
*peers_connected_mutli
|
||||
.get(&(direction, transport))
|
||||
.unwrap_or(&0) as i64,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum ConnectingType {
|
||||
|
||||
Reference in New Issue
Block a user