summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Chen <brianc118@meta.com>2023-06-23 07:20:37 -0700
committerFacebook GitHub Bot <facebook-github-bot@users.noreply.github.com>2023-06-23 07:20:37 -0700
commit99c52137e63a9b738fe68e6ea408b6349ddd233c (patch)
tree9da3e6925c659df4b1e3ae98eb47ff50360636c1
parente7aded45b387614aa97d695ef0a61f1934a31595 (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.rs8
-rw-r--r--below/model/src/common_field_ids.rs24
-rw-r--r--below/model/src/sample_model.rs8
-rw-r--r--below/model/src/system.rs44
-rw-r--r--below/render/src/default_configs.rs20
-rw-r--r--below/view/src/core_tabs.rs2
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) {