mirror of
https://git.proxmox.com/git/proxmox
synced 2025-05-18 07:05:48 +00:00
rrd: pack multiple rrd values into th estat list
This commit is contained in:
parent
1c0117790f
commit
e073e5c107
@ -82,3 +82,30 @@ pub fn extract_data(
|
|||||||
Ok(RRD::new().extract_data(now, timeframe, mode))
|
Ok(RRD::new().extract_data(now, timeframe, mode))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn extract_data_list(
|
||||||
|
base: &str,
|
||||||
|
items: &[&str],
|
||||||
|
timeframe: RRDTimeFrameResolution,
|
||||||
|
mode: RRDMode,
|
||||||
|
) -> Result<Value, Error> {
|
||||||
|
|
||||||
|
let now = now()?;
|
||||||
|
|
||||||
|
let map = RRD_CACHE.read().unwrap();
|
||||||
|
|
||||||
|
let mut list: Vec<(&str, &RRD)> = Vec::new();
|
||||||
|
|
||||||
|
let empty_rrd = RRD::new();
|
||||||
|
|
||||||
|
for name in items.iter() {
|
||||||
|
if let Some(rrd) = map.get(&format!("{}/{}", base, name)) {
|
||||||
|
list.push((name, rrd));
|
||||||
|
} else {
|
||||||
|
list.push((name, &empty_rrd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(extract_rrd_data(&list, now, timeframe, mode))
|
||||||
|
}
|
||||||
|
@ -6,8 +6,7 @@ use serde_json::{json, Value};
|
|||||||
|
|
||||||
use crate::api2::types::{RRDMode, RRDTimeFrameResolution};
|
use crate::api2::types::{RRDMode, RRDTimeFrameResolution};
|
||||||
|
|
||||||
const RRD_DATA_ENTRIES: usize = 70;
|
pub const RRD_DATA_ENTRIES: usize = 70;
|
||||||
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Default, Copy, Clone)]
|
#[derive(Default, Copy, Clone)]
|
||||||
@ -209,3 +208,54 @@ impl RRD {
|
|||||||
self.last_update = epoch;
|
self.last_update = epoch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn extract_rrd_data(
|
||||||
|
rrd_list: &[(&str, &RRD)],
|
||||||
|
epoch: u64,
|
||||||
|
timeframe: RRDTimeFrameResolution,
|
||||||
|
mode: RRDMode,
|
||||||
|
) -> Value {
|
||||||
|
|
||||||
|
let reso = timeframe as u64;
|
||||||
|
|
||||||
|
let end = reso*(epoch/reso);
|
||||||
|
let start = end - reso*(RRD_DATA_ENTRIES as u64);
|
||||||
|
|
||||||
|
let mut list = Vec::new();
|
||||||
|
|
||||||
|
let mut t = start;
|
||||||
|
let mut index = ((t/reso) % (RRD_DATA_ENTRIES as u64)) as usize;
|
||||||
|
for _ in 0..RRD_DATA_ENTRIES {
|
||||||
|
let mut item = json!({ "time": t });
|
||||||
|
for (name, rrd) in rrd_list.iter() {
|
||||||
|
let rrd_end = reso*(rrd.last_update/reso);
|
||||||
|
let rrd_start = rrd_end - reso*(RRD_DATA_ENTRIES as u64);
|
||||||
|
|
||||||
|
if t < rrd_start || t > rrd_end {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
let data = match timeframe {
|
||||||
|
RRDTimeFrameResolution::Hour => &rrd.hour,
|
||||||
|
RRDTimeFrameResolution::Day => &rrd.day,
|
||||||
|
RRDTimeFrameResolution::Week => &rrd.week,
|
||||||
|
RRDTimeFrameResolution::Month => &rrd.month,
|
||||||
|
RRDTimeFrameResolution::Year => &rrd.year,
|
||||||
|
};
|
||||||
|
let entry = data[index];
|
||||||
|
if entry.count == 0 {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
let value = match mode {
|
||||||
|
RRDMode::Max => entry.max,
|
||||||
|
RRDMode::Average => entry.average,
|
||||||
|
};
|
||||||
|
item[name] = value.into();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
list.push(item);
|
||||||
|
t += reso; index = (index + 1) % RRD_DATA_ENTRIES;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.into()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user