diff options
author | Brian Chen <brianc118@meta.com> | 2023-06-23 07:20:37 -0700 |
---|---|---|
committer | Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com> | 2023-06-23 07:20:37 -0700 |
commit | 99c52137e63a9b738fe68e6ea408b6349ddd233c (patch) | |
tree | 9da3e6925c659df4b1e3ae98eb47ff50360636c1 | |
parent | e7aded45b387614aa97d695ef0a61f1934a31595 (diff) |
Update below model and UI to support new format for CPUs
Summary:
Support is backward compatible. We will try to use `cpus_map` first
and if not available we will use `cpus`.
Reviewed By: lnyng
Differential Revision: D46946005
fbshipit-source-id: e8afb44d93323e32efd86f3d00eb331284a9c458
-rw-r--r-- | below/dump/src/test.rs | 8 | ||||
-rw-r--r-- | below/model/src/common_field_ids.rs | 24 | ||||
-rw-r--r-- | below/model/src/sample_model.rs | 8 | ||||
-rw-r--r-- | below/model/src/system.rs | 44 | ||||
-rw-r--r-- | below/render/src/default_configs.rs | 20 | ||||
-rw-r--r-- | below/view/src/core_tabs.rs | 2 |
6 files changed, 67 insertions, 39 deletions
diff --git a/below/dump/src/test.rs b/below/dump/src/test.rs index 471a2d56..b2bcef79 100644 --- a/below/dump/src/test.rs +++ b/below/dump/src/test.rs @@ -39,8 +39,8 @@ fn test_dump_sys_content() { let mut fields = command::expand_fields(command::DEFAULT_SYSTEM_FIELDS, true); for subquery_id in model::SingleCpuModelFieldId::unit_variant_iter() { fields.push(DumpField::FieldId(model::SystemModelFieldId::Cpus( - model::VecFieldId { - idx: Some(31), + model::BTreeMapFieldId { + key: Some(31), subquery_id, }, ))); @@ -95,8 +95,8 @@ fn test_dump_sys_titles() { .into_iter() .chain( model::SingleCpuModelFieldId::unit_variant_iter().map(|subquery_id| { - DumpField::FieldId(model::SystemModelFieldId::Cpus(model::VecFieldId { - idx: Some(31), + DumpField::FieldId(model::SystemModelFieldId::Cpus(model::BTreeMapFieldId { + key: Some(31), subquery_id, })) }), diff --git a/below/model/src/common_field_ids.rs b/below/model/src/common_field_ids.rs index ea10105c..59dc18ae 100644 --- a/below/model/src/common_field_ids.rs +++ b/below/model/src/common_field_ids.rs @@ -45,18 +45,18 @@ pub const COMMON_MODEL_FIELD_IDS: [&str; 361] = [ "system.cpu.stolen_pct", "system.cpu.guest_pct", "system.cpu.guest_nice_pct", - "system.cpus.<idx>.idx", - "system.cpus.<idx>.usage_pct", - "system.cpus.<idx>.user_pct", - "system.cpus.<idx>.system_pct", - "system.cpus.<idx>.idle_pct", - "system.cpus.<idx>.nice_pct", - "system.cpus.<idx>.iowait_pct", - "system.cpus.<idx>.irq_pct", - "system.cpus.<idx>.softirq_pct", - "system.cpus.<idx>.stolen_pct", - "system.cpus.<idx>.guest_pct", - "system.cpus.<idx>.guest_nice_pct", + "system.cpus.<key>.idx", + "system.cpus.<key>.usage_pct", + "system.cpus.<key>.user_pct", + "system.cpus.<key>.system_pct", + "system.cpus.<key>.idle_pct", + "system.cpus.<key>.nice_pct", + "system.cpus.<key>.iowait_pct", + "system.cpus.<key>.irq_pct", + "system.cpus.<key>.softirq_pct", + "system.cpus.<key>.stolen_pct", + "system.cpus.<key>.guest_pct", + "system.cpus.<key>.guest_nice_pct", "system.mem.total", "system.mem.free", "system.mem.available", diff --git a/below/model/src/sample_model.rs b/below/model/src/sample_model.rs index e189212a..104424e0 100644 --- a/below/model/src/sample_model.rs +++ b/below/model/src/sample_model.rs @@ -51,8 +51,8 @@ pub const SAMPLE_MODEL_JSON: &str = r#" "guest_pct": 0.0, "guest_nice_pct": 0.0 }, - "cpus": [ - { + "cpus": { + "0": { "idx": 0, "usage_pct": 20.0, "user_pct": 10.0, @@ -66,7 +66,7 @@ pub const SAMPLE_MODEL_JSON: &str = r#" "guest_pct": 0.0, "guest_nice_pct": 0.0 }, - { + "1": { "idx": 1, "usage_pct": 20.0, "user_pct": 10.0, @@ -80,7 +80,7 @@ pub const SAMPLE_MODEL_JSON: &str = r#" "guest_pct": 0.0, "guest_nice_pct": 0.0 } - ], + }, "mem": { "total": 8000000000, "free": 4000000000, diff --git a/below/model/src/system.rs b/below/model/src/system.rs index de90ce94..0f300964 100644 --- a/below/model/src/system.rs +++ b/below/model/src/system.rs @@ -33,7 +33,7 @@ pub struct SystemModel { #[queriable(preferred_name = cpu)] pub total_cpu: SingleCpuModel, #[queriable(subquery)] - pub cpus: Vec<SingleCpuModel>, + pub cpus: BTreeMap<u32, SingleCpuModel>, #[queriable(subquery)] pub mem: MemoryModel, #[queriable(subquery)] @@ -54,17 +54,43 @@ impl SystemModel { (Some(prev), Some(curr)) => SingleCpuModel::new(-1, &prev, &curr), _ => Default::default(), }; - let cpus = match ( - last.and_then(|(last, _)| last.stat.cpus.as_ref()), - sample.stat.cpus.as_ref(), + + let mut cpus: BTreeMap<u32, SingleCpuModel> = match ( + last.and_then(|(last, _)| last.stat.cpus_map.as_ref()), + sample.stat.cpus_map.as_ref(), ) { - (Some(prev), Some(curr)) => std::iter::successors(Some(0), |idx| Some(idx + 1)) - .zip(prev.iter().zip(curr.iter())) - .map(|(idx, (prev, curr))| SingleCpuModel::new(idx, prev, curr)) + (Some(prev), Some(curr)) => curr + .iter() + .map(|(idx, curr)| { + ( + *idx, + prev.get(idx).map_or_else(Default::default, |prev| { + SingleCpuModel::new(*idx as i32, prev, curr) + }), + ) + }) .collect(), - (_, Some(curr)) => curr.iter().map(|_| Default::default()).collect(), + (_, Some(curr)) => curr.keys().map(|idx| (*idx, Default::default())).collect(), _ => Default::default(), }; + + if cpus.is_empty() { + cpus = match ( + last.and_then(|(last, _)| last.stat.cpus.as_ref()), + sample.stat.cpus.as_ref(), + ) { + (Some(prev), Some(curr)) => std::iter::successors(Some(0), |idx| Some(idx + 1)) + .zip(prev.iter().zip(curr.iter())) + .map(|(idx, (prev, curr))| (idx as u32, SingleCpuModel::new(idx, prev, curr))) + .collect(), + (_, Some(curr)) => std::iter::successors(Some(0), |idx| Some(idx + 1)) + .zip(curr.iter()) + .map(|(idx, _curr)| (idx, Default::default())) + .collect(), + _ => Default::default(), + }; + } + let mem = Some(MemoryModel::new(&sample.meminfo)).unwrap_or_default(); let vm = last .map(|(last, duration)| VmModel::new(&last.vmstat, &sample.vmstat, duration)) @@ -508,7 +534,7 @@ mod test { "total_cpu": { "idx": -1 }, - "cpus": [], + "cpus": {}, "mem": {}, "vm": {}, "disks": { diff --git a/below/render/src/default_configs.rs b/below/render/src/default_configs.rs index 76e5a19e..a815ae44 100644 --- a/below/render/src/default_configs.rs +++ b/below/render/src/default_configs.rs @@ -944,7 +944,9 @@ impl HasRenderConfig for model::SystemModel { OsRelease => rc.title("OS Release").width(50), Stat(field_id) => model::ProcStatModel::get_render_config_builder(field_id), Cpu(field_id) => model::SingleCpuModel::get_render_config_builder(field_id), - Cpus(field_id) => Vec::<model::SingleCpuModel>::get_render_config_builder(field_id), + Cpus(field_id) => { + BTreeMap::<u32, model::SingleCpuModel>::get_render_config_builder(field_id) + } Mem(field_id) => model::MemoryModel::get_render_config_builder(field_id), Vm(field_id) => model::VmModel::get_render_config_builder(field_id), Disks(field_id) => { @@ -1059,15 +1061,15 @@ impl HasRenderConfigForDump for model::SingleCpuModel { } } -impl HasRenderConfig for Vec<model::SingleCpuModel> { +impl HasRenderConfig for BTreeMap<u32, model::SingleCpuModel> { fn get_render_config_builder(field_id: &Self::FieldId) -> RenderConfigBuilder { let mut rc = model::SingleCpuModel::get_render_config_builder(&field_id.subquery_id).get(); rc.title = rc.title.map(|title| { format!( "CPU {} {}", field_id - .idx - .expect("VecFieldId without idx should not have render config"), + .key + .expect("BTreeMapFieldId without key should not have render config"), title ) }); @@ -1075,15 +1077,15 @@ impl HasRenderConfig for Vec<model::SingleCpuModel> { } } -impl HasRenderConfigForDump for Vec<model::SingleCpuModel> { +impl HasRenderConfigForDump for BTreeMap<u32, model::SingleCpuModel> { fn get_openmetrics_config_for_dump( &self, field_id: &Self::FieldId, ) -> Option<RenderOpenMetricsConfigBuilder> { - let idx = field_id - .idx - .expect("VecFieldId without idx should not have render config"); - self.get(idx) + let key = field_id + .key + .expect("BTreeMapFieldId without key should not have render config"); + self.get(&key) .map(|cpu| cpu.get_openmetrics_config_for_dump(&field_id.subquery_id))? } } diff --git a/below/view/src/core_tabs.rs b/below/view/src/core_tabs.rs index 55a62ca0..8bdbdc66 100644 --- a/below/view/src/core_tabs.rs +++ b/below/view/src/core_tabs.rs @@ -65,7 +65,7 @@ impl CoreTab for CoreCpu { let model = state.get_model(); model .cpus - .iter() + .values() .filter(|scm| { if let Some((CoreStateFieldId::Cpu(field), filter)) = &state.filter_info { match scm.query(field) { |