Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit e7ed139

Browse files
committed
parser for analyze.ts
1 parent 278f83f commit e7ed139

File tree

4 files changed

+248
-0
lines changed

4 files changed

+248
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ graphql/gqlgen/main
2424
tailcall-src
2525

2626
metals.*
27+
parser/target/*

parser/Cargo.lock

Lines changed: 165 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

parser/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "parser"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[lib]
7+
crate-type = ["cdylib"]
8+
9+
[dependencies]
10+
wasm-bindgen = { version = "0.2.92" }
11+
serde = { version = "1.0", features = ["derive"] }
12+
serde-wasm-bindgen = "0.6"

parser/src/lib.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use wasm_bindgen::prelude::*;
2+
use serde::{Serialize, Deserialize};
3+
use std::collections::HashMap;
4+
5+
#[derive(Serialize, Deserialize)]
6+
pub struct ServerMetrics {
7+
req_sec: f64,
8+
latency: f64,
9+
}
10+
11+
#[wasm_bindgen]
12+
pub fn parse_server_metrics(servers: Vec<String>, result_contents: Vec<String>) -> JsValue {
13+
let server_metrics = calculate_server_metrics(&servers, &result_contents);
14+
serde_wasm_bindgen::to_value(&server_metrics).unwrap()
15+
}
16+
17+
fn calculate_server_metrics(servers: &[String], result_contents: &[String]) -> HashMap<String, ServerMetrics> {
18+
let mut server_metrics = HashMap::new();
19+
20+
for (idx, server) in servers.iter().enumerate() {
21+
let start_idx = idx * 3;
22+
let mut req_sec_vals = Vec::new();
23+
let mut latency_vals = Vec::new();
24+
25+
for j in 0..3 {
26+
let input_idx = start_idx + j;
27+
if input_idx < result_contents.len() {
28+
if let Some(req_sec) = parse_metric(&result_contents[input_idx], "Requests/sec") {
29+
req_sec_vals.push(req_sec);
30+
}
31+
if let Some(latency) = parse_metric(&result_contents[input_idx], "Latency") {
32+
latency_vals.push(latency);
33+
}
34+
}
35+
}
36+
37+
server_metrics.insert(server.clone(), ServerMetrics {
38+
req_sec: calculate_average(&req_sec_vals),
39+
latency: calculate_average(&latency_vals),
40+
});
41+
}
42+
43+
server_metrics
44+
}
45+
46+
fn parse_metric(input: &str, metric: &str) -> Option<f64> {
47+
let lines: Vec<&str> = input.lines().collect();
48+
let metric_line = lines.iter().find(|line| line.trim().starts_with(metric))?;
49+
50+
let parts: Vec<&str> = metric_line.split_whitespace().collect();
51+
match metric {
52+
"Latency" => {
53+
// Assume format: "Latency 13.08ms 5.37ms 153.52ms 88.69%"
54+
parts.get(1).and_then(|val| val.trim_end_matches("ms").parse::<f64>().ok())
55+
},
56+
"Requests/sec" => {
57+
// Assume format: "Requests/sec: 7746.27"
58+
parts.get(1).and_then(|val| val.parse::<f64>().ok())
59+
},
60+
_ => None,
61+
}
62+
}
63+
64+
fn calculate_average(values: &[f64]) -> f64 {
65+
if values.is_empty() {
66+
0.0
67+
} else {
68+
values.iter().sum::<f64>() / values.len() as f64
69+
}
70+
}

0 commit comments

Comments
 (0)