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:
parent
1198f8d4e6
commit
eb37d4ece2
@ -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" }
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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,
|
||||
);
|
||||
|
32
src/lib.rs
32
src/lib.rs
@ -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))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user