diff options
author | Leon Yang (Containers) <lnyng@meta.com> | 2024-01-08 10:59:25 -0800 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2024-01-08 10:59:25 -0800 |
commit | 7f7d0fdf321506e09420fcb91a1e2c49cb67f029 (patch) | |
tree | 56259a22c3f3d754946faae75356a6d6ff8e13ea | |
parent | 10b8fec4a4a7aec2804870190e6889f705b1f751 (diff) |
viewrc supports cgroup name column width
Summary: Add viewrc view option `cgroup_name_width` to configure cgroup view name column width, so that long cgroup names could be displayed properly.
Reviewed By: brianc118
Differential Revision: D52575584
fbshipit-source-id: d46df8ca81f911d9c4151c3c85d09942a8831242
-rw-r--r-- | below/view/src/cgroup_tabs.rs | 83 | ||||
-rw-r--r-- | below/view/src/cgroup_view.rs | 41 | ||||
-rw-r--r-- | below/view/src/viewrc.rs | 2 |
3 files changed, 66 insertions, 60 deletions
diff --git a/below/view/src/cgroup_tabs.rs b/below/view/src/cgroup_tabs.rs index 4c23db5a..b771bc76 100644 --- a/below/view/src/cgroup_tabs.rs +++ b/below/view/src/cgroup_tabs.rs @@ -14,6 +14,7 @@ use std::collections::HashSet; +use base_render::RenderConfig; use cursive::utils::markup::StyledString; use model::sort_queriables; use model::CgroupModel; @@ -34,13 +35,27 @@ type CgroupViewItem = ViewItem<model::SingleCgroupModelFieldId>; #[derive(Clone)] pub struct CgroupTab { pub view_items: Vec<CgroupViewItem>, + cgroup_name: CgroupViewItem, + cgroup_name_collapsed: CgroupViewItem, } /// Defines how to iterate through the cgroup and generate get_rows function for ViewBridge /// First ViewItem is always Name so it's not included in the view_items Vec. impl CgroupTab { - fn new(view_items: Vec<CgroupViewItem>) -> Self { - Self { view_items } + pub fn new(view_items: Vec<CgroupViewItem>, cgroup_name_config: &RenderConfig) -> Self { + use base_render::RenderConfigBuilder as Rc; + use common::util::get_prefix; + let cgroup_name_item = ViewItem::from_default(SingleCgroupModelFieldId::Name); + Self { + view_items, + cgroup_name: cgroup_name_item + .clone() + .update(cgroup_name_config.clone()) + .update(Rc::new().indented_prefix(get_prefix(false))), + cgroup_name_collapsed: cgroup_name_item + .update(cgroup_name_config.clone()) + .update(Rc::new().indented_prefix(get_prefix(true))), + } } fn get_line( @@ -51,9 +66,9 @@ impl CgroupTab { recreated: bool, ) -> StyledString { let mut line = if collapsed { - &*default_tabs::CGROUP_NAME_ITEM_COLLAPSED + &self.cgroup_name_collapsed } else { - &*default_tabs::CGROUP_NAME_ITEM + &self.cgroup_name } .render_indented(model); line.append_plain(" "); @@ -75,7 +90,7 @@ impl CgroupTab { pub fn get_titles(&self) -> ColumnTitles { ColumnTitles { - titles: std::iter::once(&*default_tabs::CGROUP_NAME_ITEM) + titles: std::iter::once(&self.cgroup_name) .chain(self.view_items.iter()) .map(|item| item.config.render_title()) .collect(), @@ -220,7 +235,6 @@ pub fn calculate_filtered_set( pub mod default_tabs { use base_render::RenderConfigBuilder as Rc; - use common::util::get_prefix; use model::CgroupCpuModelFieldId::NrPeriodsPerSec; use model::CgroupCpuModelFieldId::NrThrottledPerSec; use model::CgroupCpuModelFieldId::SystemPct; @@ -309,23 +323,14 @@ pub mod default_tabs { use model::SingleCgroupModelFieldId::Cpu; use model::SingleCgroupModelFieldId::Io; use model::SingleCgroupModelFieldId::Mem; - use model::SingleCgroupModelFieldId::Name; use model::SingleCgroupModelFieldId::Pids; use model::SingleCgroupModelFieldId::Pressure; use model::SingleCgroupModelFieldId::Props; - use once_cell::sync::Lazy; use super::*; - pub static CGROUP_NAME_ITEM: Lazy<CgroupViewItem> = Lazy::new(|| { - ViewItem::from_default(Name).update(Rc::new().indented_prefix(get_prefix(false))) - }); - pub static CGROUP_NAME_ITEM_COLLAPSED: Lazy<CgroupViewItem> = Lazy::new(|| { - ViewItem::from_default(Name).update(Rc::new().indented_prefix(get_prefix(true))) - }); - - pub static CGROUP_GENERAL_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_general_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Cpu(UsagePct)).update(Rc::new().title("CPU")), ViewItem::from_default(Mem(Total)), ViewItem::from_default(Pressure(CpuFullPct)), @@ -337,22 +342,22 @@ pub mod default_tabs { ViewItem::from_default(CgroupStat(NrDescendants)), ViewItem::from_default(CgroupStat(NrDyingDescendants)), ViewItem::from_default(Pids(TidsCurrent)), - ]) - }); + ] + } - pub static CGROUP_CPU_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_cpu_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Cpu(UsagePct)), ViewItem::from_default(Cpu(UserPct)), ViewItem::from_default(Cpu(SystemPct)), ViewItem::from_default(Cpu(NrPeriodsPerSec)), ViewItem::from_default(Cpu(NrThrottledPerSec)), ViewItem::from_default(Cpu(ThrottledPct)), - ]) - }); + ] + } - pub static CGROUP_MEM_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_mem_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Mem(Total)), ViewItem::from_default(Mem(Swap)), ViewItem::from_default(Mem(Anon)), @@ -398,11 +403,11 @@ pub mod default_tabs { ViewItem::from_default(Mem(EventsMax)), ViewItem::from_default(Mem(EventsOom)), ViewItem::from_default(Mem(EventsOomKill)), - ]) - }); + ] + } - pub static CGROUP_IO_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_io_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Io(RbytesPerSec)), ViewItem::from_default(Io(WbytesPerSec)), ViewItem::from_default(Io(DbytesPerSec)), @@ -414,22 +419,22 @@ pub mod default_tabs { ViewItem::from_default(Io(CostWaitPct)), ViewItem::from_default(Io(CostIndebtPct)), ViewItem::from_default(Io(CostIndelayPct)), - ]) - }); + ] + } - pub static CGROUP_PRESSURE_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_pressure_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Pressure(CpuSomePct)), ViewItem::from_default(Pressure(CpuFullPct)), ViewItem::from_default(Pressure(MemorySomePct)), ViewItem::from_default(Pressure(MemoryFullPct)), ViewItem::from_default(Pressure(IoSomePct)), ViewItem::from_default(Pressure(IoFullPct)), - ]) - }); + ] + } - pub static CGROUP_PROPERTIES_TAB: Lazy<CgroupTab> = Lazy::new(|| { - CgroupTab::new(vec![ + pub fn get_properties_items() -> Vec<ViewItem<SingleCgroupModelFieldId>> { + vec![ ViewItem::from_default(Props(MemoryMin)), ViewItem::from_default(Props(MemoryLow)), ViewItem::from_default(Props(MemoryHigh)), @@ -443,6 +448,6 @@ pub mod default_tabs { ViewItem::from_default(Props(CpusetCpusEffective)), ViewItem::from_default(Props(TidsMax)), ViewItem::from_default(Props(CgroupControllers)), - ]) - }); + ] + } } diff --git a/below/view/src/cgroup_view.rs b/below/view/src/cgroup_view.rs index 615df7b7..011a64e2 100644 --- a/below/view/src/cgroup_view.rs +++ b/below/view/src/cgroup_view.rs @@ -32,13 +32,9 @@ use model::CgroupModel; use model::Queriable; use model::SingleCgroupModelFieldId; -use crate::cgroup_tabs::default_tabs::CGROUP_CPU_TAB; -use crate::cgroup_tabs::default_tabs::CGROUP_GENERAL_TAB; -use crate::cgroup_tabs::default_tabs::CGROUP_IO_TAB; -use crate::cgroup_tabs::default_tabs::CGROUP_MEM_TAB; -use crate::cgroup_tabs::default_tabs::CGROUP_PRESSURE_TAB; -use crate::cgroup_tabs::default_tabs::CGROUP_PROPERTIES_TAB; +use crate::cgroup_tabs::default_tabs; use crate::cgroup_tabs::CgroupTab; +use crate::render::ViewItem; use crate::stats_view::ColumnTitles; use crate::stats_view::StateCommon; use crate::stats_view::StatsView; @@ -60,7 +56,7 @@ pub struct CgroupState { pub cgroup_to_focus: Option<String>, pub filter_info: Option<(SingleCgroupModelFieldId, String)>, pub sort_order: Option<SingleCgroupModelFieldId>, - pub sort_tags: HashMap<String, &'static CgroupTab>, + pub sort_tags: HashMap<String, Vec<ViewItem<SingleCgroupModelFieldId>>>, pub reverse: bool, pub model: Rc<RefCell<CgroupModel>>, pub collapse_all_top_level_cgroup: bool, @@ -90,7 +86,6 @@ impl StateCommon for CgroupState { .sort_tags .get(tab) .unwrap_or_else(|| panic!("Fail to find tab: {}", tab)) - .view_items .get(idx - 1) .expect("Out of title scope") .field_id @@ -146,12 +141,12 @@ impl StateCommon for CgroupState { fn new(model: Rc<RefCell<Self::ModelType>>) -> Self { let mut sort_tags = HashMap::new(); - sort_tags.insert("General".into(), &*CGROUP_GENERAL_TAB); - sort_tags.insert("CPU".into(), &*CGROUP_CPU_TAB); - sort_tags.insert("Mem".into(), &*CGROUP_MEM_TAB); - sort_tags.insert("I/O".into(), &*CGROUP_IO_TAB); - sort_tags.insert("Pressure".into(), &*CGROUP_PRESSURE_TAB); - sort_tags.insert("Properties".into(), &*CGROUP_PROPERTIES_TAB); + sort_tags.insert("General".into(), default_tabs::get_general_items()); + sort_tags.insert("CPU".into(), default_tabs::get_cpu_items()); + sort_tags.insert("Mem".into(), default_tabs::get_mem_items()); + sort_tags.insert("I/O".into(), default_tabs::get_io_items()); + sort_tags.insert("Pressure".into(), default_tabs::get_pressure_items()); + sort_tags.insert("Properties".into(), default_tabs::get_properties_items()); Self { collapsed_cgroups: Rc::new(RefCell::new(HashSet::new())), current_selected_cgroup: "<root>".into(), @@ -201,7 +196,7 @@ impl CgroupState { // TODO: Make CgroupView a collection of CgroupTab pub struct CgroupView { - tab: &'static CgroupTab, + tab: CgroupTab, } impl CgroupView { @@ -246,6 +241,10 @@ impl CgroupView { view.refresh(c); }); + let cgroup_name_config = base_render::RenderConfig { + width: viewrc.cgroup_name_width, + ..Default::default() + }; let tabs = vec![ "General".into(), "CPU".into(), @@ -258,37 +257,37 @@ impl CgroupView { tabs_map.insert( "General".into(), CgroupView { - tab: &CGROUP_GENERAL_TAB, + tab: CgroupTab::new(default_tabs::get_general_items(), &cgroup_name_config), }, ); tabs_map.insert( "CPU".into(), CgroupView { - tab: &CGROUP_CPU_TAB, + tab: CgroupTab::new(default_tabs::get_cpu_items(), &cgroup_name_config), }, ); tabs_map.insert( "Mem".into(), CgroupView { - tab: &CGROUP_MEM_TAB, + tab: CgroupTab::new(default_tabs::get_mem_items(), &cgroup_name_config), }, ); tabs_map.insert( "I/O".into(), CgroupView { - tab: &CGROUP_IO_TAB, + tab: CgroupTab::new(default_tabs::get_io_items(), &cgroup_name_config), }, ); tabs_map.insert( "Pressure".into(), CgroupView { - tab: &CGROUP_PRESSURE_TAB, + tab: CgroupTab::new(default_tabs::get_pressure_items(), &cgroup_name_config), }, ); tabs_map.insert( "Properties".into(), CgroupView { - tab: &CGROUP_PROPERTIES_TAB, + tab: CgroupTab::new(default_tabs::get_properties_items(), &cgroup_name_config), }, ); let user_data = c diff --git a/below/view/src/viewrc.rs b/below/view/src/viewrc.rs index 106700ff..a61a92b3 100644 --- a/below/view/src/viewrc.rs +++ b/below/view/src/viewrc.rs @@ -37,6 +37,8 @@ pub struct ViewRc { // If we want to collapse all top level cgroups. If this field is not set, // it will be treated as false pub collapse_cgroups: Option<bool>, + // Overrides cgroup name column width. + pub cgroup_name_width: Option<usize>, } impl ViewRc { |