Skip to main content

aiway_protocol/gateway/
state.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Default, Serialize, Deserialize)]
4pub struct State {
5    /// 时间戳,单位毫秒
6    pub timestamp: i64,
7    /// 节点信息
8    pub node_info: NodeInfo,
9    pub pid: u32,
10    /// 系统状态
11    pub system_state: SystemState,
12    /// 计数器
13    pub counter: Counter,
14    /// 瞬时计数器
15    pub moment_counter: MomentCounter,
16    /// 其他自定义数据
17    pub custom: Option<serde_json::Value>,
18}
19
20#[derive(Debug, Clone, Default, Serialize, Deserialize)]
21pub struct NodeInfo {
22    pub node_id: String,
23    pub ip: String,
24    pub port: u16,
25}
26#[derive(Debug, Clone, Default, Serialize, Deserialize)]
27pub struct SystemState {
28    /// 操作系统及版本,如: Ubuntu 22.04
29    pub os: String,
30    /// 系统架构
31    pub arch: String,
32    /// 主机名
33    pub host_name: String,
34    /// 运行时间,单位:秒
35    pub uptime: u64,
36    /// CPU 状态
37    pub cpu: Option<CpuState>,
38    /// 内存状态
39    pub mem_state: MemState,
40    /// 磁盘状态
41    pub disk_state: DiskState,
42    /// 网络状态
43    pub net_state: NetState,
44    /// GPU 状态
45    pub gpu_state: Option<GpuState>,
46}
47
48#[derive(Debug, Clone, Default, Serialize, Deserialize)]
49pub struct CpuState {
50    pub name: String,
51    pub usage: f32,
52}
53
54/// 内存状态
55#[derive(Debug, Clone, Default, Serialize, Deserialize)]
56pub struct MemState {
57    /// 总内存,单位:Bytes
58    pub total: u64,
59    /// 空闲内存,单位:Bytes
60    pub free: u64,
61    /// 使用内存,单位:Bytes
62    pub used: u64,
63}
64
65/// 磁盘状态
66#[derive(Debug, Clone, Default, Serialize, Deserialize)]
67pub struct DiskState {
68    /// 总空间,单位:Bytes
69    pub total: u64,
70    /// 空闲空间,单位:Bytes
71    pub free: u64,
72}
73
74/// 网络状态
75#[derive(Debug, Clone, Default, Serialize, Deserialize)]
76pub struct NetState {
77    /// 接收的字节数
78    pub rx: u64,
79    /// 发送的字节数
80    pub tx: u64,
81    /// TCP 连接数
82    pub tcp_conn_count: usize,
83}
84
85/// GPU 状态
86#[derive(Debug, Clone, Default, Serialize, Deserialize)]
87pub struct GpuState {
88    /// GPU 厂商, 如: nvidia, apple
89    pub provider: GpuProvider,
90    /// GPU 列表
91    pub gpus: Vec<GpuInfo>,
92    /// 其他自定义数据
93    pub custom: Option<serde_json::Value>,
94}
95
96#[derive(Debug, Clone, Default, Serialize, Deserialize)]
97pub enum GpuProvider {
98    Nvidia,
99    Apple,
100    Custom(String),
101    #[default]
102    Unknown,
103}
104
105/// 单个 GPU 信息
106#[derive(Debug, Clone, Default, Serialize, Deserialize)]
107pub struct GpuInfo {
108    /// GPU 名称
109    pub name: String,
110    /// GPU 使用率 (0-100)
111    pub usage: f32,
112    /// 显存总量,单位:Bytes
113    pub memory_total: u64,
114    /// 显存已使用,单位:Bytes
115    pub memory_used: u64,
116    /// 显存空闲,单位:Bytes
117    pub memory_free: u64,
118    /// GPU 温度,单位:摄氏度
119    pub temperature: u32,
120    /// GPU 功率,单位:瓦特
121    pub power_usage: u32,
122}
123
124/// 计数器
125///
126/// 注意:该计数器仅统计自上次上报到现在为止这段时间内的数据。
127/// 上报到控制台后,由控制台汇总。
128#[derive(Debug, Default, Clone, Serialize, Deserialize)]
129pub struct Counter {
130    /// 自从上次统计到现在的请求数
131    /// 统计范围:
132    /// - 所有进入到网关的请求,包含后续可能被防火墙拦截的请求
133    pub request_count: usize,
134    /// 非法请求数
135    /// 统计范围:
136    /// - 由安全组件拦截到的无效、非法、恶意请求等
137    /// - 拦截的请求会返回403错误,也会被计算到4xx响应数中
138    pub request_invalid_count: usize,
139    /// 自从上次统计到现在的 2xx 响应数
140    pub response_2xx_count: usize,
141    /// 自从上次统计到现在的 3xx 响应数
142    pub response_3xx_count: usize,
143    /// 自从上次统计到现在的 4xx 响应数
144    /// 统计范围:
145    /// - 前置安全验证不通过的
146    /// - API Key验证失败的
147    /// - 客户端错误(一般是参数错误)
148    pub response_4xx_count: usize,
149    /// 自从上次统计到现在的 5xx 响应数。
150    /// 5xx为重要关注指标
151    pub response_5xx_count: usize,
152    /// 自从上次统计到现在的请求累计响应时间,单位:毫秒
153    /// 统计范围:
154    /// - 每个请求的响应时间
155    ///
156    /// 统计周期内的平均响应时间 = response_time_since_last / request_count
157    pub response_time_since_last: usize,
158}
159
160/// 瞬时计数器
161#[derive(Debug, Clone, Default, Serialize, Deserialize)]
162pub struct MomentCounter {
163    /// 统计时刻的http连接数
164    /// 该值用于记录在上报时,仍处于连接状态的http请求的数量。
165    /// 统计范围:
166    /// - 所有请求
167    /// - 请求时,+1,清理或发生panic时,-1
168    /// - 不含被防火墙拦截的请求
169    ///
170    pub http_connect_count: isize,
171    /// SSE计数
172    pub sse_connect_count: isize,
173    /// WebSocket计数
174    pub websocket_connect_count: isize,
175}
176
177impl State {
178    pub fn reset_counter(&mut self) {
179        self.counter.request_count = 0;
180        self.counter.response_time_since_last = 0;
181        self.counter.request_invalid_count = 0;
182        self.counter.response_2xx_count = 0;
183        self.counter.response_3xx_count = 0;
184        self.counter.response_4xx_count = 0;
185        self.counter.response_5xx_count = 0;
186    }
187}