From 62a39464d7893cbb747f321c3bb662a0d939de14 Mon Sep 17 00:00:00 2001 From: Brooks Rady Date: Sun, 5 Apr 2020 17:30:43 +0100 Subject: feat(network): add accumlated usage (#155) * Add accumlated usage * Fixed a nasty performace leak * Fix a silly reverse-ordering bug * Address some feedback * Finished some reorganizing * Another silly reversal bug * Let the test cases run * Most tests are working * Fix some formatting that got left behind * Fix the rest of the tests * Add some new tests to cover the total mode * Whoops, a double newline --- src/display/components/display_bandwidth.rs | 20 ++- src/display/components/table.rs | 61 +++---- src/display/components/total_bandwidth.rs | 13 +- src/display/ui.rs | 4 +- src/display/ui_state.rs | 118 +++++++++---- src/main.rs | 3 + src/tests/cases/raw_mode.rs | 3 +- ...__multiple_connections_from_remote_address.snap | 2 +- ...ltiple_processes_with_multiple_connections.snap | 12 +- ...ode__one_process_with_multiple_connections.snap | 2 +- .../cases/snapshots/ui__basic_only_addresses.snap | 4 +- .../snapshots/ui__basic_only_connections.snap | 4 +- .../cases/snapshots/ui__basic_only_processes.snap | 4 +- src/tests/cases/snapshots/ui__basic_startup.snap | 6 +- .../snapshots/ui__bi_directional_traffic-2.snap | 2 +- .../snapshots/ui__bi_directional_traffic.snap | 6 +- .../ui__layout_full_width_under_30_height-2.snap | 4 +- .../ui__layout_full_width_under_30_height.snap | 4 +- .../ui__layout_under_120_width_full_height-2.snap | 6 +- .../ui__layout_under_120_width_full_height.snap | 6 +- ...__layout_under_120_width_under_30_height-2.snap | 4 +- ...ui__layout_under_120_width_under_30_height.snap | 4 +- ...multiple_connections_from_remote_address-2.snap | 2 +- ...__multiple_connections_from_remote_address.snap | 6 +- ...ts_of_traffic_from_different_connections-2.snap | 2 +- ...kets_of_traffic_from_different_connections.snap | 6 +- ...ackets_of_traffic_from_single_connection-2.snap | 2 +- ..._packets_of_traffic_from_single_connection.snap | 6 +- ...iple_processes_with_multiple_connections-2.snap | 6 +- ...ltiple_processes_with_multiple_connections.snap | 6 +- .../cases/snapshots/ui__no_resolve_mode-2.snap | 2 +- src/tests/cases/snapshots/ui__no_resolve_mode.snap | 2 +- .../snapshots/ui__one_packet_of_traffic-2.snap | 2 +- .../cases/snapshots/ui__one_packet_of_traffic.snap | 6 +- ...i__one_process_with_multiple_connections-2.snap | 2 +- .../ui__one_process_with_multiple_connections.snap | 6 +- .../cases/snapshots/ui__pause_by_space-2.snap | 2 +- src/tests/cases/snapshots/ui__pause_by_space.snap | 6 +- ...ustained_traffic_from_multiple_processes-2.snap | 2 +- ..._sustained_traffic_from_multiple_processes.snap | 2 +- ...c_from_multiple_processes_bi_directional-2.snap | 2 +- ...fic_from_multiple_processes_bi_directional.snap | 2 +- ..._multiple_processes_bi_directional_total-2.snap | 55 ++++++ ...om_multiple_processes_bi_directional_total.snap | 55 ++++++ ...ed_traffic_from_multiple_processes_total-2.snap | 55 ++++++ ...ined_traffic_from_multiple_processes_total.snap | 55 ++++++ .../ui__sustained_traffic_from_one_process-2.snap | 2 +- .../ui__sustained_traffic_from_one_process.snap | 2 +- ...sustained_traffic_from_one_process_total-2.snap | 55 ++++++ ...__sustained_traffic_from_one_process_total.snap | 55 ++++++ .../snapshots/ui__traffic_with_host_names-2.snap | 2 +- .../snapshots/ui__traffic_with_host_names.snap | 2 +- .../snapshots/ui__traffic_with_winch_event-3.snap | 2 +- .../snapshots/ui__traffic_with_winch_event.snap | 6 +- .../snapshots/ui__truncate_long_hostnames-2.snap | 2 +- .../snapshots/ui__truncate_long_hostnames.snap | 2 +- .../ui__two_packets_only_addresses-2.snap | 2 +- .../snapshots/ui__two_packets_only_addresses.snap | 4 +- .../ui__two_packets_only_connections-2.snap | 2 +- .../ui__two_packets_only_connections.snap | 4 +- .../ui__two_packets_only_processes-2.snap | 2 +- .../snapshots/ui__two_packets_only_processes.snap | 4 +- .../ui__two_windows_split_horizontally.snap | 6 +- .../ui__two_windows_split_vertically.snap | 4 +- src/tests/cases/test_utils.rs | 1 + src/tests/cases/ui.rs | 195 ++++++++++++++++++++- 66 files changed, 757 insertions(+), 181 deletions(-) create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_multiple_processes_bi_directional_total-2.snap create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_multiple_processes_bi_directional_total.snap create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_multiple_processes_total-2.snap create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_multiple_processes_total.snap create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_one_process_total-2.snap create mode 100644 src/tests/cases/snapshots/ui__sustained_traffic_from_one_process_total.snap (limited to 'src') diff --git a/src/display/components/display_bandwidth.rs b/src/display/components/display_bandwidth.rs index 31653e6..dcc204c 100644 --- a/src/display/components/display_bandwidth.rs +++ b/src/display/components/display_bandwidth.rs @@ -1,17 +1,21 @@ use ::std::fmt; -pub struct DisplayBandwidth(pub f64); +pub struct DisplayBandwidth { + pub bandwidth: f64, + pub as_rate: bool, +} impl fmt::Display for DisplayBandwidth { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if self.0 > 999_999_999.0 { - write!(f, "{:.2}GBps", self.0 / 1_000_000_000.0) - } else if self.0 > 999_999.0 { - write!(f, "{:.2}MBps", self.0 / 1_000_000.0) - } else if self.0 > 999.0 { - write!(f, "{:.2}KBps", self.0 / 1000.0) + let suffix = if self.as_rate { "ps" } else { "" }; + if self.bandwidth > 999_999_999.0 { + write!(f, "{:.2}GB{}", self.bandwidth / 1_000_000_000.0, suffix) + } else if self.bandwidth > 999_999.0 { + write!(f, "{:.2}MB{}", self.bandwidth / 1_000_000.0, suffix) + } else if self.bandwidth > 999.0 { + write!(f, "{:.2}KB{}", self.bandwidth / 1000.0, suffix) } else { - write!(f, "{}Bps", self.0) + write!(f, "{}B{}", self.bandwidth, suffix) } } } diff --git a/src/display/components/table.rs b/src/display/components/table.rs index 5786106..059b5ed 100644 --- a/src/display/components/table.rs +++ b/src/display/components/table.rs @@ -10,35 +10,21 @@ use crate::display::{Bandwidth, DisplayBandwidth, UIState}; use crate::network::{display_connection_string, display_ip_or_host}; use ::std::net::IpAddr; -use std::iter::FromIterator; -fn display_upload_and_download(bandwidth: &impl Bandwidth) -> String { +fn display_upload_and_download(bandwidth: &impl Bandwidth, total: bool) -> String { format!( "{} / {}", - DisplayBandwidth(bandwidth.get_total_bytes_uploaded() as f64), - DisplayBandwidth(bandwidth.get_total_bytes_downloaded() as f64) + DisplayBandwidth { + bandwidth: bandwidth.get_total_bytes_uploaded() as f64, + as_rate: !total, + }, + DisplayBandwidth { + bandwidth: bandwidth.get_total_bytes_downloaded() as f64, + as_rate: !total, + }, ) } -fn sort_by_bandwidth<'a, T>( - list: &'a mut Vec<(T, &impl Bandwidth)>, -) -> &'a Vec<(T, &'a impl Bandwidth)> { - list.sort_by(|(_, a), (_, b)| { - let a_highest = if a.get_total_bytes_downloaded() > a.get_total_bytes_uploaded() { - a.get_total_bytes_downloaded() - } else { - a.get_total_bytes_uploaded() - }; - let b_highest = if b.get_total_bytes_downloaded() > b.get_total_bytes_uploaded() { - b.get_total_bytes_downloaded() - } else { - b.get_total_bytes_uploaded() - }; - b_highest.cmp(&a_highest) - }); - list -} - pub enum ColumnCount { Two, Three, @@ -77,9 +63,8 @@ fn truncate_middle(row: &str, max_length: u16) -> String { impl<'a> Table<'a> { pub fn create_connections_table(state: &UIState, ip_to_host: &HashMap) -> Self { - let mut connections_list = Vec::from_iter(&state.connections); - sort_by_bandwidth(&mut connections_list); - let connections_rows = connections_list + let connections_rows = state + .connections .iter() .map(|(connection, connection_data)| { vec![ @@ -89,12 +74,12 @@ impl<'a> Table<'a> { &connection_data.interface_name, ), connection_data.process_name.to_string(), - display_upload_and_download(*connection_data), + display_upload_and_download(connection_data, state.cumulative_mode), ] }) .collect(); let connections_title = "Utilization by connection"; - let connections_column_names = &["Connection", "Process", "Rate Up / Down"]; + let connections_column_names = &["Connection", "Process", "Up / Down"]; let mut breakpoints = BTreeMap::new(); breakpoints.insert( 0, @@ -132,20 +117,19 @@ impl<'a> Table<'a> { } } pub fn create_processes_table(state: &UIState) -> Self { - let mut processes_list = Vec::from_iter(&state.processes); - sort_by_bandwidth(&mut processes_list); - let processes_rows = processes_list + let processes_rows = state + .processes .iter() .map(|(process_name, data_for_process)| { vec![ (*process_name).to_string(), data_for_process.connection_count.to_string(), - display_upload_and_download(*data_for_process), + display_upload_and_download(data_for_process, state.cumulative_mode), ] }) .collect(); let processes_title = "Utilization by process name"; - let processes_column_names = &["Process", "Connections", "Rate Up / Down"]; + let processes_column_names = &["Process", "Connections", "Up / Down"]; let mut breakpoints = BTreeMap::new(); breakpoints.insert( 0, @@ -186,21 +170,20 @@ impl<'a> Table<'a> { state: &UIState, ip_to_host: &HashMap, ) -> Self { - let mut remote_addresses_list = Vec::from_iter(&state.remote_addresses); - sort_by_bandwidth(&mut remote_addresses_list); - let remote_addresses_rows = remote_addresses_list + let remote_addresses_rows = state + .remote_addresses .iter() .map(|(remote_address, data_for_remote_address)| { - let remote_address = display_ip_or_host(**remote_address, &ip_to_host); + let remote_address = display_ip_or_host(*remote_address, &ip_to_host); vec![ remote_address, data_for_remote_address.connection_count.to_string(), - display_upload_and_download(*data_for_remote_address), + display_upload_and_download(data_for_remote_address, state.cumulative_mode), ] }) .collect(); let remote_addresses_title = "Utilization by remote address"; - let remote_addresses_column_names = &["Remote Address", "Connections", "Rate Up / Down"]; + let remote_addresses_column_names = &["Remote Address", "Connections", "Up / Down"]; let mut breakpoints = BTreeMap::new(); breakpoints.insert( 0, diff --git a/src/display/components/total_bandwidth.rs b/src/display/components/total_bandwidth.rs index 4a7ae9d..80d892f 100644 --- a/src/display/components/total_bandwidth.rs +++ b/src/display/components/total_bandwidth.rs @@ -13,6 +13,7 @@ pub struct TotalBandwidth<'a> { impl<'a> TotalBandwidth<'a> { pub fn render(&self, frame: &mut Frame, rect: Rect) { + let c_mode = self.state.cumulative_mode; let title_text = { let paused_str = if self.paused { "[PAUSED]" } else { "" }; let color = if self.paused { @@ -23,9 +24,15 @@ impl<'a> TotalBandwidth<'a> { [Text::styled( format!( - " Total Rate Up / Down: {} / {} {}", - DisplayBandwidth(self.state.total_bytes_uploaded as f64), - DisplayBandwidth(self.state.total_bytes_downloaded as f64), + " Total Up / Down: {} / {} {}", + DisplayBandwidth { + bandwidth: self.state.total_bytes_uploaded as f64, + as_rate: !c_mode, + }, + DisplayBandwidth { + bandwidth: self.state.total_bytes_downloaded as f64, + as_rate: !c_mode, + }, paused_str ), Style::default().fg(color).modifier(Modifier::BOLD), diff --git a/src/display/ui.rs b/src/display/ui.rs index 4530664..68f133a 100644 --- a/src/display/ui.rs +++ b/src/display/ui.rs @@ -30,9 +30,11 @@ where let mut terminal = Terminal::new(terminal_backend).unwrap(); terminal.clear().unwrap(); terminal.hide_cursor().unwrap(); + let mut state: UIState = Default::default(); + state.cumulative_mode = opts.total_utilization; Ui { terminal, - state: Default::default(), + state, ip_to_host: Default::default(), opts, } diff --git a/src/display/ui_state.rs b/src/display/ui_state.rs index 4edd142..a65e610 100644 --- a/src/display/ui_state.rs +++ b/src/display/ui_state.rs @@ -1,23 +1,29 @@ -use ::std::collections::{BTreeMap, HashMap, HashSet, VecDeque}; +use ::std::cmp; +use ::std::collections::{HashMap, HashSet, VecDeque}; +use ::std::hash::Hash; +use ::std::iter::FromIterator; use ::std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use crate::network::{Connection, LocalSocket, Utilization}; static RECALL_LENGTH: usize = 5; +static MAX_BANDWIDTH_ITEMS: usize = 1000; pub trait Bandwidth { fn get_total_bytes_downloaded(&self) -> u128; fn get_total_bytes_uploaded(&self) -> u128; + fn combine_bandwidth(&mut self, other: &Self); + fn divide_by(&mut self, amount: u128); } -#[derive(Default)] +#[derive(Clone, Default)] pub struct NetworkData { pub total_bytes_downloaded: u128, pub total_bytes_uploaded: u128, pub connection_count: u128, } -#[derive(Default)] +#[derive(Clone, Default)] pub struct ConnectionData { pub total_bytes_downloaded: u128, pub total_bytes_uploaded: u128, @@ -25,35 +31,38 @@ pub struct ConnectionData { pub interface_name: String, } -impl NetworkData { - pub fn divide_by(&mut self, amount: u128) { - self.total_bytes_downloaded /= amount; - self.total_bytes_uploaded /= amount; +impl Bandwidth for NetworkData { + fn get_total_bytes_downloaded(&self) -> u128 { + self.total_bytes_downloaded } -} - -impl ConnectionData { - pub fn divide_by(&mut self, amount: u128) { + fn get_total_bytes_uploaded(&self) -> u128 { + self.total_bytes_uploaded + } + fn combine_bandwidth(&mut self, other: &NetworkData) { + self.total_bytes_downloaded += other.get_total_bytes_downloaded(); + self.total_bytes_uploaded += other.get_total_bytes_uploaded(); + self.connection_count = other.connection_count; + } + fn divide_by(&mut self, amount: u128) { self.total_bytes_downloaded /= amount; self.total_bytes_uploaded /= amount; } } impl Bandwidth for ConnectionData { - fn get_total_bytes_uploaded(&self) -> u128 { - self.total_bytes_uploaded - } fn get_total_bytes_downloaded(&self) -> u128 { self.total_bytes_downloaded } -} - -impl Bandwidth for NetworkData { fn get_total_bytes_uploaded(&self) -> u128 { self.total_bytes_uploaded } - fn get_total_bytes_downloaded(&self) -> u128 { - self.total_bytes_downloaded + fn combine_bandwidth(&mut self, other: &ConnectionData) { + self.total_bytes_downloaded += other.get_total_bytes_downloaded(); + self.total_bytes_uploaded += other.get_total_bytes_uploaded(); + } + fn divide_by(&mut self, amount: u128) { + self.total_bytes_downloaded /= amount; + self.total_bytes_uploaded /= amount; } } @@ -64,12 +73,16 @@ pub struct UtilizationData { #[derive(Default)] pub struct UIState { - pub processes: BTreeMap, - pub remote_addresses: BTreeMap, - pub connections: BTreeMap, + pub processes: Vec<(String, NetworkData)>, + pub remote_addresses: Vec<(IpAddr, NetworkData)>, + pub connections: Vec<(Connection, ConnectionData)>, pub total_bytes_downloaded: u128, pub total_bytes_uploaded: u128, + pub cumulative_mode: bool, utilization_data: VecDeque, + processes_map: HashMap, + remote_addresses_map: HashMap, + connections_map: HashMap, } impl UIState { @@ -105,9 +118,9 @@ impl UIState { if self.utilization_data.len() > RECALL_LENGTH { self.utilization_data.pop_front(); } - let mut processes: BTreeMap = BTreeMap::new(); - let mut remote_addresses: BTreeMap = BTreeMap::new(); - let mut connections: BTreeMap = BTreeMap::new(); + let mut processes: HashMap = HashMap::new(); + let mut remote_addresses: HashMap = HashMap::new(); + let mut connections: HashMap = HashMap::new(); let mut total_bytes_downloaded: u128 = 0; let mut total_bytes_uploaded: u128 = 0; @@ -115,6 +128,7 @@ impl UIState { for state in self.utilization_data.iter().rev() { let connections_to_procs = &state.connections_to_procs; let network_utilization = &state.network_utilization; + for (connection, connection_info) in &network_utilization.connections { let connection_previously_seen = !seen_connections.insert(connection); let connection_data = connections.entry(connection.clone()).or_default(); @@ -167,10 +181,54 @@ impl UIState { for (_, connection_data) in connections.iter_mut() { connection_data.divide_by(divide_by) } - self.processes = processes; - self.remote_addresses = remote_addresses; - self.connections = connections; - self.total_bytes_downloaded = total_bytes_downloaded / divide_by; - self.total_bytes_uploaded = total_bytes_uploaded / divide_by; + + if self.cumulative_mode { + merge_bandwidth(&mut self.processes_map, processes); + merge_bandwidth(&mut self.remote_addresses_map, remote_addresses); + merge_bandwidth(&mut self.connections_map, connections); + self.total_bytes_downloaded += total_bytes_downloaded / divide_by; + self.total_bytes_uploaded += total_bytes_uploaded / divide_by; + } else { + self.processes_map = processes; + self.remote_addresses_map = remote_addresses; + self.connections_map = connections; + self.total_bytes_downloaded = total_bytes_downloaded / divide_by; + self.total_bytes_uploaded = total_bytes_uploaded / divide_by; + } + self.processes = sort_and_prune(&mut self.processes_map); + self.remote_addresses = sort_and_prune(&mut self.remote_addresses_map); + self.connections = sort_and_prune(&mut self.connections_map); } } + +fn merge_bandwidth(self_map: &mut HashMap, other_map: HashMap) +where + K: Eq + Hash, + V: Bandwidth, +{ + for (key, b_other) in other_map { + self_map + .entry(key) + .and_modify(|b_self| b_self.combine_bandwidth(&b_other)) + .or_insert(b_other); + } +} + +fn sort_and_prune(map: &mut HashMap) -> Vec<(K, V)> +where + K: Eq + Hash + Clone, + V: Bandwidth + Clone, +{ + let mut bandwidth_list = Vec::from_iter(map.clone()); + bandwidth_list.sort_by_key(|(_, b)| { + cmp::Reverse(b.get_total_bytes_downloaded() + b.get_total_bytes_uploaded()) + }); + + if bandwidth_list.len() > MAX_BANDWIDTH_ITEMS { + for (key, _) in &bandwidth_list[MAX_BANDWIDTH_ITEMS..] { + map.remove(key); + } + } + + bandwidth_list +} diff --git a/src/main.rs b/src/main.rs index 77da318..d91430a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,6 +62,9 @@ pub struct RenderOpts { #[structopt(short, long)] /// Show remote addresses table only addresses: bool, + #[structopt(short, long)] + /// Show total (cumulative) usages + total_utilization: bool, } fn main() { diff --git a/src/tests/cases/raw_mode.rs b/src/tests/cases/raw_mode.rs index 8c51dfa..636abb1 100644 --- a/src/tests/cases/raw_mode.rs +++ b/src/tests/cases/raw_mode.rs @@ -207,7 +207,7 @@ fn multiple_processes_with_multiple_connections() { "10.0.0.2", 1337, 4435, - b"Awesome, I'm from 3.3.3.3", + b"Greetings traveller, I'm from 3.3.3.3", )), Some(build_tcp_packet( "2.2.2.2", @@ -581,6 +581,7 @@ fn no_resolve_mode() { addresses: false, connections: false, processes: false, + total_utilization: false, }, }; start(backend, os_input, opts); diff --git a/src/tests/cases/snapshots/raw_mode__multiple_connections_from_remote_address.snap b/src/tests/cases/snapshots/raw_mode__multiple_connections_from_remote_address.snap index 22cb71f..ee79f90 100644 --- a/src/tests/cases/snapshots/raw_mode__multiple_connections_from_remote_address.snap +++ b/src/tests/cases/snapshots/raw_mode__multiple_connections_from_remote_address.snap @@ -3,7 +3,7 @@ source: src/tests/cases/raw_mode.rs expression: formatted --- process: "1" up/down Bps: 0/47 connections: 2 -connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" connection: :443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/25 process: "1" +connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" remote_address: 1.1.1.1 up/down Bps: 0/47 connections: 2 diff --git a/src/tests/cases/snapshots/raw_mode__multiple_processes_with_multiple_connections.snap b/src/tests/cases/snapshots/raw_mode__multiple_processes_with_multiple_connections.snap index 609bbf5..6709ffd 100644 --- a/src/tests/cases/snapshots/raw_mode__multiple_processes_with_multiple_connections.snap +++ b/src/tests/cases/snapshots/raw_mode__multiple_processes_with_multiple_connections.snap @@ -2,16 +2,16 @@ source: src/tests/cases/raw_mode.rs expression: formatted --- +process: "5" up/down Bps: 0/28 connections: 1 +process: "4" up/down Bps: 0/26 connections: 1 process: "1" up/down Bps: 0/22 connections: 1 process: "2" up/down Bps: 0/21 connections: 1 -process: "4" up/down Bps: 0/26 connections: 1 -process: "5" up/down Bps: 0/22 connections: 1 -connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" +connection: :4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/28 process: "5" connection: :4434 => 2.2.2.2:54321 (tcp) up/down Bps: 0/26 process: "4" -connection: :4435 => 3.3.3.3:1337 (tcp) up/down Bps: 0/22 process: "5" +connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" connection: :4432 => 4.4.4.4:1337 (tcp) up/down Bps: 0/21 process: "2" -remote_address: 1.1.1.1 up/down Bps: 0/22 connections: 1 +remote_address: 3.3.3.3 up/down Bps: 0/28 connections: 1 remote_address: 2.2.2.2 up/down Bps: 0/26 connections: 1 -remote_address: 3.3.3.3 up/down Bps: 0/22 connections: 1 +remote_address: 1.1.1.1 up/down Bps: 0/22 connections: 1 remote_address: 4.4.4.4 up/down Bps: 0/21 connections: 1 diff --git a/src/tests/cases/snapshots/raw_mode__one_process_with_multiple_connections.snap b/src/tests/cases/snapshots/raw_mode__one_process_with_multiple_connections.snap index cf08105..cb3efff 100644 --- a/src/tests/cases/snapshots/raw_mode__one_process_with_multiple_connections.snap +++ b/src/tests/cases/snapshots/raw_mode__one_process_with_multiple_connections.snap @@ -3,7 +3,7 @@ source: src/tests/cases/raw_mode.rs expression: formatted --- process: "1" up/down Bps: 0/46 connections: 2 -connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" connection: :443 => 1.1.1.1:12346 (tcp) up/down Bps: 0/24 process: "1" +connection: :443 => 1.1.1.1:12345 (tcp) up/down Bps: 0/22 process: "1" remote_address: 1.1.1.1 up/down Bps: 0/46 connections: 2 diff --git a/src/tests/cases/snapshots/ui__basic_only_addresses.snap b/src/tests/cases/snapshots/ui__basic_only_addresses.snap index 3f875dd..98e855e 100644 --- a/src/tests/cases/snapshots/ui__basic_only_addresses.snap +++ b/src/tests/cases/snapshots/ui__basic_only_addresses.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by remote address───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Remote Address Connections Rate Up / Down │ +│Remote Address Connections Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__basic_only_connections.snap b/src/tests/cases/snapshots/ui__basic_only_connections.snap index 1fa5bb7..fa318b0 100644 --- a/src/tests/cases/snapshots/ui__basic_only_connections.snap +++ b/src/tests/cases/snapshots/ui__basic_only_connections.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by connection───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Connection Process Rate Up / Down │ +│Connection Process Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__basic_only_processes.snap b/src/tests/cases/snapshots/ui__basic_only_processes.snap index 0e1d4c2..d72fe63 100644 --- a/src/tests/cases/snapshots/ui__basic_only_processes.snap +++ b/src/tests/cases/snapshots/ui__basic_only_processes.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down │ +│Process Connections Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__basic_startup.snap b/src/tests/cases/snapshots/ui__basic_startup.snap index 0609187..7f3863a 100644 --- a/src/tests/cases/snapshots/ui__basic_startup.snap +++ b/src/tests/cases/snapshots/ui__basic_startup.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────┐┌Utilization by remote address────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down ││Remote Address Connections Rate Up / Down │ +│Process Connections Up / Down ││Remote Address Connections Up / Down │ │ ││ │ │ ││ │ │ ││ │ @@ -28,7 +28,7 @@ expression: "&terminal_draw_events_mirror[0]" │ ││ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘ ┌Utilization by connection───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Connection Process Rate Up / Down │ +│Connection Process Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__bi_directional_traffic-2.snap b/src/tests/cases/snapshots/ui__bi_directional_traffic-2.snap index cb9693b..dde1eb7 100644 --- a/src/tests/cases/snapshots/ui__bi_directional_traffic-2.snap +++ b/src/tests/cases/snapshots/ui__bi_directional_traffic-2.snap @@ -2,7 +2,7 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 24Bps / 25Bps + 24Bps / 25Bps diff --git a/src/tests/cases/snapshots/ui__bi_directional_traffic.snap b/src/tests/cases/snapshots/ui__bi_directional_traffic.snap index 0609187..7f3863a 100644 --- a/src/tests/cases/snapshots/ui__bi_directional_traffic.snap +++ b/src/tests/cases/snapshots/ui__bi_directional_traffic.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────┐┌Utilization by remote address────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down ││Remote Address Connections Rate Up / Down │ +│Process Connections Up / Down ││Remote Address Connections Up / Down │ │ ││ │ │ ││ │ │ ││ │ @@ -28,7 +28,7 @@ expression: "&terminal_draw_events_mirror[0]" │ ││ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘ ┌Utilization by connection───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Connection Process Rate Up / Down │ +│Connection Process Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height-2.snap b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height-2.snap index 623f1ff..ae8eb48 100644 --- a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height-2.snap +++ b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height-2.snap @@ -2,13 +2,13 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 92Bps + 98Bps + 5 1 0Bps / 28Bps 3.3.3.3 1 0Bps / 28Bps 4 1 0Bps / 26Bps 2.2.2.2 1 0Bps / 26Bps 1 1 0Bps / 22Bps 1.1.1.1 1 0Bps / 22Bps - 5 1 0Bps / 22Bps 3.3.3.3 1 0Bps / 22Bps 2 1 0Bps / 21Bps 4.4.4.4 1 0Bps / 21Bps diff --git a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap index 2c43b4a..b2ef419 100644 --- a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap +++ b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────┐┌Utilization by remote address────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down ││Remote Address Connections Rate Up / Down │ +│Process Connections Up / Down ││Remote Address Connections Up / Down │ │ ││ │ │ ││ │ │ ││ │ diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height-2.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height-2.snap index d5bc61c..2eaae57 100644 --- a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height-2.snap +++ b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height-2.snap @@ -2,13 +2,13 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 92Bps + 98Bps + 5 1 0Bps / 28Bps 4 1 0Bps / 26Bps 1 1 0Bps / 22Bps - 5 1 0Bps / 22Bps 2 1 0Bps / 21Bps @@ -30,9 +30,9 @@ expression: "&terminal_draw_events_mirror[1]" + 3.3.3.3 1 0Bps / 28Bps 2.2.2.2 1 0Bps / 26Bps 1.1.1.1 1 0Bps / 22Bps - 3.3.3.3 1 0Bps / 22Bps 4.4.4.4 1 0Bps / 21Bps diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap index 7a26f4a..39be4ff 100644 --- a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap +++ b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down │ +│Process Connections Up / Down │ │ │ │ │ │ │ @@ -28,7 +28,7 @@ expression: "&terminal_draw_events_mirror[0]" │ │ └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ┌Utilization by remote address────────────────────────────────────────────────────────────────────────────────────────┐ -│Remote Address Connections Rate Up / Down │ +│Remote Address Connections Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height-2.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height-2.snap index ba143f0..09cb09b 100644 --- a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height-2.snap +++ b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height-2.snap @@ -2,13 +2,13 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 92Bps + 98Bps + 5 1 0Bps / 28Bps 4 1 0Bps / 26Bps 1 1 0Bps / 22Bps - 5 1 0Bps / 22Bps 2 1 0Bps / 21Bps diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap index d86cf64..bf7caa7 100644 --- a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap +++ b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down │ +│Process Connections Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address-2.snap b/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address-2.snap index f4efd9d..e36471a 100644 --- a/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address-2.snap +++ b/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address-2.snap @@ -2,7 +2,7 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 47Bps + 47Bps diff --git a/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address.snap b/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address.snap index 0609187..7f3863a 100644 --- a/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address.snap +++ b/src/tests/cases/snapshots/ui__multiple_connections_from_remote_address.snap @@ -2,9 +2,9 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[0]" --- - Total Rate Up / Down: 0Bps / 0Bps + Total Up / Down: 0Bps / 0Bps ┌Utilization by process name──────────────────────────────────────────────────────────────────┐┌Utilization by remote address────────────────────────────────────────────────────────────────┐ -│Process Connections Rate Up / Down ││Remote Address Connections Rate Up / Down │ +│Process Connections Up / Down ││Remote Address Connections Up / Down │ │ ││ │ │ ││ │ │ ││ │ @@ -28,7 +28,7 @@ expression: "&terminal_draw_events_mirror[0]" │ ││ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘ ┌Utilization by connection───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│Connection Process Rate Up / Down │ +│Connection Process Up / Down │ │ │ │ │ │ │ diff --git a/src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_different_connections-2.snap b/src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_different_connections-2.snap index 89e9164..413308a 100644 --- a/src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_different_connections-2.snap +++ b/src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_different_connections-2.snap @@ -2,7 +2,7 @@ source: src/tests/cases/ui.rs expression: "&terminal_draw_events_mirror[1]" --- - 41Bps + 41Bps