summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLeon Yang (Containers) <lnyng@meta.com>2024-01-08 10:59:25 -0800
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2024-01-08 10:59:25 -0800
commit7f7d0fdf321506e09420fcb91a1e2c49cb67f029 (patch)
tree56259a22c3f3d754946faae75356a6d6ff8e13ea
parent10b8fec4a4a7aec2804870190e6889f705b1f751 (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.rs83
-rw-r--r--below/view/src/cgroup_view.rs41
-rw-r--r--below/view/src/viewrc.rs2
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 {