From fbdcdaefbbef2a1f68dc4215635e0054605ae4f1 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Wed, 21 Dec 2016 15:02:50 +0300 Subject: [PATCH] stats naive --- p2p/src/net/mod.rs | 2 + p2p/src/net/peer_context.rs | 7 ++++ p2p/src/net/stats.rs | 73 +++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 p2p/src/net/stats.rs diff --git a/p2p/src/net/mod.rs b/p2p/src/net/mod.rs index 196364e4..8a2248df 100644 --- a/p2p/src/net/mod.rs +++ b/p2p/src/net/mod.rs @@ -6,6 +6,7 @@ mod connection; mod connection_counter; mod connections; mod peer_context; +mod stats; pub use self::accept_connection::{AcceptConnection, accept_connection}; pub use self::channel::Channel; @@ -15,3 +16,4 @@ pub use self::connection::Connection; pub use self::connection_counter::ConnectionCounter; pub use self::connections::Connections; pub use self::peer_context::PeerContext; +pub use self::stats::PeerStats; diff --git a/p2p/src/net/peer_context.rs b/p2p/src/net/peer_context.rs index 74046fe0..b832f4aa 100644 --- a/p2p/src/net/peer_context.rs +++ b/p2p/src/net/peer_context.rs @@ -4,12 +4,14 @@ use message::{Payload, Message}; use p2p::Context; use util::{PeerInfo, ConfigurableSynchronizer, ResponseQueue, Synchronizer, Responses}; use futures::{lazy, finished}; +use net::PeerStats; pub struct PeerContext { context: Arc, info: PeerInfo, synchronizer: Mutex, response_queue: Mutex, + stats: Mutex, } impl PeerContext { @@ -19,6 +21,7 @@ impl PeerContext { info: info, synchronizer: Mutex::new(ConfigurableSynchronizer::new(synchronous)), response_queue: Mutex::default(), + stats: Mutex::default(), } } @@ -123,4 +126,8 @@ impl PeerContext { pub fn global(&self) -> &Arc { &self.context } + + pub fn stats(&self) -> &Mutex { + &self.stats + } } diff --git a/p2p/src/net/stats.rs b/p2p/src/net/stats.rs new file mode 100644 index 00000000..277f1d77 --- /dev/null +++ b/p2p/src/net/stats.rs @@ -0,0 +1,73 @@ +#[derive(Default, Clone)] +pub struct MessageStats { + pub addr: u64, + pub getdata: u64, + pub getheaders: u64, + pub headers: u64, + pub reject: u64, + pub tx: u64, + pub inv: u64, + pub ping: u64, + pub pong: u64, + pub verack: u64, + pub version: u64, +} + +#[derive(Default, Clone)] +pub struct PeerStats { + pub last_send: u32, + pub last_recv: u32, + pub total_send: u64, + pub total_recv: u64, + pub avg_ping: f64, + pub min_ping: f64, + pub synced_blocks: u32, + pub synced_headers: u32, + pub counter_send: MessageStats, + pub counter_recv: MessageStats, + pub bytes_send: MessageStats, + pub bytes_recv: MessageStats, +} + +macro_rules! impl_send { + ($msg: ident, $method_name: ident) => { + pub fn $method_name(&mut self, bytes: usize) { + self.last_send = ::time::get_time().sec as u32; + self.total_send += bytes as u64; + self.bytes_send.$msg += bytes as u64; + self.counter_send.$msg += bytes as u64; + } + } +} + +macro_rules! impl_recv { + ($msg: ident, $method_name: ident) => { + pub fn $method_name(&mut self, bytes: usize) { + self.last_recv = ::time::get_time().sec as u32; + self.total_recv += bytes as u64; + self.bytes_recv.$msg += bytes as u64; + self.counter_recv.$msg += bytes as u64; + } + } +} + +macro_rules! impl_both { + ($msg: ident, $method_send: ident, $method_recv: ident) => { + impl_send!($msg, $method_send); + impl_recv!($msg, $method_recv); + } +} + +impl PeerStats { + impl_both!(addr, send_addr, recv_addr); + impl_both!(getdata, send_getdata, recv_getdata); + impl_both!(getheaders, send_getheaders, recv_getheaders); + impl_both!(headers, send_headers, recv_headers); + impl_both!(reject, send_reject, recv_reject); + impl_both!(tx, send_tx, recv_tx); + impl_both!(inv, send_inv, recv_inv); + impl_both!(ping, send_ping, recv_ping); + impl_both!(pong, send_pong, recv_pong); + impl_both!(verack, send_verack, recv_verack); + impl_both!(version, send_version, recv_version); +}