use anyhow::Result; use kagiyama::prometheus::metrics::gauge::Gauge; use kagiyama::{AlwaysReady, Watcher}; use mtemp::Mtemp; use std::env; use std::sync::atomic::AtomicU64; use tokio::signal::ctrl_c; use tokio::spawn; use tokio::time::sleep; use tokio::time::Duration; #[tokio::main] async fn main() -> Result<()> { let interval_secs: u64 = env::var("MTEMP_INTERVAL") .unwrap_or_else(|_| "1".to_string()) .parse()?; let port = env::var("MTEMP_PORT").unwrap_or_else(|_| "9090".to_string()); let addr = format!("127.0.0.1:{}", port); let mut watcher = Watcher::::default(); watcher.start_server(addr.parse()?).await; { spawn(async move { let interval = Duration::from_secs(interval_secs); let cpu_gauge = Gauge::::default(); { let mut registry = watcher.metrics_registry(); registry.register( "cpu_temp", "Shows the temperature of the CPU in degrees C", cpu_gauge.clone(), ); } let gpu_gauge = Gauge::::default(); { let mut registry = watcher.metrics_registry(); registry.register( "gpu_temp", "Shows the temperature of the GPU in degrees C", gpu_gauge.clone(), ); } let disk_gauge = Gauge::::default(); { let mut registry = watcher.metrics_registry(); registry.register( "disk_temp", "Shows the temperature of the disk in degrees C", disk_gauge.clone(), ); } loop { sleep(interval).await; if let Some(cpu) = Mtemp::cpu() { cpu_gauge.set(cpu); } if let Some(gpu) = Mtemp::gpu() { gpu_gauge.set(gpu); } if let Some(disk) = Mtemp::disk() { disk_gauge.set(disk); } } }); } println!("interval set every {} seconds", interval_secs); println!("listening on {}", addr); ctrl_c().await?; Ok(()) }