chiark / gitweb /
report, wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Aug 2021 00:21:26 +0000 (01:21 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 4 Aug 2021 00:21:26 +0000 (01:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/prelude.rs
src/reporter.rs

index a133343af004e287e979d9788b858cf3f3d51743..c60db81e50b10645e86482c3b8fb3ff8d82ad692 100644 (file)
@@ -41,7 +41,7 @@ pub use tokio::io::{AsyncBufReadExt, AsyncWriteExt};
 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 _};
index 68f929d907cb8582bbea17be715b18693c1417d5..915d7e7057bf0c18cccec26c00bb9b1bcb94844a 100644 (file)
@@ -6,8 +6,16 @@ use crate::prelude::*;
 
 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
@@ -15,14 +23,30 @@ pub struct Reporter<'r> {
 
 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
@@ -35,10 +59,15 @@ impl<'r> Reporter<'r> {
           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
       },
     }