use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
use std::time::{Duration, SystemTime};
pub struct MetricsCollector {
pub metrics: VecDeque<PerformanceMetric>,
pub aggregation_rules: HashMap<String, AggregationRule>,
pub metric_streams: HashMap<String, MetricStream>,
pub collection_stats: CollectionStatistics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceMetric {
pub name: String,
pub value: f64,
pub timestamp: SystemTime,
pub category: MetricCategory,
pub metadata: HashMap<String, String>,
pub confidence: f64,
pub significance: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MetricCategory {
Timing,
Memory,
Resource,
Gate,
Complexity,
Error,
Throughput,
Latency,
Custom { name: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AggregationRule {
pub function: AggregationFunction,
pub window: Duration,
pub min_samples: usize,
pub confidence_level: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum AggregationFunction {
Mean,
Median,
Maximum,
Minimum,
StandardDeviation,
Percentile { percentile: f64 },
MovingAverage { window_size: usize },
ExponentialMovingAverage { alpha: f64 },
}
#[derive(Debug, Clone)]
pub struct MetricStream {
pub name: String,
pub current_value: f64,
pub history: VecDeque<f64>,
pub statistics: StreamStatistics,
pub anomaly_threshold: f64,
}
#[derive(Debug, Clone)]
pub struct StreamStatistics {
pub sample_count: usize,
pub mean: f64,
pub std_dev: f64,
pub min: f64,
pub max: f64,
pub trend: TrendDirection,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TrendDirection {
Increasing,
Decreasing,
Stable,
Oscillating,
Unknown,
}
#[derive(Debug, Clone)]
pub struct CollectionStatistics {
pub total_metrics: usize,
pub collection_duration: Duration,
pub average_rate: f64,
pub collection_errors: usize,
pub memory_usage: usize,
}