From aa6a8f1c7432d5b82ead245398c82a48695d58c7 Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 12:17:14 +0200 Subject: [PATCH 1/7] replace serde with miniserde --- peach-stats/Cargo.toml | 3 +-- peach-stats/README.md | 4 ++-- peach-stats/src/error.rs | 9 --------- peach-stats/src/stats.rs | 14 ++++++++------ peach-stats/src/structs.rs | 2 +- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/peach-stats/Cargo.toml b/peach-stats/Cargo.toml index b603d20..82b9c95 100644 --- a/peach-stats/Cargo.toml +++ b/peach-stats/Cargo.toml @@ -33,8 +33,7 @@ jsonrpc-core = "11" jsonrpc-http-server = "11" jsonrpc-test = "11" log = "0.4" +miniserde = "0.1.15" probes = "0.3" -serde = { version = "1", features = ["derive"] } -serde_json = "1" snafu = "0.4" systemstat = "0.1" diff --git a/peach-stats/README.md b/peach-stats/README.md index f187a53..b2d527e 100644 --- a/peach-stats/README.md +++ b/peach-stats/README.md @@ -14,7 +14,7 @@ System statistics microservice module for PeachCloud. Provides a JSON-RPC wrappe | `load_average` | Load average statistics | `one`, `five`, `fifteen` | | `mem_stats` | Memory statistics | `total`, `free`, `used` | | `ping` | Microservice status | `success` if running | -| `uptime` | System uptime | `secs`, `nanos` | +| `uptime` | System uptime | `secs` | ### Environment @@ -101,7 +101,7 @@ With microservice running, open a second terminal window and use `curl` to call Server responds with: -`{"jsonrpc":"2.0","result":"{\"secs\":840968,\"nanos\":0}","id":1}` +`{"jsonrpc":"2.0","result":"{\"secs\":840968}","id":1}` ### Licensing diff --git a/peach-stats/src/error.rs b/peach-stats/src/error.rs index 12ce99d..53ba6a1 100644 --- a/peach-stats/src/error.rs +++ b/peach-stats/src/error.rs @@ -2,7 +2,6 @@ use std::{error, io}; use jsonrpc_core::{types::error::Error, ErrorCode}; use probes::ProbeError; -use serde_json::Error as SerdeError; use snafu::Snafu; pub type BoxError = Box; @@ -24,9 +23,6 @@ pub enum StatError { #[snafu(display("Failed to retrieve system uptime: {}", source))] ReadUptime { source: io::Error }, - - #[snafu(display("JSON serialization failed: {}", source))] - SerdeSerialize { source: SerdeError }, } impl From for Error { @@ -57,11 +53,6 @@ impl From for Error { message: format!("Failed to retrieve system uptime: {}", source), data: None, }, - StatError::SerdeSerialize { source } => Error { - code: ErrorCode::ServerError(-32002), - message: format!("JSON serialization failed: {}", source), - data: None, - }, } } } diff --git a/peach-stats/src/stats.rs b/peach-stats/src/stats.rs index a3c42bb..f539410 100644 --- a/peach-stats/src/stats.rs +++ b/peach-stats/src/stats.rs @@ -1,5 +1,6 @@ use std::result::Result; +use miniserde::json; use probes::{cpu, disk_usage, load, memory}; use snafu::ResultExt; use systemstat::{Platform, System}; @@ -16,7 +17,7 @@ pub fn cpu_stats() -> Result { nice: s.nice, idle: s.idle, }; - let json_cpu = serde_json::to_string(&cpu).context(SerdeSerialize)?; + let json_cpu = json::to_string(&cpu); Ok(json_cpu) } @@ -30,7 +31,7 @@ pub fn cpu_stats_percent() -> Result { nice: s.nice, idle: s.idle, }; - let json_cpu = serde_json::to_string(&cpu).context(SerdeSerialize)?; + let json_cpu = json::to_string(&cpu); Ok(json_cpu) } @@ -49,7 +50,7 @@ pub fn disk_usage() -> Result { }; disk_usages.push(disk); } - let json_disks = serde_json::to_string(&disk_usages).context(SerdeSerialize)?; + let json_disks = json::to_string(&disk_usages); Ok(json_disks) } @@ -61,7 +62,7 @@ pub fn load_average() -> Result { five: l.five, fifteen: l.fifteen, }; - let json_load_avg = serde_json::to_string(&load_avg).context(SerdeSerialize)?; + let json_load_avg = json::to_string(&load_avg); Ok(json_load_avg) } @@ -73,7 +74,7 @@ pub fn mem_stats() -> Result { free: m.free(), used: m.used(), }; - let json_mem = serde_json::to_string(&mem).context(SerdeSerialize)?; + let json_mem = json::to_string(&mem); Ok(json_mem) } @@ -81,7 +82,8 @@ pub fn mem_stats() -> Result { pub fn uptime() -> Result { let sys = System::new(); let uptime = sys.uptime().context(ReadUptime)?; - let json_uptime = serde_json::to_string(&uptime).context(SerdeSerialize)?; + let uptime_secs = uptime.as_secs(); + let json_uptime = json::to_string(&uptime_secs); Ok(json_uptime) } diff --git a/peach-stats/src/structs.rs b/peach-stats/src/structs.rs index 1fe12ee..f307879 100644 --- a/peach-stats/src/structs.rs +++ b/peach-stats/src/structs.rs @@ -1,4 +1,4 @@ -use serde::Serialize; +use miniserde::Serialize; #[derive(Debug, Serialize)] pub struct CpuStat { From 9e70b3782041857edcf26f8029b8248651594d29 Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 12:26:09 +0200 Subject: [PATCH 2/7] move jsonrpc_test to dev deps --- peach-stats/Cargo.toml | 4 +++- peach-stats/src/lib.rs | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/peach-stats/Cargo.toml b/peach-stats/Cargo.toml index 82b9c95..d6a728c 100644 --- a/peach-stats/Cargo.toml +++ b/peach-stats/Cargo.toml @@ -31,9 +31,11 @@ maintenance = { status = "actively-developed" } env_logger = "0.6" jsonrpc-core = "11" jsonrpc-http-server = "11" -jsonrpc-test = "11" log = "0.4" miniserde = "0.1.15" probes = "0.3" snafu = "0.4" systemstat = "0.1" + +[dev-dependencies] +jsonrpc-test = "11" diff --git a/peach-stats/src/lib.rs b/peach-stats/src/lib.rs index 68eff8d..f132927 100644 --- a/peach-stats/src/lib.rs +++ b/peach-stats/src/lib.rs @@ -6,8 +6,6 @@ use std::{env, result::Result}; use jsonrpc_core::{IoHandler, Value}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation, ServerBuilder}; -#[allow(unused_imports)] -use jsonrpc_test as test; use log::info; use crate::error::BoxError; @@ -85,6 +83,7 @@ pub fn run() -> Result<(), BoxError> { #[cfg(test)] mod tests { use super::*; + use jsonrpc_test as test; // test to ensure correct success response #[test] From fed9a73aa0e9f8abc12fd96fe0ca9e797173c905 Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 12:45:09 +0200 Subject: [PATCH 3/7] remove snafu --- peach-stats/Cargo.toml | 4 ++-- peach-stats/src/error.rs | 35 ++++++++++++++++++++++++----------- peach-stats/src/lib.rs | 4 ++-- peach-stats/src/stats.rs | 17 +++++++++-------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/peach-stats/Cargo.toml b/peach-stats/Cargo.toml index d6a728c..7569d0c 100644 --- a/peach-stats/Cargo.toml +++ b/peach-stats/Cargo.toml @@ -33,8 +33,8 @@ jsonrpc-core = "11" jsonrpc-http-server = "11" log = "0.4" miniserde = "0.1.15" -probes = "0.3" -snafu = "0.4" +#probes = "0.3" +probes = "0.4.1" systemstat = "0.1" [dev-dependencies] diff --git a/peach-stats/src/error.rs b/peach-stats/src/error.rs index 53ba6a1..15d6db8 100644 --- a/peach-stats/src/error.rs +++ b/peach-stats/src/error.rs @@ -1,30 +1,43 @@ -use std::{error, io}; +use std::io; use jsonrpc_core::{types::error::Error, ErrorCode}; use probes::ProbeError; -use snafu::Snafu; -pub type BoxError = Box; - -#[derive(Debug, Snafu)] -#[snafu(visibility(pub(crate)))] +#[derive(Debug)] pub enum StatError { - #[snafu(display("Failed to retrieve CPU statistics: {}", source))] ReadCpuStat { source: ProbeError }, - #[snafu(display("Failed to retrieve disk usage statistics: {}", source))] ReadDiskUsage { source: ProbeError }, - #[snafu(display("Failed to retrieve load average statistics: {}", source))] ReadLoadAvg { source: ProbeError }, - #[snafu(display("Failed to retrieve memory statistics: {}", source))] ReadMemStat { source: ProbeError }, - #[snafu(display("Failed to retrieve system uptime: {}", source))] ReadUptime { source: io::Error }, } +impl std::fmt::Display for StatError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match *self { + StatError::ReadCpuStat { ref source } => { + write!(f, "Failed to retrieve CPU statistics: {}", source) + } + StatError::ReadDiskUsage { ref source } => { + write!(f, "Failed to retrieve disk usage statistics: {}", source) + } + StatError::ReadLoadAvg { ref source } => { + write!(f, "Failed to retrieve load average statistics: {}", source) + } + StatError::ReadMemStat { ref source } => { + write!(f, "Failed to retrieve memory statistics: {}", source) + } + StatError::ReadUptime { ref source } => { + write!(f, "Failed to retrieve system uptime: {}", source) + } + } + } +} + impl From for Error { fn from(err: StatError) -> Self { match &err { diff --git a/peach-stats/src/lib.rs b/peach-stats/src/lib.rs index f132927..f4a8c7c 100644 --- a/peach-stats/src/lib.rs +++ b/peach-stats/src/lib.rs @@ -8,9 +8,9 @@ use jsonrpc_core::{IoHandler, Value}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation, ServerBuilder}; use log::info; -use crate::error::BoxError; +use crate::error::StatError; -pub fn run() -> Result<(), BoxError> { +pub fn run() -> Result<(), StatError> { info!("Starting up."); info!("Creating JSON-RPC I/O handler."); diff --git a/peach-stats/src/stats.rs b/peach-stats/src/stats.rs index f539410..ffb884d 100644 --- a/peach-stats/src/stats.rs +++ b/peach-stats/src/stats.rs @@ -2,14 +2,13 @@ use std::result::Result; use miniserde::json; use probes::{cpu, disk_usage, load, memory}; -use snafu::ResultExt; use systemstat::{Platform, System}; -use crate::error::*; +use crate::error::StatError; use crate::structs::{CpuStat, CpuStatPercentages, DiskUsage, LoadAverage, MemStat}; pub fn cpu_stats() -> Result { - let cpu_stats = cpu::proc::read().context(ReadCpuStat)?; + let cpu_stats = cpu::proc::read().map_err(|source| StatError::ReadCpuStat { source })?; let s = cpu_stats.stat; let cpu = CpuStat { user: s.user, @@ -23,7 +22,7 @@ pub fn cpu_stats() -> Result { } pub fn cpu_stats_percent() -> Result { - let cpu_stats = cpu::proc::read().context(ReadCpuStat)?; + let cpu_stats = cpu::proc::read().map_err(|source| StatError::ReadCpuStat { source })?; let s = cpu_stats.stat.in_percentages(); let cpu = CpuStatPercentages { user: s.user, @@ -37,7 +36,7 @@ pub fn cpu_stats_percent() -> Result { } pub fn disk_usage() -> Result { - let disks = disk_usage::read().context(ReadDiskUsage)?; + let disks = disk_usage::read().map_err(|source| StatError::ReadDiskUsage { source })?; let mut disk_usages = Vec::new(); for d in disks { let disk = DiskUsage { @@ -56,7 +55,7 @@ pub fn disk_usage() -> Result { } pub fn load_average() -> Result { - let l = load::read().context(ReadLoadAvg)?; + let l = load::read().map_err(|source| StatError::ReadLoadAvg { source })?; let load_avg = LoadAverage { one: l.one, five: l.five, @@ -68,7 +67,7 @@ pub fn load_average() -> Result { } pub fn mem_stats() -> Result { - let m = memory::read().context(ReadMemStat)?; + let m = memory::read().map_err(|source| StatError::ReadMemStat { source })?; let mem = MemStat { total: m.total(), free: m.free(), @@ -81,7 +80,9 @@ pub fn mem_stats() -> Result { pub fn uptime() -> Result { let sys = System::new(); - let uptime = sys.uptime().context(ReadUptime)?; + let uptime = sys + .uptime() + .map_err(|source| StatError::ReadUptime { source })?; let uptime_secs = uptime.as_secs(); let json_uptime = json::to_string(&uptime_secs); From aeb1cbcdd411d64b87fe9711c953f1cdef96adf3 Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 12:58:40 +0200 Subject: [PATCH 4/7] update systemstat dep --- peach-stats/Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/peach-stats/Cargo.toml b/peach-stats/Cargo.toml index 7569d0c..af40d85 100644 --- a/peach-stats/Cargo.toml +++ b/peach-stats/Cargo.toml @@ -33,9 +33,8 @@ jsonrpc-core = "11" jsonrpc-http-server = "11" log = "0.4" miniserde = "0.1.15" -#probes = "0.3" probes = "0.4.1" -systemstat = "0.1" +systemstat = "0.1.10" [dev-dependencies] jsonrpc-test = "11" From f781ca86d0888a8f3619e4512d25f2a1cf332abe Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 14:46:40 +0200 Subject: [PATCH 5/7] update test code --- peach-stats/Cargo.toml | 8 ++++---- peach-stats/src/lib.rs | 22 ++++++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/peach-stats/Cargo.toml b/peach-stats/Cargo.toml index af40d85..c8a4914 100644 --- a/peach-stats/Cargo.toml +++ b/peach-stats/Cargo.toml @@ -28,13 +28,13 @@ travis-ci = { repository = "peachcloud/peach-stats", branch = "master" } maintenance = { status = "actively-developed" } [dependencies] -env_logger = "0.6" -jsonrpc-core = "11" -jsonrpc-http-server = "11" +env_logger = "0.9" +jsonrpc-core = "18" +jsonrpc-http-server = "18" log = "0.4" miniserde = "0.1.15" probes = "0.4.1" systemstat = "0.1.10" [dev-dependencies] -jsonrpc-test = "11" +jsonrpc-test = "18" diff --git a/peach-stats/src/lib.rs b/peach-stats/src/lib.rs index f4a8c7c..00ce6a1 100644 --- a/peach-stats/src/lib.rs +++ b/peach-stats/src/lib.rs @@ -16,44 +16,46 @@ pub fn run() -> Result<(), StatError> { info!("Creating JSON-RPC I/O handler."); let mut io = IoHandler::default(); - io.add_method("cpu_stats", move |_| { + io.add_method("cpu_stats", move |_| async { info!("Fetching CPU statistics."); let stats = stats::cpu_stats()?; Ok(Value::String(stats)) }); - io.add_method("cpu_stats_percent", move |_| { + io.add_method("cpu_stats_percent", move |_| async { info!("Fetching CPU statistics as percentages."); let stats = stats::cpu_stats_percent()?; Ok(Value::String(stats)) }); - io.add_method("disk_usage", move |_| { + io.add_method("disk_usage", move |_| async { info!("Fetching disk usage statistics."); let disks = stats::disk_usage()?; Ok(Value::String(disks)) }); - io.add_method("load_average", move |_| { + io.add_method("load_average", move |_| async { info!("Fetching system load average statistics."); let avg = stats::load_average()?; Ok(Value::String(avg)) }); - io.add_method("mem_stats", move |_| { + io.add_method("mem_stats", move |_| async { info!("Fetching current memory statistics."); let mem = stats::mem_stats()?; Ok(Value::String(mem)) }); - io.add_method("ping", |_| Ok(Value::String("success".to_string()))); + io.add_method("ping", |_| async { + Ok(Value::String("success".to_string())) + }); - io.add_method("uptime", move |_| { + io.add_method("uptime", move |_| async { info!("Fetching system uptime."); let uptime = stats::uptime()?; @@ -83,17 +85,17 @@ pub fn run() -> Result<(), StatError> { #[cfg(test)] mod tests { use super::*; - use jsonrpc_test as test; + use jsonrpc_test as test_rpc; // test to ensure correct success response #[test] fn rpc_success() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_success_response", |_| { + io.add_method("rpc_success_response", |_| async { Ok(Value::String("success".into())) }); - test::Rpc::from(io) + test_rpc::Rpc::from(io) }; assert_eq!(rpc.request("rpc_success_response", &()), r#""success""#); From dc4fdb37e8594893418976fe8f32afb1d1ea3b2c Mon Sep 17 00:00:00 2001 From: glyph Date: Sat, 30 Oct 2021 20:02:37 +0200 Subject: [PATCH 6/7] formatting --- peach-stats/src/error.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/peach-stats/src/error.rs b/peach-stats/src/error.rs index 15d6db8..fd80fda 100644 --- a/peach-stats/src/error.rs +++ b/peach-stats/src/error.rs @@ -6,13 +6,9 @@ use probes::ProbeError; #[derive(Debug)] pub enum StatError { ReadCpuStat { source: ProbeError }, - ReadDiskUsage { source: ProbeError }, - ReadLoadAvg { source: ProbeError }, - ReadMemStat { source: ProbeError }, - ReadUptime { source: io::Error }, } From 59ad6f2523dadf2a36dd7439b8af213f5d3ea8c6 Mon Sep 17 00:00:00 2001 From: glyph Date: Mon, 1 Nov 2021 14:10:16 +0200 Subject: [PATCH 7/7] remove redundant error variant prefixes --- peach-stats/src/error.rs | 38 ++++++++++++++++++++------------------ peach-stats/src/stats.rs | 12 ++++++------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/peach-stats/src/error.rs b/peach-stats/src/error.rs index fd80fda..b558364 100644 --- a/peach-stats/src/error.rs +++ b/peach-stats/src/error.rs @@ -1,33 +1,35 @@ -use std::io; +use std::{error, fmt, io}; use jsonrpc_core::{types::error::Error, ErrorCode}; use probes::ProbeError; #[derive(Debug)] pub enum StatError { - ReadCpuStat { source: ProbeError }, - ReadDiskUsage { source: ProbeError }, - ReadLoadAvg { source: ProbeError }, - ReadMemStat { source: ProbeError }, - ReadUptime { source: io::Error }, + CpuStat { source: ProbeError }, + DiskUsage { source: ProbeError }, + LoadAvg { source: ProbeError }, + MemStat { source: ProbeError }, + Uptime { source: io::Error }, } -impl std::fmt::Display for StatError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { +impl error::Error for StatError {} + +impl fmt::Display for StatError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - StatError::ReadCpuStat { ref source } => { + StatError::CpuStat { ref source } => { write!(f, "Failed to retrieve CPU statistics: {}", source) } - StatError::ReadDiskUsage { ref source } => { + StatError::DiskUsage { ref source } => { write!(f, "Failed to retrieve disk usage statistics: {}", source) } - StatError::ReadLoadAvg { ref source } => { + StatError::LoadAvg { ref source } => { write!(f, "Failed to retrieve load average statistics: {}", source) } - StatError::ReadMemStat { ref source } => { + StatError::MemStat { ref source } => { write!(f, "Failed to retrieve memory statistics: {}", source) } - StatError::ReadUptime { ref source } => { + StatError::Uptime { ref source } => { write!(f, "Failed to retrieve system uptime: {}", source) } } @@ -37,27 +39,27 @@ impl std::fmt::Display for StatError { impl From for Error { fn from(err: StatError) -> Self { match &err { - StatError::ReadCpuStat { source } => Error { + StatError::CpuStat { source } => Error { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve CPU statistics: {}", source), data: None, }, - StatError::ReadDiskUsage { source } => Error { + StatError::DiskUsage { source } => Error { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve disk usage statistics: {}", source), data: None, }, - StatError::ReadLoadAvg { source } => Error { + StatError::LoadAvg { source } => Error { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve load average statistics: {}", source), data: None, }, - StatError::ReadMemStat { source } => Error { + StatError::MemStat { source } => Error { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve memory statistics: {}", source), data: None, }, - StatError::ReadUptime { source } => Error { + StatError::Uptime { source } => Error { code: ErrorCode::ServerError(-32001), message: format!("Failed to retrieve system uptime: {}", source), data: None, diff --git a/peach-stats/src/stats.rs b/peach-stats/src/stats.rs index ffb884d..15c9031 100644 --- a/peach-stats/src/stats.rs +++ b/peach-stats/src/stats.rs @@ -8,7 +8,7 @@ use crate::error::StatError; use crate::structs::{CpuStat, CpuStatPercentages, DiskUsage, LoadAverage, MemStat}; pub fn cpu_stats() -> Result { - let cpu_stats = cpu::proc::read().map_err(|source| StatError::ReadCpuStat { source })?; + let cpu_stats = cpu::proc::read().map_err(|source| StatError::CpuStat { source })?; let s = cpu_stats.stat; let cpu = CpuStat { user: s.user, @@ -22,7 +22,7 @@ pub fn cpu_stats() -> Result { } pub fn cpu_stats_percent() -> Result { - let cpu_stats = cpu::proc::read().map_err(|source| StatError::ReadCpuStat { source })?; + let cpu_stats = cpu::proc::read().map_err(|source| StatError::CpuStat { source })?; let s = cpu_stats.stat.in_percentages(); let cpu = CpuStatPercentages { user: s.user, @@ -36,7 +36,7 @@ pub fn cpu_stats_percent() -> Result { } pub fn disk_usage() -> Result { - let disks = disk_usage::read().map_err(|source| StatError::ReadDiskUsage { source })?; + let disks = disk_usage::read().map_err(|source| StatError::DiskUsage { source })?; let mut disk_usages = Vec::new(); for d in disks { let disk = DiskUsage { @@ -55,7 +55,7 @@ pub fn disk_usage() -> Result { } pub fn load_average() -> Result { - let l = load::read().map_err(|source| StatError::ReadLoadAvg { source })?; + let l = load::read().map_err(|source| StatError::LoadAvg { source })?; let load_avg = LoadAverage { one: l.one, five: l.five, @@ -67,7 +67,7 @@ pub fn load_average() -> Result { } pub fn mem_stats() -> Result { - let m = memory::read().map_err(|source| StatError::ReadMemStat { source })?; + let m = memory::read().map_err(|source| StatError::MemStat { source })?; let mem = MemStat { total: m.total(), free: m.free(), @@ -82,7 +82,7 @@ pub fn uptime() -> Result { let sys = System::new(); let uptime = sys .uptime() - .map_err(|source| StatError::ReadUptime { source })?; + .map_err(|source| StatError::Uptime { source })?; let uptime_secs = uptime.as_secs(); let json_uptime = json::to_string(&uptime_secs);