use mecha10_core::messages::Message;
use serde::{Deserialize, Serialize};
pub fn now_micros() -> u64 {
use std::time::{SystemTime, UNIX_EPOCH};
SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_micros() as u64
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiagnosticMessage<T> {
pub timestamp: u64,
pub source: String,
pub payload: T,
}
impl<T> DiagnosticMessage<T> {
pub fn new(source: impl Into<String>, payload: T) -> Self {
Self {
timestamp: now_micros(),
source: source.into(),
payload,
}
}
pub fn new_with_timestamp(source: impl Into<String>, timestamp: u64, payload: T) -> Self {
Self {
timestamp,
source: source.into(),
payload,
}
}
}
impl<T: Send + Sync + 'static> Message for DiagnosticMessage<T> {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StreamingPipelineMetrics {
pub frames_received: u64,
pub frames_encoded: u64,
pub frames_sent: u64,
pub frames_dropped: u64,
pub bytes_per_second: u64,
pub fps: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StreamingLatencyMetrics {
pub camera_to_bridge_us: u64,
pub queue_time_us: u64,
pub encoding_time_us: u64,
pub send_time_us: u64,
pub end_to_end_us: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EncodingMetrics {
pub total_frames: u64,
pub slow_frames: u64,
pub avg_encode_time_ms: f64,
pub p50_encode_time_ms: f64,
pub p95_encode_time_ms: f64,
pub p99_encode_time_ms: f64,
pub max_encode_time_ms: f64,
pub queue_depth: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BandwidthMetrics {
pub bitrate_bps: u64,
pub target_bitrate_bps: u64,
pub avg_frame_size_bytes: u64,
pub total_bytes_sent: u64,
pub utilization: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebRTCConnectionMetrics {
pub active_connections: usize,
pub total_connections: u64,
pub failed_connections: u64,
pub connections_by_state: ConnectionStateBreakdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionStateBreakdown {
pub new: usize,
pub connecting: usize,
pub connected: usize,
pub disconnected: usize,
pub failed: usize,
pub closed: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebRTCQualityMetrics {
pub rtt_ms: f64,
pub packet_loss_percent: f64,
pub jitter_ms: f64,
pub bandwidth_estimate_bps: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketConnectionMetrics {
pub active_connections: usize,
pub total_connections: u64,
pub failed_connections: u64,
pub by_type: WebSocketTypeBreakdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketTypeBreakdown {
pub godot_control: usize,
pub godot_camera: usize,
pub signaling: usize,
pub dashboard: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketMessageMetrics {
pub messages_received_per_sec: f64,
pub messages_sent_per_sec: f64,
pub avg_message_size_bytes: u64,
pub total_bytes_received: u64,
pub total_bytes_sent: u64,
pub error_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisPoolMetrics {
pub active_connections: usize,
pub idle_connections: usize,
pub max_pool_size: usize,
pub avg_wait_time_ms: f64,
pub connection_failures: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisOperationMetrics {
pub ops_per_second: f64,
pub avg_latency_us: f64,
pub p95_latency_us: f64,
pub p99_latency_us: f64,
pub failed_ops: u64,
pub by_type: RedisOperationTypeBreakdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisOperationTypeBreakdown {
pub publish: u64,
pub subscribe: u64,
pub get: u64,
pub set: u64,
pub other: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisServerInfoMetrics {
pub redis_version: String,
pub uptime_seconds: u64,
pub connected_clients: u64,
pub used_memory: u64,
pub used_memory_rss: u64,
pub used_memory_peak: u64,
pub total_connections_received: u64,
pub total_commands_processed: u64,
pub instantaneous_ops_per_sec: u64,
pub keyspace_hits: u64,
pub keyspace_misses: u64,
pub db0_keys: u64,
pub db0_expires: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DockerContainerMetrics {
pub container_id: String,
pub container_name: String,
pub cpu_percent: f64,
pub memory_usage_bytes: u64,
pub memory_limit_bytes: u64,
pub memory_percent: f64,
pub network_rx_bytes: u64,
pub network_tx_bytes: u64,
pub block_io_read_bytes: u64,
pub block_io_write_bytes: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SystemResourceMetrics {
pub cpu_percent: f64,
pub cpu_per_core: Vec<f64>,
pub memory_total_bytes: u64,
pub memory_used_bytes: u64,
pub memory_percent: f64,
pub disk_total_bytes: u64,
pub disk_used_bytes: u64,
pub disk_percent: f64,
pub network_rx_bytes_per_sec: u64,
pub network_tx_bytes_per_sec: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GodotPerformanceMetrics {
pub fps: f64,
pub target_fps: f64,
pub frame_time_ms: f64,
pub physics_time_ms: f64,
pub render_time_ms: f64,
pub idle_time_ms: f64,
pub total_frames: u64,
pub dropped_frames: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GodotSceneMetrics {
pub node_count: u64,
pub physics_body_count: u64,
pub memory_usage_bytes: u64,
pub static_memory_bytes: u64,
pub dynamic_memory_bytes: u64,
pub object_count: u64,
pub resource_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GodotConnectionMetrics {
pub control_connected: bool,
pub camera_connected: bool,
pub control_uptime_seconds: u64,
pub camera_uptime_seconds: u64,
pub control_reconnects: u64,
pub camera_reconnects: u64,
pub last_control_message_us: u64,
pub last_camera_frame_us: u64,
pub control_url: String,
pub camera_url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeHealthMetrics {
pub node_id: String,
pub healthy: bool,
pub messages_processed: u64,
pub message_rate: f64,
pub error_count: u64,
pub uptime_seconds: u64,
pub message: Option<String>,
}