provider_agent/
heartbeat.rs1use std::time::Duration;
6
7use serde_json::json;
8use tokio::sync::mpsc;
9use tokio_tungstenite::tungstenite::Message;
10use tracing::{debug, warn};
11
12const INTERVAL: Duration = Duration::from_secs(15);
13
14pub async fn spawn_loop(out: mpsc::Sender<Message>) {
15 let mut ticker = tokio::time::interval(INTERVAL);
16 ticker.tick().await;
18
19 loop {
20 ticker.tick().await;
21 let payload = json!({
22 "type": "heartbeat",
23 "queue_depth": 0_u32,
24 "tokens_per_sec_p50": 0.0_f64,
25 "p50_latency_ms": 0_u32,
26 "p95_latency_ms": 0_u32,
27 "error_rate_60s": 0.0_f64,
28 "last_error_at": serde_json::Value::Null,
29 "last_error_code": serde_json::Value::Null,
30 });
31 match out.send(Message::Text(payload.to_string().into())).await {
32 Ok(()) => debug!("heartbeat sent"),
33 Err(_) => {
34 warn!("heartbeat channel closed; exiting heartbeat loop");
35 break;
36 }
37 }
38 }
39}