rust_observer 0.2.2

Express telemetry rust SDK
Documentation
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());
                }
            });
        }
    }
}