use alloc::collections::BTreeMap;
use alloc::string::String;
use alloc::vec::Vec;
use core::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AnalyticsError {
NotInitialized,
DatasetNotFound(String),
InsufficientData,
Internal(String),
}
impl fmt::Display for AnalyticsError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NotInitialized => write!(f, "Analytics not initialized"),
Self::DatasetNotFound(ds) => write!(f, "Dataset not found: {}", ds),
Self::InsufficientData => write!(f, "Insufficient data for analysis"),
Self::Internal(msg) => write!(f, "Internal error: {}", msg),
}
}
}
#[derive(Debug, Clone, Default)]
pub struct UsageSummary {
pub total_capacity: u64,
pub used_space: u64,
pub free_space: u64,
pub usage_percent: f32,
pub file_count: u64,
pub directory_count: u64,
pub snapshot_count: u64,
pub logical_size: u64,
pub physical_size: u64,
pub reduction_ratio: f32,
}
#[derive(Debug, Clone, Default)]
pub struct SpaceBreakdown {
pub data_space: u64,
pub metadata_space: u64,
pub snapshot_space: u64,
pub dedup_table_space: u64,
pub index_space: u64,
pub reserved_space: u64,
pub free_space: u64,
pub reclaimable_space: u64,
}
#[derive(Debug, Clone, Default)]
pub struct IoStats {
pub read_ops: u64,
pub write_ops: u64,
pub bytes_read: u64,
pub bytes_written: u64,
pub avg_read_latency_us: u64,
pub avg_write_latency_us: u64,
pub max_read_latency_us: u64,
pub max_write_latency_us: u64,
pub read_throughput: u64,
pub write_throughput: u64,
pub cache_hit_rate: f32,
pub queue_depth: u32,
}
#[derive(Debug, Clone, Default)]
pub struct CapacityForecast {
pub current_usage: u64,
pub predicted_usage: u64,
pub daily_growth_rate: i64,
pub days_until_full: i32,
pub recommendation: ForecastRecommendation,
pub confidence: f32,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub enum ForecastRecommendation {
#[default]
NoAction,
ConsiderExpansion,
ExpansionNeeded,
Critical,
RunCleanup,
}
#[derive(Debug, Clone)]
pub struct SpaceConsumer {
pub path: String,
pub object_id: u64,
pub space_used: u64,
pub percent_of_total: f32,
pub is_directory: bool,
pub file_count: u64,
}
#[derive(Debug, Clone)]
pub struct FileTypeStats {
pub file_type: String,
pub count: u64,
pub total_size: u64,
pub avg_size: u64,
pub percent_of_total: f32,
}
#[derive(Debug, Clone, Default)]
pub struct DedupStats {
pub total_blocks: u64,
pub unique_blocks: u64,
pub dedup_blocks: u64,
pub space_saved: u64,
pub dedup_ratio: f32,
pub table_entries: u64,
pub table_size: u64,
}
#[derive(Debug, Clone, Default)]
pub struct CompressionStats {
pub uncompressed_size: u64,
pub compressed_size: u64,
pub compression_ratio: f32,
pub space_saved: u64,
pub compressed_blocks: u64,
pub incompressible_blocks: u64,
pub algorithm_stats: BTreeMap<String, AlgorithmStats>,
}
#[derive(Debug, Clone, Default)]
pub struct AlgorithmStats {
pub name: String,
pub block_count: u64,
pub avg_ratio: f32,
pub total_bytes: u64,
}
#[derive(Debug, Clone, Default)]
pub struct SnapshotUsage {
pub snapshot_count: u64,
pub total_space: u64,
pub reclaimable_space: u64,
pub snapshots: Vec<SnapshotDetails>,
}
#[derive(Debug, Clone)]
pub struct SnapshotDetails {
pub name: String,
pub created: u64,
pub exclusive_space: u64,
pub referenced_space: u64,
pub files_changed: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum MetricType {
UsedSpace,
FreeSpace,
FileCount,
ReadIops,
WriteIops,
ReadThroughput,
WriteThroughput,
CacheHitRate,
CompressionRatio,
DedupRatio,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TrendPeriod {
Hour,
Day,
Week,
Month,
Year,
}
#[derive(Debug, Clone)]
pub struct TrendPoint {
pub timestamp: u64,
pub value: u64,
}
#[derive(Debug, Clone, Default)]
pub struct FullReport {
pub generated_at: u64,
pub dataset: String,
pub usage: UsageSummary,
pub space: SpaceBreakdown,
pub io: IoStats,
pub forecast: CapacityForecast,
pub dedup: DedupStats,
pub compression: CompressionStats,
pub snapshots: SnapshotUsage,
pub top_consumers: Vec<SpaceConsumer>,
pub file_types: Vec<FileTypeStats>,
pub health_score: u8,
pub recommendations: Vec<String>,
}