diff --git a/traffic_core/src/daemon.rs b/traffic_core/src/daemon.rs index aad3c55..aaef88f 100644 --- a/traffic_core/src/daemon.rs +++ b/traffic_core/src/daemon.rs @@ -89,21 +89,15 @@ pub fn run(cfg: Config) -> anyhow::Result<()> { let events_state = state.clone(); thread::spawn(move || { loop { - match docker_events_loop(&events_cfg, &events_state) { - Ok(()) => { - set_err( - &events_state, - "docker_events", - "docker events stream ended, restarting".to_string(), - ); - } - Err(e) => { - set_err( - &events_state, - "docker_events", - format!("docker events loop crashed: {e}"), - ); - } + let reason = match docker_events_loop(&events_cfg, &events_state) { + Ok(()) => "docker events stream ended, restarting".to_string(), + Err(e) => format!("docker events loop crashed: {e}"), + }; + // The reconnect writes its recovery, so the failure has to be written too. The + // journal is documented as holding transitions in both directions, and dropping + // this one left it showing a recovery from a failure it never recorded. + if set_err(&events_state, "docker_events", reason.clone()) { + append_event(&format!("docker_events=error error=\"{reason}\"")); } thread::sleep(Duration::from_secs(10)); }