in src/server.rs [1693:1849]
fn print<T: ServerStatsWriter>(&self, writer: &mut T, advanced: bool) -> (usize, usize) {
macro_rules! set_stat {
($vec:ident, $var:expr, $name:expr) => {{
// name, value, suffix length
$vec.push(($name.to_string(), $var.to_string(), 0));
}};
}
macro_rules! set_lang_stat {
($vec:ident, $var:expr, $name:expr) => {{
$vec.push(($name.to_string(), $var.all().to_string(), 0));
let mut sorted_stats: Vec<_> = $var.counts.iter().collect();
sorted_stats.sort_by_key(|v| v.0);
for (lang, count) in sorted_stats.iter() {
$vec.push((format!("{} ({})", $name, lang), count.to_string(), 0));
}
}};
}
macro_rules! set_compiler_stat {
($vec:ident, $var:expr, $name:expr) => {{
$vec.push(($name.to_string(), $var.all().to_string(), 0));
let mut sorted_stats: Vec<_> = $var.adv_counts.iter().collect();
sorted_stats.sort_by_key(|v| v.0);
for (lang, count) in sorted_stats.iter() {
$vec.push((format!("{} ({})", $name, lang), count.to_string(), 0));
}
}};
}
macro_rules! set_duration_stat {
($vec:ident, $dur:expr, $num:expr, $name:expr) => {{
let s = if $num > 0 {
$dur / $num as u32
} else {
Default::default()
};
// name, value, suffix length
$vec.push(($name.to_string(), util::fmt_duration_as_secs(&s), 2));
}};
}
let mut stats_vec = vec![];
//TODO: this would be nice to replace with a custom derive implementation.
set_stat!(stats_vec, self.compile_requests, "Compile requests");
set_stat!(
stats_vec,
self.requests_executed,
"Compile requests executed"
);
if advanced {
set_compiler_stat!(stats_vec, self.cache_hits, "Cache hits");
set_compiler_stat!(stats_vec, self.cache_misses, "Cache misses");
} else {
set_lang_stat!(stats_vec, self.cache_hits, "Cache hits");
set_lang_stat!(stats_vec, self.cache_misses, "Cache misses");
}
self.set_percentage_stats(&mut stats_vec, advanced);
set_stat!(stats_vec, self.cache_timeouts, "Cache timeouts");
set_stat!(stats_vec, self.cache_read_errors, "Cache read errors");
set_stat!(stats_vec, self.forced_recaches, "Forced recaches");
set_stat!(stats_vec, self.cache_write_errors, "Cache write errors");
if advanced {
set_compiler_stat!(stats_vec, self.cache_errors, "Cache errors");
} else {
set_lang_stat!(stats_vec, self.cache_errors, "Cache errors");
}
set_stat!(stats_vec, self.compilations, "Compilations");
set_stat!(stats_vec, self.compile_fails, "Compilation failures");
set_stat!(
stats_vec,
self.non_cacheable_compilations,
"Non-cacheable compilations"
);
set_stat!(
stats_vec,
self.requests_not_cacheable,
"Non-cacheable calls"
);
set_stat!(
stats_vec,
self.requests_not_compile,
"Non-compilation calls"
);
set_stat!(
stats_vec,
self.requests_unsupported_compiler,
"Unsupported compiler calls"
);
set_duration_stat!(
stats_vec,
self.cache_write_duration,
self.cache_writes,
"Average cache write"
);
set_duration_stat!(
stats_vec,
self.compiler_write_duration,
self.compilations,
"Average compiler"
);
set_duration_stat!(
stats_vec,
self.cache_read_hit_duration,
self.cache_hits.all(),
"Average cache read hit"
);
set_stat!(
stats_vec,
self.dist_errors,
"Failed distributed compilations"
);
let name_width = stats_vec.iter().map(|(n, _, _)| n.len()).max().unwrap();
let stat_width = stats_vec.iter().map(|(_, s, _)| s.len()).max().unwrap();
for (name, stat, suffix_len) in stats_vec {
writer.write(&format!(
"{:<name_width$} {:>stat_width$}",
name,
stat,
name_width = name_width,
stat_width = stat_width + suffix_len
));
}
if !self.dist_compiles.is_empty() {
writer.write("\nSuccessful distributed compiles");
let mut counts: Vec<_> = self.dist_compiles.iter().collect();
counts.sort_by(|(_, c1), (_, c2)| c1.cmp(c2).reverse());
for (reason, count) in counts {
writer.write(&format!(
" {:<name_width$} {:>stat_width$}",
reason,
count,
name_width = name_width - 2,
stat_width = stat_width,
));
}
}
if !self.not_cached.is_empty() {
writer.write("\nNon-cacheable reasons:");
let mut counts: Vec<_> = self.not_cached.iter().collect();
counts.sort_by(|(_, c1), (_, c2)| c1.cmp(c2).reverse());
for (reason, count) in counts {
writer.write(&format!(
"{:<name_width$} {:>stat_width$}",
reason,
count,
name_width = name_width,
stat_width = stat_width,
));
}
writer.write("");
}
(name_width, stat_width)
}