use super::super::Metadata;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderMetrics {
#[serde(flatten)]
pub metadata: Metadata,
pub provider: String,
pub period_start: chrono::DateTime<chrono::Utc>,
pub period_end: chrono::DateTime<chrono::Utc>,
pub total_requests: u64,
pub successful_requests: u64,
pub failed_requests: u64,
pub success_rate: f64,
pub avg_response_time_ms: f64,
pub p50_response_time_ms: f64,
pub p95_response_time_ms: f64,
pub p99_response_time_ms: f64,
pub total_tokens: u64,
pub total_cost: f64,
pub error_breakdown: HashMap<String, u64>,
pub model_breakdown: HashMap<String, ModelMetrics>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelMetrics {
pub model: String,
pub requests: u64,
pub successes: u64,
pub tokens: u64,
pub cost: f64,
pub avg_response_time_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemMetrics {
#[serde(flatten)]
pub metadata: Metadata,
pub timestamp: chrono::DateTime<chrono::Utc>,
pub cpu_usage: f64,
pub memory_usage: u64,
pub memory_usage_percent: f64,
pub disk_usage: u64,
pub disk_usage_percent: f64,
pub network_io: NetworkIO,
pub active_connections: u32,
pub queue_sizes: HashMap<String, u32>,
pub thread_pool: ThreadPoolStats,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NetworkIO {
pub bytes_received: u64,
pub bytes_sent: u64,
pub packets_received: u64,
pub packets_sent: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ThreadPoolStats {
pub active_threads: u32,
pub total_threads: u32,
pub queued_tasks: u32,
pub completed_tasks: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsageAnalytics {
#[serde(flatten)]
pub metadata: Metadata,
pub period: TimePeriod,
pub user_id: Option<Uuid>,
pub team_id: Option<Uuid>,
pub total_requests: u64,
pub total_tokens: u64,
pub total_cost: f64,
pub model_usage: HashMap<String, ModelUsage>,
pub provider_usage: HashMap<String, ProviderUsage>,
pub daily_breakdown: Vec<DailyUsage>,
pub top_endpoints: Vec<EndpointUsage>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimePeriod {
pub start: chrono::DateTime<chrono::Utc>,
pub end: chrono::DateTime<chrono::Utc>,
pub period_type: PeriodType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PeriodType {
Hour,
Day,
Week,
Month,
Year,
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelUsage {
pub model: String,
pub requests: u64,
pub tokens: u64,
pub cost: f64,
pub success_rate: f64,
pub avg_response_time_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderUsage {
pub provider: String,
pub requests: u64,
pub tokens: u64,
pub cost: f64,
pub success_rate: f64,
pub avg_response_time_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DailyUsage {
pub date: chrono::NaiveDate,
pub requests: u64,
pub tokens: u64,
pub cost: f64,
pub unique_users: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EndpointUsage {
pub endpoint: String,
pub requests: u64,
pub success_rate: f64,
pub avg_response_time_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertConfig {
#[serde(flatten)]
pub metadata: Metadata,
pub name: String,
pub description: Option<String>,
pub condition: AlertCondition,
pub threshold: f64,
pub severity: AlertSeverity,
pub channels: Vec<String>,
pub enabled: bool,
pub cooldown_seconds: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AlertCondition {
ErrorRateHigh,
ResponseTimeSlow,
RequestVolumeHigh,
CostHigh,
ProviderDown,
QuotaExceeded,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AlertSeverity {
Info,
Warning,
Error,
Critical,
}
#[cfg(test)]
#[path = "aggregates_tests.rs"]
mod tests;