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 }