Skip to content

Commit c4f2023

Browse files
authored
network: Add peers state metrics (starcoinorg#2980)
1 parent f559cff commit c4f2023

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

network-p2p/peerset/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
//! In addition, for each, set, the peerset also holds a list of reserved nodes towards which it
3333
//! will at all time try to maintain a connection with.
3434
35-
mod peersstate;
35+
pub mod peersstate;
3636

3737
use futures::prelude::*;
3838
use log::{debug, error, trace};
@@ -47,6 +47,7 @@ use std::{
4747
use std::{collections::HashSet, collections::VecDeque};
4848
use wasm_timer::Instant;
4949

50+
use crate::peersstate::PeersState;
5051
use futures::channel::oneshot;
5152
use futures::channel::oneshot::{Receiver, Sender};
5253
pub use libp2p::PeerId;
@@ -599,7 +600,9 @@ impl Peerset {
599600
}
600601
}
601602
}
602-
603+
pub fn get_peers_state(&self) -> PeersState {
604+
self.data.clone()
605+
}
603606
/// Indicate that we received an incoming connection. Must be answered either with
604607
/// a corresponding `Accept` or `Reject`, except if we were already connected to this peer.
605608
///

network-p2p/src/metrics.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub struct Metrics {
3232
pub requests_out_failure_total: UIntCounterVec,
3333
pub requests_out_success_total: HistogramVec,
3434
pub requests_out_started_total: UIntCounterVec,
35+
pub peerset_nodes: UIntGaugeVec,
3536
}
3637

3738
impl Metrics {
@@ -275,6 +276,13 @@ impl Metrics {
275276
)?,
276277
registry,
277278
)?,
279+
peerset_nodes: register(
280+
UIntGaugeVec::new(
281+
Opts::new("sub_libp2p_peerset_nodes", "nodes numbers in each peer set"),
282+
&["sets"],
283+
)?,
284+
registry,
285+
)?,
278286
})
279287
}
280288
}

network-p2p/src/protocol.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use libp2p::swarm::{IntoProtocolsHandler, ProtocolsHandler};
1717
use libp2p::swarm::{NetworkBehaviour, NetworkBehaviourAction, PollParameters};
1818
use libp2p::PeerId;
1919
use log::Level;
20-
use sc_peerset::SetId;
20+
use sc_peerset::{peersstate::PeersState, SetId};
2121
use starcoin_types::startup_info::{ChainInfo, ChainStatus};
2222
use std::borrow::Cow;
2323
use std::collections::{HashMap, HashSet};
@@ -447,7 +447,9 @@ impl Protocol {
447447
pub fn peerset_debug_info(&mut self) -> serde_json::Value {
448448
self.behaviour.peerset_debug_info()
449449
}
450-
450+
pub fn peerset_info(&self) -> PeersState {
451+
self.behaviour.peerset_info()
452+
}
451453
pub fn on_notify(
452454
&mut self,
453455
who: PeerId,

network-p2p/src/protocol/generic_proto/behaviour.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use libp2p::swarm::{
2929
use log::{debug, error, trace, warn};
3030
use parking_lot::RwLock;
3131
use rand::distributions::{Distribution as _, Uniform};
32+
use sc_peerset::peersstate::PeersState;
3233
use smallvec::SmallVec;
3334
use std::task::{Context, Poll};
3435
use std::{
@@ -643,7 +644,9 @@ impl GenericProto {
643644
pub fn peerset_debug_info(&mut self) -> serde_json::Value {
644645
self.peerset.debug_info()
645646
}
646-
647+
pub fn peerset_info(&self) -> PeersState {
648+
self.peerset.get_peers_state()
649+
}
647650
/// Function that is called when the peerset wants us to connect to a peer.
648651
fn peerset_report_connect(&mut self, peer_id: PeerId, set_id: sc_peerset::SetId) {
649652
// If `PeerId` is unknown to us, insert an entry, start dialing, and return early.

network-p2p/src/service.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ use libp2p::{kad::record, PeerId};
6969
use log::{error, info, trace, warn};
7070
use network_p2p_types::IfDisconnected;
7171
use parking_lot::Mutex;
72-
use sc_peerset::{PeersetHandle, ReputationChange};
72+
use sc_peerset::{peersstate, PeersetHandle, ReputationChange};
7373
use starcoin_metrics::{Histogram, HistogramVec};
7474
use starcoin_types::startup_info::ChainStatus;
7575
use std::collections::HashMap;
@@ -1510,6 +1510,29 @@ impl Future for NetworkWorker {
15101510
.connection_counters()
15111511
.num_pending() as u64,
15121512
);
1513+
let mut peers_state = this
1514+
.network_service
1515+
.behaviour_mut()
1516+
.user_protocol_mut()
1517+
.peerset_info();
1518+
for set_index in 0..peers_state.num_sets() {
1519+
let node_count = peers_state
1520+
.peers()
1521+
.cloned()
1522+
.collect::<Vec<_>>()
1523+
.into_iter()
1524+
.filter(|peer_id| {
1525+
matches!(
1526+
peers_state.peer(set_index, peer_id),
1527+
peersstate::Peer::Connected(_)
1528+
)
1529+
})
1530+
.count();
1531+
metrics
1532+
.peerset_nodes
1533+
.with_label_values(&[format!("set_{}", set_index).as_str()])
1534+
.set(node_count as u64)
1535+
}
15131536
}
15141537

15151538
Poll::Pending

0 commit comments

Comments
 (0)