in src/main.rs [32:123]
fn main() -> Result<(), Box<dyn std::error::Error>> {
// get config
let config = Arc::new(Config::new());
// initialize logging
Logger::new()
.label(common::NAME)
.level(config.logging())
.init()
.expect("Failed to initialize logger");
info!("----------");
info!("{} {}", common::NAME, common::VERSION);
info!("----------");
debug!("host cores: {}", hardware_threads().unwrap_or(1));
let runnable = Arc::new(AtomicBool::new(true));
let r = runnable.clone();
// initialize signal handler
debug!("initializing signal handler");
ctrlc::set_handler(move || {
r.store(false, Ordering::Relaxed);
})
.expect("Failed to set handler for SIGINT / SIGTERM");
// initialize metrics
debug!("initializing metrics");
let metrics = Arc::new(Metrics::new());
// initialize async runtime
debug!("initializing async runtime");
let runtime = Arc::new(
Builder::new_multi_thread()
.enable_all()
.worker_threads(config.general().threads())
.max_blocking_threads(config.general().threads())
.thread_name("rezolus-worker")
.build()
.unwrap(),
);
// spawn samplers
debug!("spawning samplers");
let common = Common::new(config.clone(), metrics.clone(), runtime);
Cpu::spawn(common.clone());
Disk::spawn(common.clone());
Ext4::spawn(common.clone());
Http::spawn(common.clone());
Interrupt::spawn(common.clone());
Krb5kdc::spawn(common.clone());
Memcache::spawn(common.clone());
Memory::spawn(common.clone());
PageCache::spawn(common.clone());
Network::spawn(common.clone());
Ntp::spawn(common.clone());
Nvidia::spawn(common.clone());
Process::spawn(common.clone());
Rezolus::spawn(common.clone());
Scheduler::spawn(common.clone());
Softnet::spawn(common.clone());
Tcp::spawn(common.clone());
Udp::spawn(common.clone());
Usercall::spawn(common.clone());
Xfs::spawn(common);
#[cfg(feature = "push_kafka")]
{
if config.exposition().kafka().enabled() {
let mut kafka_producer =
exposition::KafkaProducer::new(config.clone(), metrics.clone());
let _ = std::thread::Builder::new()
.name("kafka".to_string())
.spawn(move || loop {
kafka_producer.run();
});
}
}
debug!("beginning stats exposition");
let mut http = exposition::Http::new(
config.listen().expect("no listen address"),
metrics,
config.general().reading_suffix(),
);
while runnable.load(Ordering::Relaxed) {
http.run();
}
Ok(())
}