in src/data/diskstats.rs [240:296]
fn get_values(values: Vec<Diskstats>, key: String, metrics: &mut DataMetrics) -> Result<String> {
let mut ev: BTreeMap<String, DiskValues> = BTreeMap::new();
let mut metric = Metric::new(key.clone());
let disk_names = get_disk_names(values[0].clone());
let mut metadata = GraphMetadata::new();
let mut factor = FACTOR_OF_ONE;
let mut mult_factor = MULT_FACTOR_OF_ONE;
for name in disk_names {
let dv = DiskValues::new(name.clone());
ev.insert(name, dv);
}
if key.contains("Time") {
factor = TIME_S_FACTOR;
}
if key.contains("Sectors") {
mult_factor = MULT_SECTORS;
factor = KB_FACTOR;
}
let time_zero = values[0].time;
let mut prev_data = values[0].clone();
for v in values {
let mut prev_value: HashMap<String, u64> = HashMap::new();
for disk in &prev_data.disk_stats {
prev_value.insert(disk.name.clone(), *disk.stat.get(&key.clone()).unwrap());
}
for disk in &v.disk_stats {
/*
* The only counter to go to zero.
* See https://www.kernel.org/doc/html/latest/admin-guide/iostats.html Field #9
*/
let stat_value = if key == "In Progress" {
*disk.stat.get(&key.clone()).unwrap() as f64
} else {
(*disk.stat.get(&key.clone()).unwrap() as i64
- *prev_value.get(&disk.name).unwrap() as i64) as f64
* mult_factor as f64
/ factor as f64
};
let dv = DiskValue {
time: (v.time - time_zero),
value: stat_value,
};
metadata.update_limits(GraphLimitType::F64(stat_value));
metric.insert_value(stat_value);
let dvs = ev.get_mut(&disk.name).unwrap();
dvs.values.push(dv);
}
prev_data = v.clone();
}
let end_values = EndDiskValues {
data: ev.into_values().collect(),
metadata,
};
add_metrics(key, &mut metric, metrics, DISKSTATS_FILE_NAME.to_string())?;
Ok(serde_json::to_string(&end_values)?)
}