use anyhow::Result;
use base::info;
use base::EventToken;
use base::RecvTube;
use crate::RequestHandler;
pub struct MetricsController {
pub(crate) agents: Vec<RecvTube>,
handler: RequestHandler,
pub(crate) closed_tubes: usize,
}
#[derive(EventToken)]
pub(crate) enum MetricsControllerToken {
Agent(usize),
#[cfg(windows)]
AgentExited(usize),
}
impl MetricsController {
pub fn new(agents: Vec<RecvTube>) -> Self {
Self {
agents,
handler: RequestHandler::new(),
closed_tubes: 0,
}
}
pub fn run(&mut self) -> Result<()> {
self.run_internal()?;
self.handler.shutdown();
Ok(())
}
pub(crate) fn on_tube_readable(&self, client: &RecvTube) {
self.handler.handle_tube_readable(client)
}
pub(crate) fn on_connection_closed(&mut self) -> bool {
self.closed_tubes += 1;
info!(
"metrics tube closed: {} out of {} closed",
self.closed_tubes,
self.agents.len(),
);
if self.closed_tubes == self.agents.len() {
info!("metrics run loop exiting: all tubes closed");
return true;
}
false
}
}