use crate::lifecycle::config::{TaskPriority, TaskType};
use crate::lifecycle::state::AppState;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LifecycleStats {
pub start_timestamp: u64,
pub app_state_stats: AppStateStats,
pub task_execution_stats: HashMap<TaskType, TaskExecutionStats>,
pub resource_usage_stats: ResourceUsageStats,
pub performance_stats: PerformanceStats,
pub error_stats: ErrorStats,
pub user_interaction_stats: UserInteractionStats,
pub system_health_stats: SystemHealthStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppStateStats {
pub time_in_state: HashMap<AppState, u64>,
pub transition_counts: HashMap<String, u32>, pub avg_transition_interval_seconds: f64,
pub total_transitions: u64,
pub last_state_change_timestamp: u64,
pub state_change_frequency_per_hour: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskExecutionStats {
pub total_executed: u64,
pub successful_executions: u64,
pub failed_executions: u64,
pub cancelled_executions: u64,
pub avg_execution_time_seconds: f64,
pub min_execution_time_seconds: f64,
pub max_execution_time_seconds: f64,
pub success_rate_percent: f32,
pub avg_resource_consumption: AvgResourceConsumption,
pub priority_distribution: HashMap<TaskPriority, u32>,
pub queue_wait_stats: QueueWaitStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AvgResourceConsumption {
pub avg_cpu_percent: f32,
pub avg_memory_mb: f32,
pub avg_network_mb: f32,
pub avg_battery_mah: f32,
pub avg_execution_time_seconds: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueueWaitStats {
pub avg_wait_time_seconds: f64,
pub min_wait_time_seconds: f64,
pub max_wait_time_seconds: f64,
pub p95_wait_time_seconds: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceUsageStats {
pub cpu_stats: UsageStats,
pub memory_stats: UsageStats,
pub network_stats: UsageStats,
pub battery_stats: BatteryUsageStats,
pub gpu_stats: Option<UsageStats>,
pub storage_stats: StorageStats,
pub thermal_stats: ThermalStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageStats {
pub current: f32,
pub average: f32,
pub minimum: f32,
pub maximum: f32,
pub p95: f32,
pub std_deviation: f32,
pub sample_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatteryUsageStats {
pub current_level_percent: u8,
pub drain_rate_percent_per_hour: f32,
pub avg_battery_level_percent: f32,
pub time_since_last_charge_hours: f32,
pub charging_cycles: u32,
pub low_battery_events: u32,
pub critical_battery_events: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StorageStats {
pub read_operations: u64,
pub write_operations: u64,
pub bytes_read: u64,
pub bytes_written: u64,
pub avg_read_speed_mbps: f32,
pub avg_write_speed_mbps: f32,
pub storage_usage_mb: u64,
pub available_storage_mb: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThermalStats {
pub current_temperature_celsius: f32,
pub avg_temperature_celsius: f32,
pub max_temperature_celsius: f32,
pub thermal_events: u32,
pub throttling_events: u32,
pub time_in_thermal_warning_seconds: u64,
pub temperature_trend: TemperatureTrend,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TemperatureTrend {
Stable,
Rising,
Falling,
Oscillating,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceStats {
pub inference_stats: InferencePerformanceStats,
pub memory_performance_stats: MemoryPerformanceStats,
pub network_performance_stats: NetworkPerformanceStats,
pub overall_performance_score: f32,
pub performance_degradation_events: u32,
pub performance_optimization_events: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InferencePerformanceStats {
pub total_inferences: u64,
pub avg_inference_time_ms: f32,
pub throughput_per_second: f32,
pub accuracy_stats: AccuracyStats,
pub model_loading_stats: ModelLoadingStats,
pub queue_backlog_stats: QueueBacklogStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccuracyStats {
pub avg_accuracy_score: f32,
pub accuracy_trend: AccuracyTrend,
pub model_drift_events: u32,
pub accuracy_degradation_events: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AccuracyTrend {
Stable,
Improving,
Degrading,
Fluctuating,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelLoadingStats {
pub total_loads: u32,
pub avg_loading_time_seconds: f32,
pub cache_hit_rate_percent: f32,
pub failed_loads: u32,
pub loaded_models_memory_mb: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueueBacklogStats {
pub current_queue_size: usize,
pub avg_queue_size: f32,
pub max_queue_size: usize,
pub queue_overflow_events: u32,
pub avg_processing_time_ms: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryPerformanceStats {
pub allocation_rate_mbps: f32,
pub deallocation_rate_mbps: f32,
pub gc_events: u32,
pub avg_gc_pause_time_ms: f32,
pub fragmentation_percent: f32,
pub oom_events: u32,
pub memory_pressure_events: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkPerformanceStats {
pub transfer_rate_mbps: f32,
pub connection_success_rate_percent: f32,
pub avg_latency_ms: f32,
pub timeout_events: u32,
pub retry_events: u32,
pub data_usage: DataUsageStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataUsageStats {
pub total_sent_mb: f32,
pub total_received_mb: f32,
pub usage_by_task_type: HashMap<TaskType, f32>,
pub peak_bandwidth_mbps: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorStats {
pub total_errors: u64,
pub errors_by_category: HashMap<String, u32>,
pub errors_by_severity: HashMap<ErrorSeverity, u32>,
pub recent_error_patterns: Vec<ErrorPattern>,
pub error_rate_per_hour: f32,
pub error_resolution_stats: ErrorResolutionStats,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ErrorSeverity {
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorPattern {
pub pattern_id: String,
pub message_pattern: String,
pub occurrence_count: u32,
pub first_occurrence_timestamp: u64,
pub last_occurrence_timestamp: u64,
pub affected_components: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorResolutionStats {
pub auto_resolved_errors: u32,
pub manually_resolved_errors: u32,
pub unresolved_errors: u32,
pub avg_resolution_time_minutes: f32,
pub resolution_success_rate_percent: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserInteractionStats {
pub total_interactions: u64,
pub interactions_by_type: HashMap<String, u32>,
pub avg_session_duration_minutes: f32,
pub engagement_score: f32,
pub feature_usage_stats: FeatureUsageStats,
pub satisfaction_metrics: UserSatisfactionMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureUsageStats {
pub feature_usage_counts: HashMap<String, u32>,
pub popularity_ranking: Vec<String>,
pub unused_features: Vec<String>,
pub adoption_rate_percent: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserSatisfactionMetrics {
pub overall_satisfaction_score: f32,
pub performance_satisfaction_score: f32,
pub feedback_count: u32,
pub positive_feedback_percent: f32,
pub user_experienced_crashes: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemHealthStats {
pub overall_health_score: f32,
pub component_health_scores: HashMap<String, f32>,
pub health_trend: HealthTrend,
pub critical_issues_count: u32,
pub warning_issues_count: u32,
pub system_uptime_hours: f32,
pub stability_metrics: StabilityMetrics,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum HealthTrend {
Excellent,
Good,
Fair,
Poor,
Critical,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StabilityMetrics {
pub crash_free_sessions_percent: f32,
pub mtbf_hours: f32,
pub availability_percent: f32,
pub recovery_time_stats: RecoveryTimeStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RecoveryTimeStats {
pub avg_recovery_time_minutes: f32,
pub fastest_recovery_minutes: f32,
pub slowest_recovery_minutes: f32,
pub successful_recoveries: u32,
pub failed_recovery_attempts: u32,
}
impl LifecycleStats {
pub fn new() -> Self {
let start_timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("SystemTime should be after UNIX_EPOCH")
.as_secs();
Self {
start_timestamp,
app_state_stats: AppStateStats::new(),
task_execution_stats: HashMap::new(),
resource_usage_stats: ResourceUsageStats::new(),
performance_stats: PerformanceStats::new(),
error_stats: ErrorStats::new(),
user_interaction_stats: UserInteractionStats::new(),
system_health_stats: SystemHealthStats::new(),
}
}
pub fn update_stats(&mut self, update: StatsUpdate) {
match update {
StatsUpdate::AppStateTransition {
from,
to,
timestamp,
} => {
self.app_state_stats.record_transition(from, to, timestamp);
},
StatsUpdate::TaskExecution {
task_type,
execution_stats,
} => {
self.task_execution_stats
.entry(task_type)
.or_insert_with(TaskExecutionStats::new)
.update(execution_stats);
},
StatsUpdate::ResourceUsage {
cpu,
memory,
network,
battery,
} => {
self.resource_usage_stats.update(cpu, memory, network, battery);
},
StatsUpdate::Performance {
inference_time,
accuracy,
throughput,
} => {
self.performance_stats
.update_inference_stats(inference_time, accuracy, throughput);
},
StatsUpdate::Error {
severity,
category,
message,
} => {
self.error_stats.record_error(severity, category, message);
},
StatsUpdate::UserInteraction {
interaction_type,
duration,
} => {
self.user_interaction_stats.record_interaction(interaction_type, duration);
},
StatsUpdate::SystemHealth {
component,
health_score,
} => {
self.system_health_stats.update_component_health(component, health_score);
},
}
}
pub fn generate_summary_report(&self) -> StatsSummaryReport {
StatsSummaryReport {
collection_period_hours: self.get_collection_period_hours(),
overall_performance_score: self.performance_stats.overall_performance_score,
system_health_score: self.system_health_stats.overall_health_score,
error_rate_per_hour: self.error_stats.error_rate_per_hour,
user_engagement_score: self.user_interaction_stats.engagement_score,
resource_efficiency_score: self.calculate_resource_efficiency_score(),
key_metrics: self.extract_key_metrics(),
recommendations: self.generate_recommendations(),
}
}
pub fn get_collection_period_hours(&self) -> f32 {
let current_timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.expect("SystemTime should be after UNIX_EPOCH")
.as_secs();
(current_timestamp - self.start_timestamp) as f32 / 3600.0
}
fn calculate_resource_efficiency_score(&self) -> f32 {
let cpu_efficiency = 100.0 - self.resource_usage_stats.cpu_stats.average;
let memory_efficiency =
(1.0 - (self.resource_usage_stats.memory_stats.average / 100.0)) * 100.0;
let battery_efficiency =
100.0 - self.resource_usage_stats.battery_stats.drain_rate_percent_per_hour;
(cpu_efficiency + memory_efficiency + battery_efficiency) / 3.0
}
fn extract_key_metrics(&self) -> Vec<KeyMetric> {
vec![
KeyMetric {
name: "Average Inference Time".to_string(),
value: self.performance_stats.inference_stats.avg_inference_time_ms,
unit: "ms".to_string(),
trend: MetricTrend::Stable,
},
KeyMetric {
name: "Success Rate".to_string(),
value: self.calculate_overall_success_rate(),
unit: "%".to_string(),
trend: MetricTrend::Stable,
},
KeyMetric {
name: "Memory Usage".to_string(),
value: self.resource_usage_stats.memory_stats.average,
unit: "MB".to_string(),
trend: MetricTrend::Stable,
},
]
}
fn calculate_overall_success_rate(&self) -> f32 {
if self.task_execution_stats.is_empty() {
return 100.0;
}
let total_tasks: u64 = self.task_execution_stats.values().map(|s| s.total_executed).sum();
let successful_tasks: u64 =
self.task_execution_stats.values().map(|s| s.successful_executions).sum();
if total_tasks == 0 {
100.0
} else {
(successful_tasks as f32 / total_tasks as f32) * 100.0
}
}
fn generate_recommendations(&self) -> Vec<String> {
let mut recommendations = Vec::new();
if self.resource_usage_stats.memory_stats.average > 80.0 {
recommendations.push(
"Consider enabling aggressive memory cleanup to reduce memory usage".to_string(),
);
}
if self.resource_usage_stats.battery_stats.drain_rate_percent_per_hour > 20.0 {
recommendations
.push("High battery drain detected. Enable battery optimization mode".to_string());
}
if self.error_stats.error_rate_per_hour > 5.0 {
recommendations
.push("Error rate is high. Review error patterns and implement fixes".to_string());
}
if self.performance_stats.inference_stats.avg_inference_time_ms > 1000.0 {
recommendations.push(
"Inference time is high. Consider model optimization or hardware acceleration"
.to_string(),
);
}
recommendations
}
}
#[derive(Debug, Clone)]
pub enum StatsUpdate {
AppStateTransition {
from: AppState,
to: AppState,
timestamp: u64,
},
TaskExecution {
task_type: TaskType,
execution_stats: TaskExecutionUpdate,
},
ResourceUsage {
cpu: f32,
memory: f32,
network: f32,
battery: f32,
},
Performance {
inference_time: f32,
accuracy: f32,
throughput: f32,
},
Error {
severity: ErrorSeverity,
category: String,
message: String,
},
UserInteraction {
interaction_type: String,
duration: u64,
},
SystemHealth {
component: String,
health_score: f32,
},
}
#[derive(Debug, Clone)]
pub struct TaskExecutionUpdate {
pub execution_time_seconds: f64,
pub success: bool,
pub priority: TaskPriority,
pub resource_usage: AvgResourceConsumption,
pub wait_time_seconds: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StatsSummaryReport {
pub collection_period_hours: f32,
pub overall_performance_score: f32,
pub system_health_score: f32,
pub error_rate_per_hour: f32,
pub user_engagement_score: f32,
pub resource_efficiency_score: f32,
pub key_metrics: Vec<KeyMetric>,
pub recommendations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KeyMetric {
pub name: String,
pub value: f32,
pub unit: String,
pub trend: MetricTrend,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MetricTrend {
Improving,
Stable,
Degrading,
Volatile,
}
impl AppStateStats {
fn new() -> Self {
Self {
time_in_state: HashMap::new(),
transition_counts: HashMap::new(),
avg_transition_interval_seconds: 0.0,
total_transitions: 0,
last_state_change_timestamp: 0,
state_change_frequency_per_hour: 0.0,
}
}
fn record_transition(&mut self, from: AppState, to: AppState, timestamp: u64) {
let transition_key = format!("{:?}->{:?}", from, to);
*self.transition_counts.entry(transition_key).or_insert(0) += 1;
self.total_transitions += 1;
self.last_state_change_timestamp = timestamp;
}
}
impl TaskExecutionStats {
fn new() -> Self {
Self {
total_executed: 0,
successful_executions: 0,
failed_executions: 0,
cancelled_executions: 0,
avg_execution_time_seconds: 0.0,
min_execution_time_seconds: f64::MAX,
max_execution_time_seconds: 0.0,
success_rate_percent: 100.0,
avg_resource_consumption: AvgResourceConsumption::default(),
priority_distribution: HashMap::new(),
queue_wait_stats: QueueWaitStats::default(),
}
}
fn update(&mut self, update: TaskExecutionUpdate) {
self.total_executed += 1;
if update.success {
self.successful_executions += 1;
} else {
self.failed_executions += 1;
}
self.min_execution_time_seconds =
self.min_execution_time_seconds.min(update.execution_time_seconds);
self.max_execution_time_seconds =
self.max_execution_time_seconds.max(update.execution_time_seconds);
let alpha = 0.1;
self.avg_execution_time_seconds =
alpha * update.execution_time_seconds + (1.0 - alpha) * self.avg_execution_time_seconds;
self.success_rate_percent =
(self.successful_executions as f32 / self.total_executed as f32) * 100.0;
*self.priority_distribution.entry(update.priority).or_insert(0) += 1;
}
}
impl Default for AvgResourceConsumption {
fn default() -> Self {
Self {
avg_cpu_percent: 0.0,
avg_memory_mb: 0.0,
avg_network_mb: 0.0,
avg_battery_mah: 0.0,
avg_execution_time_seconds: 0.0,
}
}
}
impl Default for QueueWaitStats {
fn default() -> Self {
Self {
avg_wait_time_seconds: 0.0,
min_wait_time_seconds: 0.0,
max_wait_time_seconds: 0.0,
p95_wait_time_seconds: 0.0,
}
}
}
impl ResourceUsageStats {
fn new() -> Self {
Self {
cpu_stats: UsageStats::new(),
memory_stats: UsageStats::new(),
network_stats: UsageStats::new(),
battery_stats: BatteryUsageStats::new(),
gpu_stats: None,
storage_stats: StorageStats::new(),
thermal_stats: ThermalStats::new(),
}
}
fn update(&mut self, cpu: f32, memory: f32, network: f32, battery: f32) {
self.cpu_stats.update(cpu);
self.memory_stats.update(memory);
self.network_stats.update(network);
self.battery_stats.update(battery);
}
}
impl UsageStats {
fn new() -> Self {
Self {
current: 0.0,
average: 0.0,
minimum: f32::MAX,
maximum: 0.0,
p95: 0.0,
std_deviation: 0.0,
sample_count: 0,
}
}
fn update(&mut self, value: f32) {
self.current = value;
self.minimum = self.minimum.min(value);
self.maximum = self.maximum.max(value);
self.sample_count += 1;
let alpha = 1.0 / self.sample_count as f32;
self.average = alpha * value + (1.0 - alpha) * self.average;
}
}
impl BatteryUsageStats {
fn new() -> Self {
Self {
current_level_percent: 100,
drain_rate_percent_per_hour: 0.0,
avg_battery_level_percent: 100.0,
time_since_last_charge_hours: 0.0,
charging_cycles: 0,
low_battery_events: 0,
critical_battery_events: 0,
}
}
fn update(&mut self, battery_level: f32) {
self.current_level_percent = battery_level as u8;
let alpha = 0.1;
self.avg_battery_level_percent =
alpha * battery_level + (1.0 - alpha) * self.avg_battery_level_percent;
}
}
impl StorageStats {
fn new() -> Self {
Self {
read_operations: 0,
write_operations: 0,
bytes_read: 0,
bytes_written: 0,
avg_read_speed_mbps: 0.0,
avg_write_speed_mbps: 0.0,
storage_usage_mb: 0,
available_storage_mb: 1000, }
}
}
impl ThermalStats {
fn new() -> Self {
Self {
current_temperature_celsius: 25.0,
avg_temperature_celsius: 25.0,
max_temperature_celsius: 25.0,
thermal_events: 0,
throttling_events: 0,
time_in_thermal_warning_seconds: 0,
temperature_trend: TemperatureTrend::Stable,
}
}
}
impl PerformanceStats {
fn new() -> Self {
Self {
inference_stats: InferencePerformanceStats::new(),
memory_performance_stats: MemoryPerformanceStats::new(),
network_performance_stats: NetworkPerformanceStats::new(),
overall_performance_score: 100.0,
performance_degradation_events: 0,
performance_optimization_events: 0,
}
}
fn update_inference_stats(&mut self, inference_time: f32, accuracy: f32, throughput: f32) {
self.inference_stats.update(inference_time, accuracy, throughput);
}
}
impl InferencePerformanceStats {
fn new() -> Self {
Self {
total_inferences: 0,
avg_inference_time_ms: 0.0,
throughput_per_second: 0.0,
accuracy_stats: AccuracyStats::new(),
model_loading_stats: ModelLoadingStats::new(),
queue_backlog_stats: QueueBacklogStats::new(),
}
}
fn update(&mut self, inference_time: f32, accuracy: f32, throughput: f32) {
self.total_inferences += 1;
let alpha = 0.1;
self.avg_inference_time_ms =
alpha * inference_time + (1.0 - alpha) * self.avg_inference_time_ms;
self.throughput_per_second =
alpha * throughput + (1.0 - alpha) * self.throughput_per_second;
self.accuracy_stats.update(accuracy);
}
}
impl AccuracyStats {
fn new() -> Self {
Self {
avg_accuracy_score: 100.0,
accuracy_trend: AccuracyTrend::Stable,
model_drift_events: 0,
accuracy_degradation_events: 0,
}
}
fn update(&mut self, accuracy: f32) {
let alpha = 0.1;
self.avg_accuracy_score = alpha * accuracy + (1.0 - alpha) * self.avg_accuracy_score;
}
}
impl ModelLoadingStats {
fn new() -> Self {
Self {
total_loads: 0,
avg_loading_time_seconds: 0.0,
cache_hit_rate_percent: 100.0,
failed_loads: 0,
loaded_models_memory_mb: 0,
}
}
}
impl QueueBacklogStats {
fn new() -> Self {
Self {
current_queue_size: 0,
avg_queue_size: 0.0,
max_queue_size: 0,
queue_overflow_events: 0,
avg_processing_time_ms: 0.0,
}
}
}
impl MemoryPerformanceStats {
fn new() -> Self {
Self {
allocation_rate_mbps: 0.0,
deallocation_rate_mbps: 0.0,
gc_events: 0,
avg_gc_pause_time_ms: 0.0,
fragmentation_percent: 0.0,
oom_events: 0,
memory_pressure_events: 0,
}
}
}
impl NetworkPerformanceStats {
fn new() -> Self {
Self {
transfer_rate_mbps: 0.0,
connection_success_rate_percent: 100.0,
avg_latency_ms: 0.0,
timeout_events: 0,
retry_events: 0,
data_usage: DataUsageStats::new(),
}
}
}
impl DataUsageStats {
fn new() -> Self {
Self {
total_sent_mb: 0.0,
total_received_mb: 0.0,
usage_by_task_type: HashMap::new(),
peak_bandwidth_mbps: 0.0,
}
}
}
impl ErrorStats {
fn new() -> Self {
Self {
total_errors: 0,
errors_by_category: HashMap::new(),
errors_by_severity: HashMap::new(),
recent_error_patterns: Vec::new(),
error_rate_per_hour: 0.0,
error_resolution_stats: ErrorResolutionStats::new(),
}
}
fn record_error(&mut self, severity: ErrorSeverity, category: String, _message: String) {
self.total_errors += 1;
*self.errors_by_category.entry(category).or_insert(0) += 1;
*self.errors_by_severity.entry(severity).or_insert(0) += 1;
}
}
impl ErrorResolutionStats {
fn new() -> Self {
Self {
auto_resolved_errors: 0,
manually_resolved_errors: 0,
unresolved_errors: 0,
avg_resolution_time_minutes: 0.0,
resolution_success_rate_percent: 100.0,
}
}
}
impl UserInteractionStats {
fn new() -> Self {
Self {
total_interactions: 0,
interactions_by_type: HashMap::new(),
avg_session_duration_minutes: 0.0,
engagement_score: 100.0,
feature_usage_stats: FeatureUsageStats::new(),
satisfaction_metrics: UserSatisfactionMetrics::new(),
}
}
fn record_interaction(&mut self, interaction_type: String, _duration: u64) {
self.total_interactions += 1;
*self.interactions_by_type.entry(interaction_type).or_insert(0) += 1;
}
}
impl FeatureUsageStats {
fn new() -> Self {
Self {
feature_usage_counts: HashMap::new(),
popularity_ranking: Vec::new(),
unused_features: Vec::new(),
adoption_rate_percent: 100.0,
}
}
}
impl UserSatisfactionMetrics {
fn new() -> Self {
Self {
overall_satisfaction_score: 100.0,
performance_satisfaction_score: 100.0,
feedback_count: 0,
positive_feedback_percent: 100.0,
user_experienced_crashes: 0,
}
}
}
impl SystemHealthStats {
fn new() -> Self {
Self {
overall_health_score: 100.0,
component_health_scores: HashMap::new(),
health_trend: HealthTrend::Excellent,
critical_issues_count: 0,
warning_issues_count: 0,
system_uptime_hours: 0.0,
stability_metrics: StabilityMetrics::new(),
}
}
fn update_component_health(&mut self, component: String, health_score: f32) {
self.component_health_scores.insert(component, health_score);
if !self.component_health_scores.is_empty() {
let total_score: f32 = self.component_health_scores.values().sum();
self.overall_health_score = total_score / self.component_health_scores.len() as f32;
}
}
}
impl StabilityMetrics {
fn new() -> Self {
Self {
crash_free_sessions_percent: 100.0,
mtbf_hours: 24.0,
availability_percent: 100.0,
recovery_time_stats: RecoveryTimeStats::new(),
}
}
}
impl RecoveryTimeStats {
fn new() -> Self {
Self {
avg_recovery_time_minutes: 0.0,
fastest_recovery_minutes: 0.0,
slowest_recovery_minutes: 0.0,
successful_recoveries: 0,
failed_recovery_attempts: 0,
}
}
}
impl Default for LifecycleStats {
fn default() -> Self {
Self::new()
}
}
#[path = "stats_tests.rs"]
mod stats_tests;