iuna

iuna - experimental devnet protocol
git clone https://iuna.jhx.app/git/iuna.git
Log | Files | Refs | README | LICENSE

metrics.rs (6373B)


      1 use std::sync::{
      2     Mutex as StdMutex,
      3     atomic::{AtomicU64, Ordering},
      4 };
      5 
      6 use serde::Serialize;
      7 
      8 #[derive(Default)]
      9 pub(super) struct P2pMetricsCounters {
     10     pub(super) inbound_sessions_started: AtomicU64,
     11     pub(super) inbound_sessions_rejected: AtomicU64,
     12     pub(super) outbound_connect_attempts: AtomicU64,
     13     pub(super) outbound_connect_successes: AtomicU64,
     14     pub(super) outbound_connect_failures: AtomicU64,
     15     pub(super) outbound_sessions_started: AtomicU64,
     16     pub(super) sessions_closed: AtomicU64,
     17     pub(super) session_failures: AtomicU64,
     18     pub(super) quiet_disconnects: AtomicU64,
     19     pub(super) envelopes_received: AtomicU64,
     20     pub(super) hello_envelopes_received: AtomicU64,
     21     pub(super) peer_status_envelopes_received: AtomicU64,
     22     pub(super) inventory_envelopes_received: AtomicU64,
     23     pub(super) data_envelopes_received: AtomicU64,
     24     pub(super) blinded_transaction_envelopes_received: AtomicU64,
     25     pub(super) blinded_transactions_received: AtomicU64,
     26     pub(super) blinded_reveal_envelopes_received: AtomicU64,
     27     pub(super) blinded_reveals_received: AtomicU64,
     28     pub(super) control_envelopes_received: AtomicU64,
     29     pub(super) bytes_received: AtomicU64,
     30     pub(super) parse_errors: AtomicU64,
     31     pub(super) empty_frames: AtomicU64,
     32     pub(super) self_peer_rejections: AtomicU64,
     33     pub(super) self_peer_skips: AtomicU64,
     34     pub(super) outbound_queue_full: AtomicU64,
     35     pub(super) outbound_queue_closed: AtomicU64,
     36     pub(super) last_session_failure: StdMutex<Option<String>>,
     37     pub(super) last_empty_frame_remote: StdMutex<Option<String>>,
     38     pub(super) last_parse_error: StdMutex<Option<String>>,
     39 }
     40 
     41 #[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
     42 pub struct P2pMetrics {
     43     pub inbound_sessions_started: u64,
     44     pub inbound_sessions_rejected: u64,
     45     pub outbound_connect_attempts: u64,
     46     pub outbound_connect_successes: u64,
     47     pub outbound_connect_failures: u64,
     48     pub outbound_sessions_started: u64,
     49     pub sessions_closed: u64,
     50     pub session_failures: u64,
     51     pub quiet_disconnects: u64,
     52     pub envelopes_received: u64,
     53     pub hello_envelopes_received: u64,
     54     pub peer_status_envelopes_received: u64,
     55     pub inventory_envelopes_received: u64,
     56     pub data_envelopes_received: u64,
     57     pub blinded_transaction_envelopes_received: u64,
     58     pub blinded_transactions_received: u64,
     59     pub blinded_reveal_envelopes_received: u64,
     60     pub blinded_reveals_received: u64,
     61     pub control_envelopes_received: u64,
     62     pub bytes_received: u64,
     63     pub parse_errors: u64,
     64     pub empty_frames: u64,
     65     pub self_peer_rejections: u64,
     66     pub self_peer_skips: u64,
     67     pub outbound_queue_full: u64,
     68     pub outbound_queue_closed: u64,
     69     pub last_session_failure: Option<String>,
     70     pub last_empty_frame_remote: Option<String>,
     71     pub last_parse_error: Option<String>,
     72 }
     73 
     74 impl P2pMetricsCounters {
     75     pub(super) fn inc(counter: &AtomicU64) {
     76         counter.fetch_add(1, Ordering::Relaxed);
     77     }
     78 
     79     pub(super) fn add(counter: &AtomicU64, amount: u64) {
     80         counter.fetch_add(amount, Ordering::Relaxed);
     81     }
     82 
     83     pub(super) fn set_last(target: &StdMutex<Option<String>>, value: impl Into<String>) {
     84         if let Ok(mut last) = target.lock() {
     85             *last = Some(value.into());
     86         }
     87     }
     88 
     89     pub(super) fn snapshot(&self) -> P2pMetrics {
     90         P2pMetrics {
     91             inbound_sessions_started: self.inbound_sessions_started.load(Ordering::Relaxed),
     92             inbound_sessions_rejected: self.inbound_sessions_rejected.load(Ordering::Relaxed),
     93             outbound_connect_attempts: self.outbound_connect_attempts.load(Ordering::Relaxed),
     94             outbound_connect_successes: self.outbound_connect_successes.load(Ordering::Relaxed),
     95             outbound_connect_failures: self.outbound_connect_failures.load(Ordering::Relaxed),
     96             outbound_sessions_started: self.outbound_sessions_started.load(Ordering::Relaxed),
     97             sessions_closed: self.sessions_closed.load(Ordering::Relaxed),
     98             session_failures: self.session_failures.load(Ordering::Relaxed),
     99             quiet_disconnects: self.quiet_disconnects.load(Ordering::Relaxed),
    100             envelopes_received: self.envelopes_received.load(Ordering::Relaxed),
    101             hello_envelopes_received: self.hello_envelopes_received.load(Ordering::Relaxed),
    102             peer_status_envelopes_received: self
    103                 .peer_status_envelopes_received
    104                 .load(Ordering::Relaxed),
    105             inventory_envelopes_received: self.inventory_envelopes_received.load(Ordering::Relaxed),
    106             data_envelopes_received: self.data_envelopes_received.load(Ordering::Relaxed),
    107             blinded_transaction_envelopes_received: self
    108                 .blinded_transaction_envelopes_received
    109                 .load(Ordering::Relaxed),
    110             blinded_transactions_received: self
    111                 .blinded_transactions_received
    112                 .load(Ordering::Relaxed),
    113             blinded_reveal_envelopes_received: self
    114                 .blinded_reveal_envelopes_received
    115                 .load(Ordering::Relaxed),
    116             blinded_reveals_received: self.blinded_reveals_received.load(Ordering::Relaxed),
    117             control_envelopes_received: self.control_envelopes_received.load(Ordering::Relaxed),
    118             bytes_received: self.bytes_received.load(Ordering::Relaxed),
    119             parse_errors: self.parse_errors.load(Ordering::Relaxed),
    120             empty_frames: self.empty_frames.load(Ordering::Relaxed),
    121             self_peer_rejections: self.self_peer_rejections.load(Ordering::Relaxed),
    122             self_peer_skips: self.self_peer_skips.load(Ordering::Relaxed),
    123             outbound_queue_full: self.outbound_queue_full.load(Ordering::Relaxed),
    124             outbound_queue_closed: self.outbound_queue_closed.load(Ordering::Relaxed),
    125             last_session_failure: self
    126                 .last_session_failure
    127                 .lock()
    128                 .ok()
    129                 .and_then(|last| last.clone()),
    130             last_empty_frame_remote: self
    131                 .last_empty_frame_remote
    132                 .lock()
    133                 .ok()
    134                 .and_then(|last| last.clone()),
    135             last_parse_error: self
    136                 .last_parse_error
    137                 .lock()
    138                 .ok()
    139                 .and_then(|last| last.clone()),
    140         }
    141     }
    142 }