#[allow(unused)]
use {
clap::Parser,
infomgr_con::util::{
cpuload::{CpuReport, CpuTime, CpuTimeDiff},
meminfo::{MemInfo, MemoryReport},
report::{InfomgrRawReport, InfomgrReport},
InfoCon,
},
jlogger_tracing::{jdebug, jerror, jinfo, jwarn, JloggerBuilder, LevelFilter},
std::io::{Error, ErrorKind, Result},
std::sync::{mpsc, Arc},
};
#[cfg(feature = "enable_ipcon")]
use infomgr_con::util::ipcon::IpconInfomgr;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about=None)]
struct Cli {
#[clap(short, long, default_value_t=String::from("fake"))]
name: String,
#[clap(short, long, default_value_t = 1)]
interval: u64,
#[clap(short, long)]
raw: bool,
}
#[allow(unused)]
fn report(name: String, interval: u64) {
let name = Arc::new(name);
let (sender, receiver) = mpsc::channel();
cfg_if::cfg_if! {
if #[cfg(feature = "enable_ipcon")] {
let mut ipcon: IpconInfomgr = Default::default();
let _ = ipcon.sender(name, receiver);
} else {
let _ = std::thread::spawn(move || -> Result<()> {
loop {
let ir = receiver.recv()
.map_err(|e| Error::new(ErrorKind::ConnectionReset, format!("{}",e)))?;
println!("{}", ir);
}
});
}
}
let mut cpu_start = CpuTime::new().unwrap();
loop {
std::thread::sleep(std::time::Duration::from_secs(interval));
let cpu_end = CpuTime::new().unwrap();
let mut report: InfomgrReport = InfomgrReport {
cpu: (cpu_end - cpu_start).cpu_report(),
memory: MemInfo::load(),
};
report.memory = MemInfo::load();
if sender.send(report).is_err() {
break;
}
cpu_start = cpu_end;
}
}
#[allow(unused)]
fn raw_report(name: String, interval: u64) {
let name = Arc::new(name);
let (sender, receiver) = mpsc::channel();
cfg_if::cfg_if! {
if #[cfg(feature = "enable_ipcon")] {
let mut ipcon: IpconInfomgr = Default::default();
let _ = ipcon.sender(name, receiver);
} else {
let _ = std::thread::spawn(move || -> Result<()> {
loop {
let ir = receiver.recv()
.map_err(|e| Error::new(ErrorKind::ConnectionReset, format!("{}",e)))?;
println!("{}", ir);
}
});
}
}
loop {
let mut report: InfomgrRawReport = Default::default();
let cpu = CpuTime::new().unwrap();
report.cpu = cpu;
report.memory = MemInfo::load();
if sender.send(report).is_err() {
break;
}
std::thread::sleep(std::time::Duration::from_secs(interval));
}
}
fn main() {
let cli = Cli::parse();
JloggerBuilder::new().build();
if cli.raw {
raw_report(cli.name, cli.interval);
} else {
report(cli.name, cli.interval);
}
}