fn get_values()

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)?)
}