use std::time::Duration;
use anyhow::Result;
use async_trait::async_trait;
use clap::Parser;
use rlt::{IterInfo, IterReport, StatelessBenchSuite, Status, cli::BenchCli};
use tokio::time::Instant;
#[derive(Parser, Clone)]
struct Opts {
#[clap(long, default_value = "50ms")]
latency: humantime::Duration,
#[command(flatten)]
bench: BenchCli,
}
#[derive(Clone)]
struct BaselineDemo {
base_latency: Duration,
}
#[async_trait]
impl StatelessBenchSuite for BaselineDemo {
async fn bench(&mut self, info: &IterInfo) -> Result<IterReport> {
let t = Instant::now();
let variance = Duration::from_micros(info.runner_seq % 20);
let latency = self.base_latency.saturating_add(variance);
tokio::time::sleep(latency).await;
let duration = t.elapsed();
Ok(IterReport {
duration,
status: Status::success(200),
bytes: 1024,
items: 1,
})
}
}
#[tokio::main]
async fn main() -> Result<()> {
let opts = Opts::parse();
let bench = BaselineDemo { base_latency: opts.latency.into() };
rlt::cli::run(opts.bench, bench).await
}