diff --git a/Cargo.lock b/Cargo.lock index f5ed7c2043..0a0ba14772 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3896,6 +3896,7 @@ dependencies = [ "indexmap 2.10.0", "proptest", "serde", + "snarkos-node-metrics", "snarkos-node-sync-locators", "snarkvm", "test-strategy 0.4.3", @@ -4065,6 +4066,7 @@ dependencies = [ "proptest", "serde", "snarkos-node-bft-events", + "snarkos-node-metrics", "snarkos-node-sync-locators", "snarkvm", "test-strategy 0.4.3", diff --git a/node/bft/events/Cargo.toml b/node/bft/events/Cargo.toml index 93160e1879..61908a3efa 100644 --- a/node/bft/events/Cargo.toml +++ b/node/bft/events/Cargo.toml @@ -18,7 +18,7 @@ edition = "2024" [features] default = [ ] -metrics = [ "snarkvm/metrics" ] +metrics = [ "dep:snarkos-node-metrics", "snarkvm/metrics" ] [dependencies.anyhow] workspace = true @@ -33,6 +33,10 @@ features = [ "serde", "rayon" ] [dependencies.serde] workspace = true +[dependencies.snarkos-node-metrics] +workspace = true +optional = true + [dependencies.snarkos-node-sync-locators] workspace = true diff --git a/node/bft/events/src/helpers/codec.rs b/node/bft/events/src/helpers/codec.rs index 62161e90eb..5a314f4a73 100644 --- a/node/bft/events/src/helpers/codec.rs +++ b/node/bft/events/src/helpers/codec.rs @@ -60,8 +60,17 @@ impl Encoder> for EventCodec { .map_err(|_| std::io::Error::new(std::io::ErrorKind::InvalidData, "serialization error"))?; let serialized_event = dst.split_to(dst.len()).freeze(); - - self.codec.encode(serialized_event, dst) + #[cfg(feature = "metrics")] + let num_bytes = serialized_event.len() as f64; + self.codec.encode(serialized_event, dst)?; + #[cfg(feature = "metrics")] + snarkvm::metrics::histogram_label( + snarkos_node_metrics::tcp::TCP_GATEWAY_EVENTS_OUTBOUND, + "event", + String::from(event.name().clone()), + num_bytes, + ); + Ok(()) } } @@ -75,11 +84,21 @@ impl Decoder for EventCodec { Some(bytes) => bytes, None => return Ok(None), }; - + #[cfg(feature = "metrics")] + let num_bytes = bytes.len() as f64; // Convert the bytes to an event, or fail if it is not valid. let reader = bytes.reader(); match Event::read_le(reader) { - Ok(event) => Ok(Some(event)), + Ok(event) => { + #[cfg(feature = "metrics")] + snarkvm::metrics::histogram_label( + snarkos_node_metrics::tcp::TCP_GATEWAY_EVENTS_INBOUND, + "event", + String::from(event.name().clone()), + num_bytes, + ); + Ok(Some(event)) + } Err(error) => { error!("Failed to deserialize an event: {}", error); Err(std::io::ErrorKind::InvalidData.into()) diff --git a/node/metrics/src/names.rs b/node/metrics/src/names.rs index bb98a6e2f9..6867cb2ab4 100644 --- a/node/metrics/src/names.rs +++ b/node/metrics/src/names.rs @@ -44,8 +44,15 @@ pub(super) const GAUGE_NAMES: [&str; 26] = [ tcp::TCP_TASKS, ]; -pub(super) const HISTOGRAM_NAMES: [&str; 3] = - [bft::COMMIT_ROUNDS_LATENCY, consensus::CERTIFICATE_COMMIT_LATENCY, consensus::BLOCK_LATENCY]; +pub(super) const HISTOGRAM_NAMES: [&str; 7] = [ + bft::COMMIT_ROUNDS_LATENCY, + consensus::CERTIFICATE_COMMIT_LATENCY, + consensus::BLOCK_LATENCY, + tcp::TCP_GATEWAY_EVENTS_OUTBOUND, + tcp::TCP_GATEWAY_EVENTS_INBOUND, + tcp::TCP_ROUTER_MESSAGES_OUTBOUND, + tcp::TCP_ROUTER_MESSAGES_INBOUND, +]; pub mod bft { pub const COMMIT_ROUNDS_LATENCY: &str = "snarkos_bft_commit_rounds_latency_secs"; // <-- This one doesn't even make sense. @@ -93,4 +100,8 @@ pub mod router { pub mod tcp { pub const TCP_TASKS: &str = "snarkos_tcp_tasks_total"; + pub const TCP_GATEWAY_EVENTS_OUTBOUND: &str = "snarkos_tcp_gateway_events_outbound"; + pub const TCP_GATEWAY_EVENTS_INBOUND: &str = "snarkos_tcp_gateway_events_inbound"; + pub const TCP_ROUTER_MESSAGES_OUTBOUND: &str = "snarkos_tcp_router_messages_outbound"; + pub const TCP_ROUTER_MESSAGES_INBOUND: &str = "snarkos_tcp_router_messages_inbound"; } diff --git a/node/router/messages/Cargo.toml b/node/router/messages/Cargo.toml index 72a161e429..18ad1ca9fc 100644 --- a/node/router/messages/Cargo.toml +++ b/node/router/messages/Cargo.toml @@ -19,6 +19,7 @@ edition = "2024" [features] default = [ ] test = [ ] +metrics = [ "dep:snarkos-node-metrics", "snarkvm/metrics" ] [dependencies.bytes] workspace = true @@ -29,6 +30,10 @@ workspace = true [dependencies.snarkos-node-bft-events] workspace = true +[dependencies.snarkos-node-metrics] +workspace = true +optional = true + [dependencies.snarkos-node-sync-locators] workspace = true diff --git a/node/router/messages/src/helpers/codec.rs b/node/router/messages/src/helpers/codec.rs index c83b56105e..8b3633b809 100644 --- a/node/router/messages/src/helpers/codec.rs +++ b/node/router/messages/src/helpers/codec.rs @@ -60,8 +60,17 @@ impl Encoder> for MessageCodec { .map_err(|_| std::io::Error::new(std::io::ErrorKind::InvalidData, "serialization error"))?; let serialized_message = dst.split_to(dst.len()).freeze(); - - self.codec.encode(serialized_message, dst) + #[cfg(feature = "metrics")] + let num_bytes = serialized_message.len() as f64; + self.codec.encode(serialized_message, dst)?; + #[cfg(feature = "metrics")] + snarkvm::metrics::histogram_label( + snarkos_node_metrics::tcp::TCP_ROUTER_MESSAGES_OUTBOUND, + "message", + String::from(message.name().clone()), + num_bytes, + ); + Ok(()) } } @@ -78,10 +87,22 @@ impl Decoder for MessageCodec { Self::Item::check_size(&bytes)?; + #[cfg(feature = "metrics")] + let num_bytes = bytes.len() as f64; + // Convert the bytes to a message, or fail if it is not valid. let reader = bytes.reader(); match Message::read_le(reader) { - Ok(message) => Ok(Some(message)), + Ok(message) => { + #[cfg(feature = "metrics")] + snarkvm::metrics::histogram_label( + snarkos_node_metrics::tcp::TCP_ROUTER_MESSAGES_INBOUND, + "message", + String::from(message.name().clone()), + num_bytes, + ); + Ok(Some(message)) + } Err(error) => { warn!("Failed to deserialize a message - {}", error); Err(std::io::ErrorKind::InvalidData.into())