Skip to content

Commit 2b42ed2

Browse files
authored
Merge pull request #402 from hatoo/compact-error
Compact error
2 parents 056bb9a + a3e133a commit 2b42ed2

File tree

4 files changed

+144
-115
lines changed

4 files changed

+144
-115
lines changed

src/main.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use hyper::http::{
1010
use printer::PrintMode;
1111
use rand::prelude::*;
1212
use rand_regex::Regex;
13+
use result_data::ResultData;
1314
use std::{io::Read, str::FromStr};
1415
use url::Url;
1516
use url_generator::UrlGenerator;
@@ -18,15 +19,14 @@ mod client;
1819
mod histogram;
1920
mod monitor;
2021
mod printer;
22+
mod result_data;
2123
mod timescale;
2224
mod url_generator;
2325

2426
#[cfg(unix)]
2527
#[global_allocator]
2628
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
2729

28-
use client::{ClientError, RequestResult};
29-
3030
#[derive(Parser)]
3131
#[clap(author, about, version, override_usage = "oha [FLAGS] [OPTIONS] <url>")]
3232
#[command(arg_required_else_help(true))]
@@ -427,7 +427,7 @@ async fn main() -> anyhow::Result<()> {
427427
}
428428
});
429429

430-
let mut all: Vec<Result<RequestResult, ClientError>> = Vec::new();
430+
let mut all: ResultData = Default::default();
431431
loop {
432432
tokio::select! {
433433
report = result_rx.recv_async() => {
@@ -610,7 +610,7 @@ async fn main() -> anyhow::Result<()> {
610610

611611
let duration = start.elapsed();
612612

613-
let res: Vec<Result<RequestResult, ClientError>> = data_collector.await??;
613+
let res: ResultData = data_collector.await??;
614614

615615
printer::print_result(
616616
&mut std::io::stdout(),

src/monitor.rs

+19-23
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use std::{collections::BTreeMap, io};
1818
use crate::{
1919
client::{ClientError, RequestResult},
2020
printer::PrintMode,
21+
result_data::ResultData,
2122
timescale::{TimeLabel, TimeScale},
2223
};
2324

@@ -65,7 +66,7 @@ pub struct Monitor {
6566
}
6667

6768
impl Monitor {
68-
pub async fn monitor(self) -> Result<Vec<Result<RequestResult, ClientError>>, std::io::Error> {
69+
pub async fn monitor(self) -> Result<ResultData, std::io::Error> {
6970
crossterm::terminal::enable_raw_mode()?;
7071
io::stdout().execute(crossterm::terminal::EnterAlternateScreen)?;
7172
io::stdout().execute(crossterm::cursor::Hide)?;
@@ -77,11 +78,9 @@ impl Monitor {
7778

7879
// Return this when ends to application print summary
7980
// We must not read all data from this due to computational cost.
80-
let mut all: Vec<Result<RequestResult, ClientError>> = Vec::new();
81+
let mut all: ResultData = Default::default();
8182
// stats for HTTP status
8283
let mut status_dist: BTreeMap<http::StatusCode, usize> = Default::default();
83-
// stats for Error
84-
let mut error_dist: BTreeMap<String, usize> = Default::default();
8584

8685
#[cfg(unix)]
8786
// Limit for number open files. eg. ulimit -n
@@ -100,9 +99,8 @@ impl Monitor {
10099
loop {
101100
match self.report_receiver.try_recv() {
102101
Ok(report) => {
103-
match report.as_ref() {
104-
Ok(report) => *status_dist.entry(report.status).or_default() += 1,
105-
Err(e) => *error_dist.entry(e.to_string()).or_default() += 1,
102+
if let Ok(report) = report.as_ref() {
103+
*status_dist.entry(report.status).or_default() += 1;
106104
}
107105
all.push(report);
108106
}
@@ -136,19 +134,17 @@ impl Monitor {
136134

137135
let mut bar_num_req = vec![0u64; count];
138136
let short_bin = (now - self.start).as_secs_f64() % bin;
139-
for r in all.iter().rev() {
140-
if let Ok(r) = r.as_ref() {
141-
let past = (now - r.end).as_secs_f64();
142-
let i = if past <= short_bin {
143-
0
144-
} else {
145-
1 + ((past - short_bin) / bin) as usize
146-
};
147-
if i >= bar_num_req.len() {
148-
break;
149-
}
150-
bar_num_req[i] += 1;
137+
for r in all.success.iter().rev() {
138+
let past = (now - r.end).as_secs_f64();
139+
let i = if past <= short_bin {
140+
0
141+
} else {
142+
1 + ((past - short_bin) / bin) as usize
143+
};
144+
if i >= bar_num_req.len() {
145+
break;
151146
}
147+
bar_num_req[i] += 1;
152148
}
153149

154150
let cols = bar_num_req
@@ -189,7 +185,7 @@ impl Monitor {
189185
[
190186
Constraint::Length(3),
191187
Constraint::Length(8),
192-
Constraint::Length(error_dist.len() as u16 + 2),
188+
Constraint::Length(all.error.len() as u16 + 2),
193189
Constraint::Fill(1),
194190
]
195191
.as_ref(),
@@ -224,9 +220,9 @@ impl Monitor {
224220
f.render_widget(gauge, row4[0]);
225221

226222
let last_1_timescale = all
223+
.success
227224
.iter()
228225
.rev()
229-
.filter_map(|r| r.as_ref().ok())
230226
.take_while(|r| (now - r.end).as_secs_f64() <= timescale.as_secs_f64())
231227
.collect::<Vec<_>>();
232228

@@ -316,7 +312,7 @@ impl Monitor {
316312
);
317313
f.render_widget(stats2, mid[1]);
318314

319-
let mut error_v: Vec<(String, usize)> = error_dist.clone().into_iter().collect();
315+
let mut error_v: Vec<(String, usize)> = all.error.clone().into_iter().collect();
320316
error_v.sort_by_key(|t| std::cmp::Reverse(t.1));
321317
let errors_text = error_v
322318
.into_iter()
@@ -370,9 +366,9 @@ impl Monitor {
370366
}
371367
.max(2);
372368
let values = all
369+
.success
373370
.iter()
374371
.rev()
375-
.filter_map(|r| r.as_ref().ok())
376372
.take_while(|r| (now - r.end).as_secs_f64() < timescale.as_secs_f64())
377373
.map(|r| r.duration().as_secs_f64())
378374
.collect::<Vec<_>>();

0 commit comments

Comments
 (0)