From c3f951dfc552d52e568864913f0e0e632827c24a Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 5 Jan 2022 10:55:38 +0200 Subject: refactor: rename Result to SuiteMeasurements Sponsored-by: author --- src/bin/obnam-benchmark.rs | 4 ++-- src/result.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bin/obnam-benchmark.rs b/src/bin/obnam-benchmark.rs index f079d75..b0ff016 100644 --- a/src/bin/obnam-benchmark.rs +++ b/src/bin/obnam-benchmark.rs @@ -1,6 +1,6 @@ use log::{debug, error, info}; use obnam_benchmark::junk::junk; -use obnam_benchmark::result::Result; +use obnam_benchmark::result::SuiteMeasurements; use obnam_benchmark::specification::Specification; use obnam_benchmark::suite::Suite; use std::fs::File; @@ -71,7 +71,7 @@ impl Run { info!("running benchmarks from {}", self.spec.display()); let spec = Specification::from_file(&self.spec)?; let mut suite = Suite::new()?; - let mut result = Result::default(); + let mut result = SuiteMeasurements::default(); for step in spec.steps().iter() { result.push(suite.execute(step)?); } diff --git a/src/result.rs b/src/result.rs index 9e4119b..b51a154 100644 --- a/src/result.rs +++ b/src/result.rs @@ -1,7 +1,7 @@ use serde::Serialize; #[derive(Debug, Default, Serialize)] -pub struct Result { +pub struct SuiteMeasurements { measurements: Vec, } @@ -33,7 +33,7 @@ pub enum Operation { CompareManiests, } -impl Result { +impl SuiteMeasurements { pub fn push(&mut self, m: OpMeasurements) { self.measurements.push(m); } -- cgit v1.2.1 From ce590b36d53ab69f204350606433eeab47878f63 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Wed, 5 Jan 2022 11:25:05 +0200 Subject: feat: add metadata about benchmark run and host to output Sponsored-by: author --- Cargo.lock | 65 ++++++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 5 +++- src/bin/obnam-benchmark.rs | 3 ++- src/client.rs | 16 ++++++++++++ src/result.rs | 42 +++++++++++++++++++++++++++++- 5 files changed, 126 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e98169b..f1c7535 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "0.7.18" @@ -159,6 +165,15 @@ dependencies = [ "vec_map", ] +[[package]] +name = "crc32fast" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.1" @@ -287,6 +302,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -422,6 +449,12 @@ dependencies = [ "libc", ] +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "humansize" version = "1.1.1" @@ -561,11 +594,21 @@ dependencies = [ "autocfg", ] +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "nix" -version = "0.23.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f305c2c2e4c39a82f7bf0bf65fb557f9070ce06781d4f2454295cc34b1c43188" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" dependencies = [ "bitflags", "cc", @@ -614,12 +657,15 @@ name = "obnam-benchmark" version = "0.1.0" dependencies = [ "anyhow", + "chrono", "fehler", + "git-testament", "glob", "lazy_static", "log", "nix", "pretty_env_logger", + "procfs", "rand", "serde", "serde_json", @@ -826,6 +872,21 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "procfs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0941606b9934e2d98a3677759a971756eb821f75764d0e0d26946d08e74d9104" +dependencies = [ + "bitflags", + "byteorder", + "chrono", + "flate2", + "hex", + "lazy_static", + "libc", +] + [[package]] name = "pulldown-cmark" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index c5f7c9d..49616d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,10 +8,13 @@ edition = "2018" [dependencies] anyhow = "1.0.51" +chrono = "0.4.19" +git-testament = "0.2.1" lazy_static = "1.4.0" log = "0.4.14" -nix = "0.23.0" +nix = "0.23.1" pretty_env_logger = "0.4.0" +procfs = "0.12.0" rand = "0.8.4" serde = { version = "1.0.101", features = ["derive"] } serde_json = "1.0.72" diff --git a/src/bin/obnam-benchmark.rs b/src/bin/obnam-benchmark.rs index b0ff016..5df2aeb 100644 --- a/src/bin/obnam-benchmark.rs +++ b/src/bin/obnam-benchmark.rs @@ -71,7 +71,8 @@ impl Run { info!("running benchmarks from {}", self.spec.display()); let spec = Specification::from_file(&self.spec)?; let mut suite = Suite::new()?; - let mut result = SuiteMeasurements::default(); + let obnam_version = obnam_benchmark::client::ObnamClient::version()?; + let mut result = SuiteMeasurements::new(obnam_version)?; for step in spec.steps().iter() { result.push(suite.execute(step)?); } diff --git a/src/client.rs b/src/client.rs index fb25009..97b4c61 100644 --- a/src/client.rs +++ b/src/client.rs @@ -39,6 +39,22 @@ impl ObnamClient { }) } + pub fn version() -> Result { + let output = Command::new("obnam") + .arg("--version") + .output() + .map_err(ObnamClientError::Run)?; + if output.status.code() != Some(0) { + eprintln!("{}", String::from_utf8_lossy(&output.stdout)); + eprintln!("{}", String::from_utf8_lossy(&output.stderr)); + std::process::exit(1); + } + + let v = String::from_utf8_lossy(&output.stdout); + let v = v.strip_suffix('\n').or(Some(&v)).unwrap().to_string(); + Ok(v) + } + pub fn run(&self, args: &[&str]) -> Result { let output = Command::new("obnam") .arg("--config") diff --git a/src/result.rs b/src/result.rs index b51a154..4a0277e 100644 --- a/src/result.rs +++ b/src/result.rs @@ -1,8 +1,18 @@ +use chrono::prelude::*; +use git_testament::{git_testament, render_testament}; use serde::Serialize; -#[derive(Debug, Default, Serialize)] +git_testament!(TESTAMENT); + +#[derive(Debug, Serialize)] pub struct SuiteMeasurements { measurements: Vec, + obnam_version: String, + obnam_benchmark_version: String, + benchmark_started: String, + hostname: String, + host_cpus: usize, + host_ram: u64, } #[derive(Debug, Serialize)] @@ -33,7 +43,37 @@ pub enum Operation { CompareManiests, } +#[derive(Debug, thiserror::Error)] +pub enum SuiteMeasurementsError { + #[error("failed to get CPU info: {0}")] + CpuInfo(procfs::ProcError), + + #[error("failed to get RAM info: {0}")] + MemInfo(procfs::ProcError), + + #[error("failed to get hostname: {0}")] + Hostname(nix::Error), +} + impl SuiteMeasurements { + pub fn new(obnam_version: String) -> Result { + let cpu = procfs::CpuInfo::new().map_err(SuiteMeasurementsError::CpuInfo)?; + let mem = procfs::Meminfo::new().map_err(SuiteMeasurementsError::MemInfo)?; + let mut buf = [0u8; 1024]; + let hostname = + nix::unistd::gethostname(&mut buf).map_err(SuiteMeasurementsError::Hostname)?; + let hostname = hostname.to_string_lossy(); + Ok(Self { + measurements: vec![], + obnam_version, + obnam_benchmark_version: render_testament!(TESTAMENT), + benchmark_started: Utc::now().to_string(), + hostname: hostname.to_string(), + host_ram: mem.mem_total, + host_cpus: cpu.num_cores(), + }) + } + pub fn push(&mut self, m: OpMeasurements) { self.measurements.push(m); } -- cgit v1.2.1