#[derive(Debug, Clone, serde::Serialize)]
pub struct SystemMetrics {
pub timestamp: chrono::DateTime<chrono::Utc>,
pub requests: MonitoringRequestMetrics,
pub providers: ProviderMetrics,
pub system: SystemResourceMetrics,
pub errors: ErrorMetrics,
pub performance: PerformanceMetrics,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct MonitoringRequestMetrics {
pub total_requests: u64,
pub requests_per_second: f64,
pub avg_response_time_ms: f64,
pub p95_response_time_ms: f64,
pub p99_response_time_ms: f64,
pub success_rate: f64,
pub status_codes: std::collections::HashMap<u16, u64>,
pub endpoints: std::collections::HashMap<String, u64>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct ProviderMetrics {
pub total_provider_requests: u64,
pub provider_success_rates: std::collections::HashMap<String, f64>,
pub provider_response_times: std::collections::HashMap<String, f64>,
pub provider_errors: std::collections::HashMap<String, u64>,
pub provider_usage: std::collections::HashMap<String, u64>,
pub token_usage: std::collections::HashMap<String, u64>,
pub costs: std::collections::HashMap<String, f64>,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct SystemResourceMetrics {
pub cpu_usage: f64,
pub memory_usage: u64,
pub memory_usage_percent: f64,
pub disk_usage: u64,
pub disk_usage_percent: f64,
pub network_bytes_in: u64,
pub network_bytes_out: u64,
pub active_connections: u32,
pub database_connections: u32,
pub redis_connections: u32,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct ErrorMetrics {
pub total_errors: u64,
pub error_rate: f64,
pub error_types: std::collections::HashMap<String, u64>,
pub error_endpoints: std::collections::HashMap<String, u64>,
pub critical_errors: u64,
pub warnings: u64,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct PerformanceMetrics {
pub cache_hit_rate: f64,
pub cache_miss_rate: f64,
pub avg_db_query_time_ms: f64,
pub queue_depth: u32,
pub throughput: f64,
pub latency_percentiles: LatencyPercentiles,
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct LatencyPercentiles {
pub p50: f64,
pub p90: f64,
pub p95: f64,
pub p99: f64,
pub p999: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum AlertSeverity {
Info,
Warning,
Critical,
Emergency,
}
impl std::fmt::Display for AlertSeverity {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
AlertSeverity::Info => write!(f, "INFO"),
AlertSeverity::Warning => write!(f, "WARNING"),
AlertSeverity::Critical => write!(f, "CRITICAL"),
AlertSeverity::Emergency => write!(f, "EMERGENCY"),
}
}
}
#[derive(Debug, Clone, serde::Serialize)]
pub struct Alert {
pub id: String,
pub severity: AlertSeverity,
pub title: String,
pub description: String,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub source: String,
pub metadata: serde_json::Value,
pub resolved: bool,
}
#[cfg(test)]
#[path = "types_tests.rs"]
mod tests;