pub use tokio::pin;
pub use tokio::select;
pub use tokio::task;
-pub use tokio::time::Duration;
+pub use tokio::time::{Duration, Instant};
pub use void::{self, Void, ResultVoidExt, ResultVoidErrExt};
pub use crate::config::{self, InstanceConfig, u32Ext as _};
pub struct Reporter<'r> {
ic: &'r InstanceConfig,
+ successes: u64,
+ last_report: Option<Report>,
}
+#[derive(Debug)]
+struct Report {
+ when: Instant,
+ ok: Result<(),()>,
+}
+
// Reporting strategy
// - report all errors
// - report first success after a period of lack of messages
impl<'r> Reporter<'r> {
pub fn new(ic: &'r InstanceConfig) -> Self { Reporter {
- ic
+ ic,
+ successes: 0,
+ last_report: None,
} }
pub fn success(&mut self) {
- info!("{}: success", self.ic); // xxx
+ self.successes += 1;
+ let now = Instant::now();
+ if let Some(rep) = &self.last_report {
+ if now - rep.when < match rep.ok {
+ Ok(()) => Duration::from_secs(3600),
+ Err(()) => Duration::from_secs(30),
+ } {
+ return
+ }
+ }
+
+ info!("{} ({}ok): running", self.ic, self.successes);
+ self.last_report = Some(Report { when: now, ok: Ok(()) });
}
+
pub fn filter<T>(&mut self, req_num: Option<ReqNum>, r: Result<T,AE>)
-> Option<T> {
+ let now = Instant::now();
match r {
Ok(t) => {
// xxx something something success
if let Some(req_num) = req_num {
write!(m, " #{}", req_num)?;
}
+ if self.successes > 0 {
+ write!(m, " ({}ok)", self.successes)?;
+ self.successes = 0;
+ }
write!(m, ": {:?}", e)?;
Ok::<_,fmt::Error>(m)
})().unwrap();
warn!("{}", m);
+ self.last_report = Some(Report { when: now, ok: Err(()) });
None
},
}