1 // Copyright 2021 Ian Jackson and contributors to Hippotat
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 // There is NO WARRANTY.
7 #[derive(StructOpt,Debug)]
9 /// Increase debug level
10 #[structopt(long, short="D", parse(from_occurrences))]
16 pub fn log_init(&self) {
17 let env = env_logger::Env::new()
18 .filter("HIPPOTAT_LOG")
19 .write_style("HIPPOTAT_LOG_STYLE");
21 let mut logb = env_logger::Builder::new();
22 logb.filter(Some("hippotat"),
23 *[ log::LevelFilter::Info,
24 log::LevelFilter::Debug ]
27 &log::LevelFilter::Trace
34 // For clients only, really.
35 pub struct Reporter<'r> {
36 ic: &'r InstanceConfig,
38 last_report: Option<Report>,
48 // - report all errors
49 // - report first success after a period of lack of messages
50 // - if error, report last success
52 impl<'r> Reporter<'r> {
53 pub fn new(ic: &'r InstanceConfig) -> Self { Reporter {
59 pub fn success(&mut self) {
61 let now = Instant::now();
62 if let Some(rep) = &self.last_report {
63 if now - rep.when < match rep.ok {
64 Ok(()) => match self.ic.success_report_interval {
65 z if z == Duration::default() => return,
68 Err(()) => self.ic.effective_http_timeout,
74 info!(target:"hippotat", "{} ({}ok): running", self.ic, self.successes);
75 self.last_report = Some(Report { when: now, ok: Ok(()) });
78 pub fn filter<T>(&mut self, req_num: Option<ReqNum>, r: Result<T,AE>)
80 let now = Instant::now();
87 let mut m = self.ic.to_string();
88 if let Some(req_num) = req_num {
89 write!(m, " #{}", req_num)?;
91 if self.successes > 0 {
92 write!(m, " ({}ok)", self.successes)?;
95 write!(m, ": {}", e)?;
98 warn!(target:"hippotat", "{:?}", m);
99 self.last_report = Some(Report { when: now, ok: Err(()) });
106 struct EyreDedupHandler;
107 type EyreDynError<'r> = &'r (dyn std::error::Error + 'static);
109 impl eyre::EyreHandler for EyreDedupHandler {
110 #[throws(fmt::Error)]
111 fn debug(&self, error: EyreDynError, f: &mut fmt::Formatter) {
112 Debug::fmt(error, f)?;
114 #[throws(fmt::Error)]
115 fn display(&self, error: EyreDynError, f: &mut fmt::Formatter) {
116 Display::fmt(error, f)?;
121 pub fn dedup_eyre_setup() {
122 eyre::set_hook(Box::new(|_error| Box::new(EyreDedupHandler)))
123 .context("set error handler")?;