use super::{exporters::MetricsExporter, Metrics, MetricsExporterManager, SystemMetricsCollector};
use crate::metrics::exporters::METRICS_EXPORTER_MANAGER;
pub struct MetricsBuilder {
interval_secs: u64,
exporter: Option<Box<dyn MetricsExporter>>,
http_metrics_enabled: bool,
grpc_metrics_enabled: bool,
websocket_metrics_enabled: bool,
system_metrics_enabled: bool,
process_metrics_enabled: bool,
}
impl MetricsBuilder {
pub fn new() -> Self {
Self {
interval_secs: 10,
exporter: None,
http_metrics_enabled: false,
grpc_metrics_enabled: false,
websocket_metrics_enabled: false,
system_metrics_enabled: false,
process_metrics_enabled: false,
}
}
pub fn with_interval_secs(mut self, interval_secs: u64) -> Self {
self.interval_secs = interval_secs;
self
}
pub fn with_exporter(mut self, exporter: Box<dyn MetricsExporter>) -> Self {
self.exporter = Some(exporter);
self
}
pub fn with_http_metrics(mut self) -> Self {
self.http_metrics_enabled = true;
self
}
pub fn with_grpc_metrics(mut self) -> Self {
self.grpc_metrics_enabled = true;
self
}
pub fn with_websocket_metrics(mut self) -> Self {
self.websocket_metrics_enabled = true;
self
}
pub fn with_system_metrics(mut self) -> Self {
self.system_metrics_enabled = true;
self
}
pub fn with_process_metrics(mut self) -> Self {
self.process_metrics_enabled = true;
self
}
pub fn initialize(self) {
if let Some(exporter) = self.exporter {
let exporter_manager = MetricsExporterManager::new(10000, vec![exporter]);
*METRICS_EXPORTER_MANAGER.write() = Some(exporter_manager.clone());
let interval_secs = self.interval_secs;
let http_enabled = self.http_metrics_enabled;
let grpc_enabled = self.grpc_metrics_enabled;
let websocket_enabled = self.websocket_metrics_enabled;
let system_enabled = self.system_metrics_enabled;
let process_enabled = self.process_metrics_enabled;
tokio::spawn(async move {
let mut interval = tokio::time::interval(std::time::Duration::from_secs(interval_secs));
let mut metrics = Metrics::new(interval_secs);
let system_metrics_collector = SystemMetricsCollector::new();
loop {
interval.tick().await;
metrics.collect_all_metrics(
&system_metrics_collector,
http_enabled,
grpc_enabled,
websocket_enabled,
system_enabled,
process_enabled,
).await;
exporter_manager.send_metrics(metrics.clone());
}
});
}
}
}