use std::time::Duration;
use crate::args::TesterArgs;
use crate::error::AppResult;
use crate::metrics::LatencyHistogram;
use super::super::protocol::WireSummary;
use super::shared::{
AgentSnapshot, aggregate_snapshots, handle_agent_event, record_aggregated_sample, update_ui,
};
mod aggregation;
mod events;
mod ui;
fn build_hist(values: &[u64]) -> AppResult<LatencyHistogram> {
let mut hist = LatencyHistogram::new()?;
for value in values {
hist.record(*value)?;
}
Ok(hist)
}
fn base_args() -> AppResult<TesterArgs> {
Ok(TesterArgs {
command: None,
replay: false,
replay_start: None,
replay_end: None,
replay_step: None,
replay_snapshot_interval: None,
replay_snapshot_start: None,
replay_snapshot_end: None,
replay_snapshot_out: None,
replay_snapshot_format: "json".to_owned(),
method: crate::args::HttpMethod::Get,
protocol: crate::args::Protocol::Http,
load_mode: crate::args::LoadMode::Arrival,
url: Some("http://localhost".to_owned()),
urls_from_file: false,
rand_regex_url: false,
max_repeat: crate::args::PositiveUsize::try_from(4)?,
dump_urls: None,
headers: vec![],
accept_header: None,
content_type: None,
no_ua: false,
authorized: false,
data: String::new(),
form: vec![],
basic_auth: None,
aws_session: None,
aws_sigv4: None,
data_file: None,
data_lines: None,
target_duration: crate::args::PositiveU64::try_from(1)?,
wait_ongoing_requests_after_deadline: false,
requests: None,
expected_status_code: 200,
request_timeout: Duration::from_secs(2),
redirect_limit: 10,
disable_keepalive: false,
disable_compression: false,
pool_max_idle_per_host: None,
pool_idle_timeout_ms: None,
http_version: None,
connect_timeout: Duration::from_secs(5),
charts_path: "./charts".to_owned(),
no_charts: true,
charts_latency_bucket_ms: crate::args::PositiveU64::try_from(100)?,
verbose: false,
config: None,
tmp_path: "./tmp".to_owned(),
load_profile: None,
controller_listen: None,
controller_mode: crate::args::ControllerMode::Auto,
control_listen: None,
control_auth_token: None,
agent_join: None,
auth_token: None,
agent_id: None,
agent_weight: crate::args::PositiveU64::try_from(1)?,
min_agents: crate::args::PositiveUsize::try_from(1)?,
agent_wait_timeout_ms: None,
agent_standby: false,
agent_reconnect_ms: crate::args::PositiveU64::try_from(1000)?,
agent_heartbeat_interval_ms: crate::args::PositiveU64::try_from(1000)?,
agent_heartbeat_timeout_ms: crate::args::PositiveU64::try_from(3000)?,
keep_tmp: false,
warmup: None,
output: None,
output_format: None,
time_unit: None,
export_csv: None,
export_json: None,
export_jsonl: None,
db_url: None,
log_shards: crate::args::PositiveUsize::try_from(1)?,
no_ui: true,
no_splash: true,
ui_window_ms: crate::args::PositiveU64::try_from(10_000)?,
summary: false,
show_selections: false,
tls_min: None,
tls_max: None,
cacert: None,
cert: None,
key: None,
insecure: false,
http2: false,
http2_parallel: crate::args::PositiveUsize::try_from(1)?,
http3: false,
alpn: vec![],
proxy_url: None,
proxy_headers: vec![],
proxy_http_version: None,
proxy_http2: false,
max_tasks: crate::args::PositiveUsize::try_from(1)?,
spawn_rate_per_tick: crate::args::PositiveUsize::try_from(1)?,
tick_interval: crate::args::PositiveU64::try_from(100)?,
rate_limit: None,
burst_delay: None,
burst_rate: crate::args::PositiveUsize::try_from(1)?,
latency_correction: false,
connect_to: vec![],
host_header: None,
ipv6_only: false,
ipv4_only: false,
no_pre_lookup: false,
no_color: false,
ui_fps: 16,
stats_success_breakdown: false,
unix_socket: None,
metrics_range: None,
metrics_max: crate::args::PositiveUsize::try_from(1_000)?,
rss_log_ms: None,
alloc_profiler_ms: None,
alloc_profiler_dump_ms: None,
alloc_profiler_dump_path: "./alloc-prof".to_owned(),
scenario: None,
script: None,
plugin: vec![],
install_service: false,
uninstall_service: false,
service_name: None,
sinks: None,
distributed_silent: false,
distributed_stream_summaries: false,
distributed_stream_interval_ms: None,
})
}