use std::time::{Duration, Instant};
use karga::{
aggregate::BasicAggregate,
executor::{Stage, StageExecutor},
metric::BasicMetric,
report::{BasicReport, StdoutReporter},
Executor, Reporter, Scenario,
};
use reqwest::Client;
#[tokio::main]
async fn main() {
tracing_subscriber::fmt().init();
let client = Client::new();
let results: BasicAggregate = StageExecutor::builder()
.stages(vec![
Stage::new(Duration::from_secs(3), 10.0),
Stage::new(Duration::from_secs(3), 100.0),
Stage::new(Duration::from_secs(3), 10.0),
])
.build()
.exec(
&Scenario::builder()
.name("Http scenario")
.action(move || {
let client = client.clone();
async move {
let start = Instant::now();
let res = client.get("http://localhost:3000").send().await;
let success = match res {
Ok(r) => r.status() == 200,
Err(_) => false,
};
let elapsed = start.elapsed();
BasicMetric {
latency: elapsed,
success,
bytes: 0,
}
}
})
.build(),
)
.await
.unwrap();
let report = BasicReport::from(results);
StdoutReporter {}.report(&report).await.unwrap();
}