]> git.proxmox.com Git - proxmox-backup.git/blob - src/api2/node/rrd.rs
api: rustfmt
[proxmox-backup.git] / src / api2 / node / rrd.rs
1 use anyhow::{bail, Error};
2 use serde_json::{json, Value};
3 use std::collections::BTreeMap;
4
5 use proxmox_router::{Permission, Router};
6 use proxmox_schema::api;
7
8 use pbs_api_types::{RRDMode, RRDTimeFrame, NODE_SCHEMA, PRIV_SYS_AUDIT};
9
10 use crate::rrd_cache::extract_rrd_data;
11
12 pub fn create_value_from_rrd(
13 basedir: &str,
14 list: &[&str],
15 timeframe: RRDTimeFrame,
16 mode: RRDMode,
17 ) -> Result<Value, Error> {
18 let mut result: Vec<Value> = Vec::new();
19
20 let mut timemap = BTreeMap::new();
21
22 let mut last_resolution = None;
23
24 for name in list {
25 let (start, reso, data) = match extract_rrd_data(basedir, name, timeframe, mode)? {
26 Some(result) => result,
27 None => continue,
28 };
29
30 if let Some(expected_resolution) = last_resolution {
31 if reso != expected_resolution {
32 bail!(
33 "got unexpected RRD resolution ({} != {})",
34 reso,
35 expected_resolution
36 );
37 }
38 } else {
39 last_resolution = Some(reso);
40 }
41
42 let mut t = start;
43
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();
48 }
49 t += reso;
50 }
51 }
52
53 for item in timemap.values() {
54 result.push(item.clone());
55 }
56
57 Ok(result.into())
58 }
59
60 #[api(
61 input: {
62 properties: {
63 node: {
64 schema: NODE_SCHEMA,
65 },
66 timeframe: {
67 type: RRDTimeFrame,
68 },
69 cf: {
70 type: RRDMode,
71 },
72 },
73 },
74 access: {
75 permission: &Permission::Privilege(&["system", "status"], PRIV_SYS_AUDIT, false),
76 },
77 )]
78 /// Read node stats
79 fn get_node_stats(timeframe: RRDTimeFrame, cf: RRDMode, _param: Value) -> Result<Value, Error> {
80 create_value_from_rrd(
81 "host",
82 &[
83 "cpu",
84 "iowait",
85 "memtotal",
86 "memused",
87 "swaptotal",
88 "swapused",
89 "netin",
90 "netout",
91 "loadavg",
92 "total",
93 "used",
94 "read_ios",
95 "read_bytes",
96 "write_ios",
97 "write_bytes",
98 "io_ticks",
99 ],
100 timeframe,
101 cf,
102 )
103 }
104
105 pub const ROUTER: Router = Router::new().get(&API_METHOD_GET_NODE_STATS);