iota_aws_orchestrator/
logs.rs1use std::cmp::max;
6
7use crate::display;
8
9#[derive(Default)]
11pub struct LogsAnalyzer {
12 pub node_errors: usize,
14 pub node_panic: bool,
16 pub client_errors: usize,
18 pub client_panic: bool,
20}
21
22impl LogsAnalyzer {
23 pub fn set_node_errors(&mut self, log: &str) {
25 self.node_errors = log.matches(" ERROR").count();
26 self.node_panic = log.contains("panic");
27 }
28
29 pub fn set_client_errors(&mut self, log: &str) {
31 self.client_errors = max(self.client_errors, log.matches(" ERROR").count());
32 self.client_panic = log.contains("panic");
33 }
34
35 pub fn aggregate(counters: Vec<Self>) -> Self {
38 let mut highest = Self::default();
39 for counter in counters {
40 if counter.node_panic || counter.client_panic {
41 return counter;
42 } else if counter.client_errors > highest.client_errors
43 || counter.node_errors > highest.node_errors
44 {
45 highest = counter;
46 }
47 }
48 highest
49 }
50
51 pub fn print_summary(&self) {
53 if self.node_panic {
54 display::error("Node(s) panicked!");
55 } else if self.client_panic {
56 display::error("Client(s) panicked!");
57 } else if self.node_errors != 0 || self.client_errors != 0 {
58 display::newline();
59 display::warn(format!(
60 "Logs contain errors (node: {}, client: {})",
61 self.node_errors, self.client_errors
62 ));
63 }
64 }
65}