Skip to content

Commit

Permalink
Merge pull request #1 from copyleftdev/feature/realtime-stats
Browse files Browse the repository at this point in the history
added reporting
  • Loading branch information
copyleftdev committed Jul 8, 2024
2 parents 1afbe4a + 7e07447 commit ed39382
Showing 1 changed file with 55 additions and 1 deletion.
56 changes: 55 additions & 1 deletion src/load_testers/tcp.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::net::TcpStream;
use std::io::{Write, Read};
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
use std::sync::{Arc, Mutex};
use std::sync::{Arc, Mutex, atomic::{AtomicUsize, Ordering}};
use std::thread;
use rand::Rng;
use crate::metrics::{RequestMetrics, LoadTestReport};
Expand All @@ -10,12 +10,18 @@ use crate::config::Config;
pub fn perform_load_test(config: &Config) -> LoadTestReport {
let end_time = Instant::now() + Duration::from_secs(config.duration);
let requests = Arc::new(Mutex::new(Vec::new()));
let success_count = Arc::new(AtomicUsize::new(0));
let fail_count = Arc::new(AtomicUsize::new(0));
let total_jitter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];

let duration_per_request = Duration::from_millis(1000 / config.rps as u64);

for _ in 0..config.rps {
let requests = Arc::clone(&requests);
let success_count = Arc::clone(&success_count);
let fail_count = Arc::clone(&fail_count);
let total_jitter = Arc::clone(&total_jitter);
let host = config.host.clone();
let port = config.port;
let payload = config.payload.clone();
Expand Down Expand Up @@ -52,13 +58,30 @@ pub fn perform_load_test(config: &Config) -> LoadTestReport {
timestamp,
});

// Update counters
if success {
success_count.fetch_add(1, Ordering::SeqCst);
} else {
fail_count.fetch_add(1, Ordering::SeqCst);
}

// Calculate jitter
let jitter_value = rng.gen_range(0..jitter);
total_jitter.fetch_add(jitter_value as usize, Ordering::SeqCst);

// Print the status of each request with emojis and jitter
let sleep_duration = duration_per_request + Duration::from_millis(jitter_value);
let elapsed = start_time.elapsed();

if sleep_duration > elapsed {
thread::sleep(sleep_duration - elapsed);
}

// Update the static log output
let total_requests = success_count.load(Ordering::SeqCst) + fail_count.load(Ordering::SeqCst);
let average_jitter = total_jitter.load(Ordering::SeqCst) as f64 / total_requests as f64;
print!("\rTotal Requests: {} | Successful: {} ✅ | Failed: {} ❌ | Average Jitter: {:.2} ms", total_requests, success_count.load(Ordering::SeqCst), fail_count.load(Ordering::SeqCst), average_jitter);
let _ = std::io::stdout().flush();
}
});

Expand All @@ -71,6 +94,10 @@ pub fn perform_load_test(config: &Config) -> LoadTestReport {

let requests = Arc::try_unwrap(requests).unwrap().into_inner().unwrap();

// Generate and print the final report
let report = generate_final_report(&requests, config);
println!("\n{}", report);

LoadTestReport {
host: config.host.clone(),
port: config.port,
Expand All @@ -80,3 +107,30 @@ pub fn perform_load_test(config: &Config) -> LoadTestReport {
requests,
}
}

fn generate_final_report(requests: &[RequestMetrics], config: &Config) -> String {
let total_requests = requests.len();
let successful_requests = requests.iter().filter(|r| r.success).count();
let failed_requests = total_requests - successful_requests;
let average_response_time: f64 = requests.iter().map(|r| r.response_time).sum::<u64>() as f64 / total_requests as f64;

format!(
"\n==================== 📝 Final Report ====================\n\
📅 Duration: {} seconds\n\
🏷️ Host: {}\n\
🚪 Port: {}\n\
🔄 Requests per Second (RPS): {}\n\
📦 Payload: {}\n\
🌐 Load Test Type: {}\n\
\n\
📊 **Metrics**:\n\
- Total Requests: **{}**\n\
- Successful Requests: **{}** ✅\n\
- Failed Requests: **{}** ❌\n\
- Average Response Time: **{:.2}** μs\n\
\n\
==========================================================",
config.duration, config.host, config.port, config.rps, config.payload, config.load_test_type,
total_requests, successful_requests, failed_requests, average_response_time
)
}

0 comments on commit ed39382

Please sign in to comment.