2024-02-03 14:50:04 +01:00
|
|
|
use anyhow::{anyhow, Context, Result};
|
|
|
|
use daemonize::Daemonize;
|
2024-02-03 13:28:08 +01:00
|
|
|
use kagiyama::prometheus::metrics::gauge::Gauge;
|
|
|
|
use kagiyama::{AlwaysReady, Watcher};
|
|
|
|
use mtemp::Mtemp;
|
|
|
|
use std::env;
|
2024-02-03 14:50:04 +01:00
|
|
|
use std::fs::File;
|
2024-02-03 13:28:08 +01:00
|
|
|
use std::sync::atomic::AtomicU64;
|
|
|
|
use tokio::time::sleep;
|
|
|
|
use tokio::time::Duration;
|
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
fn main() -> Result<()> {
|
|
|
|
let name = "mtemp-monitor";
|
|
|
|
let stdout = File::create(format!("/tmp/{}.log", name)).context("Error creating log file")?;
|
|
|
|
let daemonize = Daemonize::new()
|
|
|
|
.pid_file(format!("/tmp/{}.pid", name))
|
|
|
|
.stdout(stdout)
|
|
|
|
.chown_pid_file(true)
|
|
|
|
.working_directory("/");
|
|
|
|
|
|
|
|
match daemonize.start() {
|
|
|
|
Ok(_) => {
|
|
|
|
println!("daemon started");
|
|
|
|
tokio_main()
|
|
|
|
}
|
|
|
|
Err(err) => Err(anyhow!("{:?}", err)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-03 13:28:08 +01:00
|
|
|
#[tokio::main]
|
2024-02-03 14:50:04 +01:00
|
|
|
async fn tokio_main() -> Result<()> {
|
2024-02-03 13:28:08 +01:00
|
|
|
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::<AlwaysReady>::default();
|
|
|
|
watcher.start_server(addr.parse()?).await;
|
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
let interval = Duration::from_secs(interval_secs);
|
2024-02-03 13:28:08 +01:00
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
let cpu_gauge = Gauge::<f64, AtomicU64>::default();
|
|
|
|
{
|
|
|
|
let mut registry = watcher.metrics_registry();
|
|
|
|
registry.register(
|
|
|
|
"cpu_temp",
|
|
|
|
"Shows the temperature of the CPU in degrees C",
|
|
|
|
cpu_gauge.clone(),
|
|
|
|
);
|
|
|
|
}
|
2024-02-03 13:28:08 +01:00
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
let gpu_gauge = Gauge::<f64, AtomicU64>::default();
|
|
|
|
{
|
|
|
|
let mut registry = watcher.metrics_registry();
|
|
|
|
registry.register(
|
|
|
|
"gpu_temp",
|
|
|
|
"Shows the temperature of the GPU in degrees C",
|
|
|
|
gpu_gauge.clone(),
|
|
|
|
);
|
|
|
|
}
|
2024-02-03 13:28:08 +01:00
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
let disk_gauge = Gauge::<f64, AtomicU64>::default();
|
|
|
|
{
|
|
|
|
let mut registry = watcher.metrics_registry();
|
|
|
|
registry.register(
|
|
|
|
"disk_temp",
|
|
|
|
"Shows the temperature of the disk in degrees C",
|
|
|
|
disk_gauge.clone(),
|
|
|
|
);
|
2024-02-03 13:28:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
println!("interval set every {} seconds", interval_secs);
|
|
|
|
println!("listening on {}", addr);
|
|
|
|
|
2024-02-03 14:50:04 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2024-02-03 13:28:08 +01:00
|
|
|
}
|