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