From e7ed139f541f114d271ec67c24920d086c452219 Mon Sep 17 00:00:00 2001 From: daveads Date: Fri, 9 Aug 2024 04:15:04 +0100 Subject: [PATCH] parser for analyze.ts --- .gitignore | 1 + parser/Cargo.lock | 165 ++++++++++++++++++++++++++++++++++++++++++++++ parser/Cargo.toml | 12 ++++ parser/src/lib.rs | 70 ++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 parser/Cargo.lock create mode 100644 parser/Cargo.toml create mode 100644 parser/src/lib.rs diff --git a/.gitignore b/.gitignore index 1ecfb42c..eb2fcc38 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ graphql/gqlgen/main tailcall-src metals.* +parser/target/* diff --git a/parser/Cargo.lock b/parser/Cargo.lock new file mode 100644 index 00000000..751118ed --- /dev/null +++ b/parser/Cargo.lock @@ -0,0 +1,165 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parser" +version = "0.1.0" +dependencies = [ + "serde", + "serde-wasm-bindgen", + "wasm-bindgen", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" diff --git a/parser/Cargo.toml b/parser/Cargo.toml new file mode 100644 index 00000000..327a0870 --- /dev/null +++ b/parser/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "parser" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +wasm-bindgen = { version = "0.2.92" } +serde = { version = "1.0", features = ["derive"] } +serde-wasm-bindgen = "0.6" diff --git a/parser/src/lib.rs b/parser/src/lib.rs new file mode 100644 index 00000000..5d245998 --- /dev/null +++ b/parser/src/lib.rs @@ -0,0 +1,70 @@ +use wasm_bindgen::prelude::*; +use serde::{Serialize, Deserialize}; +use std::collections::HashMap; + +#[derive(Serialize, Deserialize)] +pub struct ServerMetrics { + req_sec: f64, + latency: f64, +} + +#[wasm_bindgen] +pub fn parse_server_metrics(servers: Vec, result_contents: Vec) -> JsValue { + let server_metrics = calculate_server_metrics(&servers, &result_contents); + serde_wasm_bindgen::to_value(&server_metrics).unwrap() +} + +fn calculate_server_metrics(servers: &[String], result_contents: &[String]) -> HashMap { + let mut server_metrics = HashMap::new(); + + for (idx, server) in servers.iter().enumerate() { + let start_idx = idx * 3; + let mut req_sec_vals = Vec::new(); + let mut latency_vals = Vec::new(); + + for j in 0..3 { + let input_idx = start_idx + j; + if input_idx < result_contents.len() { + if let Some(req_sec) = parse_metric(&result_contents[input_idx], "Requests/sec") { + req_sec_vals.push(req_sec); + } + if let Some(latency) = parse_metric(&result_contents[input_idx], "Latency") { + latency_vals.push(latency); + } + } + } + + server_metrics.insert(server.clone(), ServerMetrics { + req_sec: calculate_average(&req_sec_vals), + latency: calculate_average(&latency_vals), + }); + } + + server_metrics +} + +fn parse_metric(input: &str, metric: &str) -> Option { + let lines: Vec<&str> = input.lines().collect(); + let metric_line = lines.iter().find(|line| line.trim().starts_with(metric))?; + + let parts: Vec<&str> = metric_line.split_whitespace().collect(); + match metric { + "Latency" => { + // Assume format: "Latency 13.08ms 5.37ms 153.52ms 88.69%" + parts.get(1).and_then(|val| val.trim_end_matches("ms").parse::().ok()) + }, + "Requests/sec" => { + // Assume format: "Requests/sec: 7746.27" + parts.get(1).and_then(|val| val.parse::().ok()) + }, + _ => None, + } +} + +fn calculate_average(values: &[f64]) -> f64 { + if values.is_empty() { + 0.0 + } else { + values.iter().sum::() / values.len() as f64 + } +}