rust_supervisor/runtime/
watchdog.rs1use crate::runtime::lifecycle::{RuntimeControlPlane, RuntimeControlPlaneState, RuntimeExitReport};
7use tokio::sync::broadcast;
8use tokio::task::JoinHandle;
9
10#[derive(Debug, Clone, Copy)]
12pub struct RuntimeWatchdog;
13
14impl RuntimeWatchdog {
15 pub fn publish_started(
26 control_plane: RuntimeControlPlane,
27 event_sender: broadcast::Sender<String>,
28 ) {
29 control_plane.mark_alive();
30 let _ignored = event_sender.send("runtime_control_loop_started:startup".to_owned());
31 }
32
33 pub fn spawn(
45 control_plane: RuntimeControlPlane,
46 join_handle: JoinHandle<RuntimeExitReport>,
47 event_sender: broadcast::Sender<String>,
48 ) {
49 tokio::spawn(async move {
50 let report = match join_handle.await {
51 Ok(report) => report,
52 Err(error) => RuntimeExitReport::failed(
53 "watchdog",
54 format!("runtime control loop panic or cancellation: {error}"),
55 error.is_panic(),
56 true,
57 ),
58 };
59 let report = control_plane.complete(report);
60 let event_name = match report.state {
61 RuntimeControlPlaneState::Completed => "runtime_control_loop_completed",
62 RuntimeControlPlaneState::Failed => "runtime_control_loop_failed",
63 RuntimeControlPlaneState::Starting
64 | RuntimeControlPlaneState::Alive
65 | RuntimeControlPlaneState::ShuttingDown => "runtime_control_loop_unexpected",
66 };
67 let _ignored =
68 event_sender.send(format!("{event_name}:{}:{}", report.phase, report.reason));
69 });
70 }
71}