proxmox-rrd: remove dependency to proxmox-rrd-api-types

Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Dietmar Maurer 2021-10-13 10:24:42 +02:00 committed by Thomas Lamprecht
parent 1198f8d4e6
commit eb37d4ece2
6 changed files with 54 additions and 41 deletions

View File

@ -17,5 +17,3 @@ serde_cbor = "0.11.1"
proxmox = { version = "0.14.0" }
proxmox-time = "1"
proxmox-schema = { version = "1", features = [ "api-macro" ] }
proxmox-rrd-api-types = { path = "../proxmox-rrd-api-types" }

View File

@ -11,8 +11,6 @@ use nix::fcntl::OFlag;
use proxmox::tools::fs::{atomic_open_or_create_file, create_path, CreateOptions};
use proxmox_rrd_api_types::{RRDMode, RRDTimeFrameResolution};
use crate::rrd::{DST, CF, RRD, RRA};
const RRD_JOURNAL_NAME: &str = "rrd.journal";
@ -280,35 +278,23 @@ impl RRDCache {
}
/// Extract data from cached RRD
///
/// `start`: Start time. If not sepecified, we simply extract 10 data points.
/// `end`: End time. Default is to use the current time.
pub fn extract_cached_data(
&self,
base: &str,
name: &str,
now: f64,
timeframe: RRDTimeFrameResolution,
mode: RRDMode,
cf: CF,
resolution: u64,
start: Option<u64>,
end: Option<u64>,
) -> Result<Option<(u64, u64, Vec<Option<f64>>)>, Error> {
let state = self.state.read().unwrap();
let cf = match mode {
RRDMode::Max => CF::Maximum,
RRDMode::Average => CF::Average,
};
let now = now as u64;
let (start, resolution) = match timeframe {
RRDTimeFrameResolution::Hour => (now - 3600, 60),
RRDTimeFrameResolution::Day => (now - 3600*24, 60),
RRDTimeFrameResolution::Week => (now - 3600*24*7, 30*60),
RRDTimeFrameResolution::Month => (now - 3600*24*30, 30*60),
RRDTimeFrameResolution::Year => (now - 3600*24*365, 6*60*60),
RRDTimeFrameResolution::Decade => (now - 10*3600*24*366, 7*86400),
};
match state.rrd_map.get(&format!("{}/{}", base, name)) {
Some(rrd) => Ok(Some(rrd.extract_data(start, now, cf, resolution)?)),
Some(rrd) => Ok(Some(rrd.extract_data(cf, resolution, start, end)?)),
None => Ok(None),
}
}

View File

@ -339,12 +339,15 @@ impl RRD {
///
/// This selects the RRA with specified [CF] and (minimum)
/// resolution, and extract data from `start` to `end`.
///
/// `start`: Start time. If not sepecified, we simply extract 10 data points.
/// `end`: End time. Default is to use the current time.
pub fn extract_data(
&self,
start: u64,
end: u64,
cf: CF,
resolution: u64,
start: Option<u64>,
end: Option<u64>,
) -> Result<(u64, u64, Vec<Option<f64>>), Error> {
let mut rra: Option<&RRA> = None;
@ -362,7 +365,11 @@ impl RRD {
}
match rra {
Some(rra) => Ok(rra.extract_data(start, end, self.source.last_update)),
Some(rra) => {
let end = end.unwrap_or_else(|| proxmox_time::epoch_f64() as u64);
let start = start.unwrap_or(end - 10*rra.resolution);
Ok(rra.extract_data(start, end, self.source.last_update))
}
None => bail!("unable to find RRA suitable ({:?}:{})", cf, resolution),
}
}

View File

@ -9,26 +9,23 @@ use pbs_api_types::{
NODE_SCHEMA, RRDMode, RRDTimeFrameResolution, PRIV_SYS_AUDIT,
};
use crate::get_rrd_cache;
use crate::extract_rrd_data;
pub fn create_value_from_rrd(
basedir: &str,
list: &[&str],
timeframe: RRDTimeFrameResolution,
cf: RRDMode,
mode: RRDMode,
) -> Result<Value, Error> {
let mut result: Vec<Value> = Vec::new();
let now = proxmox_time::epoch_f64();
let rrd_cache = get_rrd_cache()?;
let mut timemap = BTreeMap::new();
let mut last_resolution = None;
for name in list {
let (start, reso, data) = match rrd_cache.extract_cached_data(basedir, name, now, timeframe, cf)? {
let (start, reso, data) = match extract_rrd_data(basedir, name, timeframe, mode)? {
Some(result) => result,
None => continue,
};

View File

@ -22,7 +22,7 @@ use pbs_datastore::DataStore;
use pbs_config::CachedUserInfo;
use crate::tools::statistics::{linear_regression};
use crate::get_rrd_cache;
use crate::extract_rrd_data;
#[api(
returns: {
@ -90,8 +90,6 @@ pub fn datastore_status(
let mut list = Vec::new();
let rrd_cache = get_rrd_cache()?;
for (store, (_, _)) in &config.sections {
let user_privs = user_info.lookup_privs(&auth_id, &["datastore", &store]);
let allowed = (user_privs & (PRIV_DATASTORE_AUDIT| PRIV_DATASTORE_BACKUP)) != 0;
@ -123,13 +121,10 @@ pub fn datastore_status(
});
let rrd_dir = format!("datastore/{}", store);
let now = proxmox_time::epoch_f64();
let get_rrd = |what: &str| rrd_cache.extract_cached_data(
let get_rrd = |what: &str| extract_rrd_data(
&rrd_dir,
what,
now,
RRDTimeFrameResolution::Month,
RRDMode::Average,
);

View File

@ -10,9 +10,10 @@ use anyhow::{format_err, Error};
use proxmox::tools::fs::CreateOptions;
use pbs_api_types::{RRDMode, RRDTimeFrameResolution};
use pbs_buildcfg::configdir;
use pbs_tools::cert::CertInfo;
use proxmox_rrd::RRDCache;
use proxmox_rrd::{rrd::CF, RRDCache};
#[macro_use]
pub mod tools;
@ -78,3 +79,32 @@ pub fn initialize_rrd_cache() -> Result<&'static RRDCache, Error> {
Ok(RRD_CACHE.get().unwrap())
}
/// Extracts data for the specified time frame from from RRD cache
pub fn extract_rrd_data(
basedir: &str,
name: &str,
timeframe: RRDTimeFrameResolution,
mode: RRDMode,
) -> Result<Option<(u64, u64, Vec<Option<f64>>)>, Error> {
let end = proxmox_time::epoch_f64() as u64;
let (start, resolution) = match timeframe {
RRDTimeFrameResolution::Hour => (end - 3600, 60),
RRDTimeFrameResolution::Day => (end - 3600*24, 60),
RRDTimeFrameResolution::Week => (end - 3600*24*7, 30*60),
RRDTimeFrameResolution::Month => (end - 3600*24*30, 30*60),
RRDTimeFrameResolution::Year => (end - 3600*24*365, 6*60*60),
RRDTimeFrameResolution::Decade => (end - 10*3600*24*366, 7*86400),
};
let cf = match mode {
RRDMode::Max => CF::Maximum,
RRDMode::Average => CF::Average,
};
let rrd_cache = get_rrd_cache()?;
rrd_cache.extract_cached_data(basedir, name, cf, resolution, Some(start), Some(end))
}