dotfiles/agent/src/main.rs

61 lines
1.6 KiB
Rust
Raw Normal View History

2024-01-25 15:16:27 +00:00
use std::time::Duration;
use async_nats::{Client, ConnectOptions};
2024-01-24 23:18:30 +00:00
use tracing::Level;
2024-01-25 15:16:27 +00:00
mod health;
2024-01-24 23:18:30 +00:00
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let subscriber = tracing_subscriber::fmt()
.with_max_level(Level::TRACE)
.finish();
tracing::subscriber::set_global_default(subscriber)
.expect("to set a tracing global subscriber");
let client = ConnectOptions::new()
.name("Prymn Agent demo_agent")
.custom_inbox_prefix("_INBOX_demo_agent")
.user_and_password("demo_agent".to_owned(), "demo_agent_password".to_owned())
.connect("localhost")
.await
.map_err(|err| err)?;
tracing::info!("connected to nats server");
2024-01-25 15:16:27 +00:00
init_health_subsystem(client);
// wait_for_commands(client).await;
tokio::signal::ctrl_c().await?;
2024-01-24 23:18:30 +00:00
Ok(())
}
2024-01-25 15:16:27 +00:00
fn init_health_subsystem(client: Client) {
let system = health::System::new();
let health_monitor = health::HealthMonitor::new();
let health_monitor_clone = health_monitor.clone();
std::thread::spawn(move || loop {
const REFRESH_INTERVAL: Duration = Duration::from_secs(1);
health_monitor.check_system(&system);
std::thread::sleep(REFRESH_INTERVAL);
});
tokio::spawn(async move {
let mut recv = health_monitor_clone.monitor();
while let Ok(()) = recv.changed().await {
let payload = serde_json::to_string(&*recv.borrow()).unwrap();
tracing::info!(%payload, "sending health event");
client
.publish("agents.v1.demo_agent.health", payload.into())
.await
.unwrap();
}
});
2024-01-24 23:18:30 +00:00
}