pulseengine_mcp_monitoring/
collector.rs1use crate::{config::MonitoringConfig, metrics::ServerMetrics};
4use pulseengine_mcp_protocol::{Error, Request, Response};
5use std::sync::atomic::{AtomicU64, Ordering};
6use std::sync::Arc;
7use tokio::time::Instant;
8
9#[derive(Debug, Clone)]
11pub struct RequestContext {
12 pub request_id: uuid::Uuid,
13}
14
15pub struct MetricsCollector {
17 config: MonitoringConfig,
18 start_time: Instant,
19 request_count: Arc<AtomicU64>,
20 error_count: Arc<AtomicU64>,
21}
22
23impl MetricsCollector {
24 pub fn new(config: MonitoringConfig) -> Self {
25 Self {
26 config,
27 start_time: Instant::now(),
28 request_count: Arc::new(AtomicU64::new(0)),
29 error_count: Arc::new(AtomicU64::new(0)),
30 }
31 }
32
33 pub async fn start_collection(&self) {
34 if !self.config.enabled {}
35
36 }
38
39 pub async fn stop_collection(&self) {
40 }
42
43 pub async fn process_request(
44 &self,
45 request: Request,
46 _context: &RequestContext,
47 ) -> Result<Request, Error> {
48 if self.config.enabled {
49 self.request_count.fetch_add(1, Ordering::Relaxed);
50 }
51 Ok(request)
52 }
53
54 pub async fn process_response(
55 &self,
56 response: Response,
57 _context: &RequestContext,
58 ) -> Result<Response, Error> {
59 if self.config.enabled && response.error.is_some() {
60 self.error_count.fetch_add(1, Ordering::Relaxed);
61 }
62 Ok(response)
63 }
64
65 pub async fn get_current_metrics(&self) -> ServerMetrics {
66 let uptime_seconds = self.start_time.elapsed().as_secs();
67 let requests_total = self.request_count.load(Ordering::Relaxed);
68 let errors_total = self.error_count.load(Ordering::Relaxed);
69
70 ServerMetrics {
71 requests_total,
72 requests_per_second: if uptime_seconds > 0 {
73 requests_total as f64 / uptime_seconds as f64
74 } else {
75 0.0
76 },
77 average_response_time_ms: 0.0, error_rate: if requests_total > 0 {
79 errors_total as f64 / requests_total as f64
80 } else {
81 0.0
82 },
83 active_connections: 0, memory_usage_bytes: 0, uptime_seconds,
86 }
87 }
88
89 pub async fn get_uptime_seconds(&self) -> u64 {
90 self.start_time.elapsed().as_secs()
91 }
92}