use crate::{fault::Fault, jsonrpc::RpcMethod, types::Generation};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum LifecycleState {
Cold,
Starting,
Ready,
Recovering,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RolloutState {
Stable,
Pending,
Reloading,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct HealthSnapshot {
pub state: LifecycleState,
pub generation: Generation,
pub uptime_ms: u64,
pub consecutive_failures: u32,
pub restart_count: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub rollout: Option<RolloutState>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_fault: Option<Fault>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TelemetryTotals {
pub request_count: u64,
pub success_count: u64,
pub response_error_count: u64,
pub transport_fault_count: u64,
pub retry_count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct MethodTelemetry {
pub method: RpcMethod,
pub request_count: u64,
pub success_count: u64,
pub response_error_count: u64,
pub transport_fault_count: u64,
pub retry_count: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_latency_ms: Option<u64>,
pub max_latency_ms: u64,
pub avg_latency_ms: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct TelemetrySnapshot {
pub uptime_ms: u64,
pub state: LifecycleState,
pub generation: Generation,
pub consecutive_failures: u32,
pub restart_count: u64,
pub totals: TelemetryTotals,
pub methods: Vec<MethodTelemetry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_fault: Option<Fault>,
}