diff --git a/Cargo.toml b/Cargo.toml index 37876034e1..dc54e77c24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,10 @@ authors = [ ] license = "Apache-2.0" +[[bin]] +name = "solana-upload-perf" +path = "src/bin/upload-perf.rs" + [[bin]] name = "solana-bench-streamer" path = "src/bin/bench-streamer.rs" diff --git a/ci/test-bench.sh b/ci/test-bench.sh index 0311667206..dde3f2a0fe 100755 --- a/ci/test-bench.sh +++ b/ci/test-bench.sh @@ -10,4 +10,6 @@ _() { "$@" } -_ cargo bench --features=unstable --verbose +BENCH_FILE=bench_output.log +_ cargo +nightly bench --features=unstable --verbose -- -Z unstable-options --format=json | tee $BENCH_FILE +_ cargo run --bin solana-upload-perf -- $BENCH_FILE diff --git a/src/bin/upload-perf.rs b/src/bin/upload-perf.rs new file mode 100644 index 0000000000..eea300e804 --- /dev/null +++ b/src/bin/upload-perf.rs @@ -0,0 +1,49 @@ +extern crate influx_db_client; +extern crate serde_json; +extern crate solana; +use influx_db_client as influxdb; +use serde_json::Value; +use solana::metrics; +use std::env; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::process::Command; + +fn main() { + let args: Vec = env::args().collect(); + // Open the path in read-only mode, returns `io::Result` + let fname = &args[1]; + let file = match File::open(fname) { + Err(why) => panic!("couldn't open {}: {:?}", fname, why), + Ok(file) => file, + }; + + let git_output = Command::new("git") + .args(&["rev-parse", "HEAD"]) + .output() + .expect("failed to execute git rev-parse"); + let git_commit_hash = String::from_utf8_lossy(&git_output.stdout); + let trimmed_hash = git_commit_hash.trim().to_string(); + println!("uploading hash: {}", trimmed_hash); + + for line in BufReader::new(file).lines() { + if let Ok(v) = serde_json::from_str(&line.unwrap()) { + let v: Value = v; + if v["type"] == "bench" { + println!("{}", v); + println!(" {}", v["type"]); + let median = v["median"].to_string().parse().unwrap(); + let deviation = v["deviation"].to_string().parse().unwrap(); + metrics::submit( + influxdb::Point::new(&v["name"].to_string()) + .add_field("median", influxdb::Value::Integer(median)) + .add_field("deviation", influxdb::Value::Integer(deviation)) + .add_field( + "commit", + influxdb::Value::String(git_commit_hash.trim().to_string()), + ).to_owned(), + ); + } + } + } +}