#[derive(Debug, Clone)]
pub struct PerformanceSample {
pub timestamp: Instant,
pub analysis_duration_ms: u64,
pub cache_hit_ratio: f32,
pub memory_usage_mb: f32,
pub cpu_utilization: f32,
pub queue_depth: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AdaptiveConfig {
pub target_analysis_time_ms: u64,
pub min_cache_hit_ratio: f32,
pub max_memory_mb: f32,
pub max_cpu_utilization: f32,
pub sample_window_size: usize,
pub adjustment_sensitivity: f32,
}
impl Default for AdaptiveConfig {
fn default() -> Self {
Self {
target_analysis_time_ms: 100, min_cache_hit_ratio: 0.6, max_memory_mb: 512.0, max_cpu_utilization: 0.8, sample_window_size: 50, adjustment_sensitivity: 0.1, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ThresholdAdjustment {
ScaleUp {
cache_factor: f32,
permit_factor: f32,
},
ScaleDown {
cache_factor: f32,
permit_factor: f32,
},
MoreCompression { compression_level: u8 },
LessCompression { compression_level: u8 },
Maintain,
}
pub struct AdaptiveThresholdManager {
config: AdaptiveConfig,
performance_history: Arc<RwLock<VecDeque<PerformanceSample>>>,
current_thresholds: Arc<RwLock<CurrentThresholds>>,
adjustment_history: Arc<RwLock<VecDeque<ThresholdAdjustment>>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CurrentThresholds {
pub hot_cache_size: usize,
pub high_priority_permits: usize,
pub low_priority_permits: usize,
pub compression_level: u8,
pub archive_after_hours: u32,
pub cleanup_interval_minutes: u32,
}
impl Default for CurrentThresholds {
fn default() -> Self {
Self {
hot_cache_size: 1000,
high_priority_permits: 10,
low_priority_permits: 2,
compression_level: 4, archive_after_hours: 24 * 30, cleanup_interval_minutes: 60, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum PerformanceTrend {
Improving,
Stable,
Degrading,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceStatistics {
pub avg_analysis_duration_ms: f32,
pub avg_cache_hit_ratio: f32,
pub avg_memory_usage_mb: f32,
pub avg_cpu_utilization: f32,
pub total_samples: usize,
pub recent_adjustments_count: usize,
pub performance_trend: PerformanceTrend,
}
impl Default for PerformanceStatistics {
fn default() -> Self {
Self {
avg_analysis_duration_ms: 0.0,
avg_cache_hit_ratio: 0.0,
avg_memory_usage_mb: 0.0,
avg_cpu_utilization: 0.0,
total_samples: 0,
recent_adjustments_count: 0,
performance_trend: PerformanceTrend::Stable,
}
}
}
impl PerformanceStatistics {
#[must_use]
pub fn format_diagnostic(&self) -> String {
let trend_indicator = match self.performance_trend {
PerformanceTrend::Improving => "📈 IMPROVING",
PerformanceTrend::Stable => "➡️ STABLE",
PerformanceTrend::Degrading => "📉 DEGRADING",
};
format!(
"Adaptive Thresholds:\n\
- Performance: {}\n\
- Avg duration: {:.1}ms\n\
- Cache hit ratio: {:.1}%\n\
- Memory usage: {:.1}MB\n\
- CPU utilization: {:.1}%\n\
- Total samples: {}\n\
- Recent adjustments: {}",
trend_indicator,
self.avg_analysis_duration_ms,
self.avg_cache_hit_ratio * 100.0,
self.avg_memory_usage_mb,
self.avg_cpu_utilization * 100.0,
self.total_samples,
self.recent_adjustments_count
)
}
}