added RTT warning

master
Edward Shen 2019-05-02 20:30:02 -04:00
parent 39d932c949
commit ddab660945
Signed by: edward
GPG Key ID: F350507060ED6C90
1 changed files with 37 additions and 27 deletions

View File

@ -51,59 +51,58 @@ fn get_result(
) -> EndpointStatus { ) -> EndpointStatus {
let (label, path, port, code, body) = get_endpoint_info(endpoint.clone()); let (label, path, port, code, body) = get_endpoint_info(endpoint.clone());
let url = get_url(&website_conf.base, &path, port).expect("reading config"); let url = get_url(&website_conf.base, &path, port).expect("reading config");
let ping_start = Utc::now(); let ping_start = Utc::now();
let ping_result = client.get(&url).send(); let ping_result = client.get(&url).send();
let duration = Utc::now() - ping_start; let rtt = Utc::now() - ping_start;
let duration = if duration.num_seconds() > 0 { let rtt_string = if rtt.num_seconds() > 0 {
format!("{}s", duration.num_milliseconds() as f64 / 1000.) format!("{}s", rtt.num_milliseconds() as f64 / 1000.)
} else { } else {
format!("{}ms", duration.num_milliseconds()) format!("{}ms", rtt.num_milliseconds())
}; };
match ping_result { match ping_result {
Ok(mut res) => { Ok(mut res) => {
let res_body = res.text().expect("could not get body of request"); let res_body = res.text().expect("could not get body of request");
let mut error = None; let mut error = None;
if res.status() != code { if res.status() != code {
error = Some(format!( error = append_err_msg(
"Status code mismatch: {} != {}.", error,
res.status().as_u16(), format!(
code "Status code mismatch: {} != {}.",
)); res.status().as_u16(),
code
),
);
} }
if let Some(expected_hash) = &endpoint.body_hash { if let Some(expected_hash) = &endpoint.body_hash {
let expected = from_hex(expected_hash).unwrap(); let expected = from_hex(expected_hash).unwrap();
let actual = digest(&SHA256, String::from(res_body).as_bytes()); let actual = digest(&SHA256, String::from(res_body).as_bytes());
if &expected != &actual.as_ref() { if &expected != &actual.as_ref() {
error = Some(if let Some(msg) = error { error = append_err_msg(error, String::from("Body hash mismatch."));
format!("{} Body hash mismatch.", msg)
} else {
String::from("Body hash mismatch.")
});
} }
} else if !body.is_empty() && res_body != body { } else if !body.is_empty() && res_body != body {
error = Some(if let Some(msg) = error { error = append_err_msg(
format!( error,
"{} Body mismatch: {} != {}.", format!("Body mismatch: {} != {}.", res_body.len(), body.len()),
msg, );
res_body.len(), }
body.len()
) if rtt.num_seconds() >= 2 {
} else { error = append_err_msg(error, format!("RTT too long: {}", rtt_string));
format!("Body mismatch: {} != {}.", res_body.len(), body.len())
});
} }
if error.is_some() { if error.is_some() {
EndpointStatus::warn(url, label, duration, error) EndpointStatus::warn(url, label, rtt_string, error)
} else { } else {
EndpointStatus::ok(url, label, duration) EndpointStatus::ok(url, label, rtt_string)
} }
} }
Err(e) => { Err(e) => {
if let Some(true) = endpoint.should_err { if let Some(true) = endpoint.should_err {
EndpointStatus::ok(url, label, duration) EndpointStatus::ok(url, label, rtt_string)
} else { } else {
EndpointStatus::error(url, label, Some(format!("{}", e))) EndpointStatus::error(url, label, Some(format!("{}", e)))
} }
@ -122,3 +121,14 @@ fn get_url(base: &Option<String>, path: &String, port: Option<u16>) -> Result<St
} }
Ok(url.into_string()) Ok(url.into_string())
} }
fn append_err_msg(optional: Option<String>, to_append: String) -> Option<String> {
// Turns out Rust doesn't recognize that only one of the FnOnce occurs, so
// as a result both closures want ownership of to_append
// Some(optional.map_or_else(|| to_append, |msg| format!("{} {}", msg, to_append)))
Some(match optional {
Some(e) => format!("{} {}", e, to_append),
None => to_append,
})
}