1 use anyhow
::{bail, Error}
;
2 use serde_json
::{json, Value}
;
3 use std
::collections
::BTreeMap
;
5 use proxmox_router
::{Permission, Router}
;
6 use proxmox_schema
::api
;
8 use pbs_api_types
::{RRDMode, RRDTimeFrame, NODE_SCHEMA, PRIV_SYS_AUDIT}
;
10 use crate::rrd_cache
::extract_rrd_data
;
12 pub fn create_value_from_rrd(
15 timeframe
: RRDTimeFrame
,
17 ) -> Result
<Value
, Error
> {
18 let mut result
: Vec
<Value
> = Vec
::new();
20 let mut timemap
= BTreeMap
::new();
22 let mut last_resolution
= None
;
25 let (start
, reso
, data
) = match extract_rrd_data(basedir
, name
, timeframe
, mode
)?
{
26 Some(result
) => result
,
30 if let Some(expected_resolution
) = last_resolution
{
31 if reso
!= expected_resolution
{
33 "got unexpected RRD resolution ({} != {})",
39 last_resolution
= Some(reso
);
44 for index
in 0..data
.len() {
45 let entry
= timemap
.entry(t
).or_insert(json
!({ "time": t }
));
46 if let Some(value
) = data
[index
] {
47 entry
[*name
] = value
.into();
53 for item
in timemap
.values() {
54 result
.push(item
.clone());
75 permission
: &Permission
::Privilege(&["system", "status"], PRIV_SYS_AUDIT
, false),
79 fn get_node_stats(timeframe
: RRDTimeFrame
, cf
: RRDMode
, _param
: Value
) -> Result
<Value
, Error
> {
80 create_value_from_rrd(
105 pub const ROUTER
: Router
= Router
::new().get(&API_METHOD_GET_NODE_STATS
);