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    /// 系统状态
10    pub system_state: SystemState,
11    /// 计数器
12    pub counter: Counter,
13    /// 瞬时计数器
14    pub moment_counter: MomentCounter,
15}
16
17#[derive(Debug, Clone, Default, Serialize, Deserialize)]
18pub struct NodeInfo {
19    pub node_id: String,
20    pub ip: String,
21    pub port: u16,
22}
23#[derive(Debug, Clone, Default, Serialize, Deserialize)]
24pub struct SystemState {
25    /// 操作系统及版本,如: Ubuntu 22.04
26    pub os: String,
27    /// CPU 架构
28    pub arch: String,
29    /// 主机名
30    pub host_name: String,
31    /// 运行时间,单位:秒
32    pub uptime: u64,
33    /// cpu 使用率
34    pub cpu_usage: f32,
35    /// 内存状态
36    pub mem_state: MemState,
37    /// 磁盘状态
38    pub disk_state: DiskState,
39    /// 网络状态
40    pub net_state: NetState,
41}
42
43/// 内存状态
44#[derive(Debug, Clone, Default, Serialize, Deserialize)]
45pub struct MemState {
46    /// 总内存,单位:Bytes
47    pub total: u64,
48    /// 空闲内存,单位:Bytes
49    pub free: u64,
50    /// 使用内存,单位:Bytes
51    pub used: u64,
52}
53
54/// 磁盘状态
55#[derive(Debug, Clone, Default, Serialize, Deserialize)]
56pub struct DiskState {
57    /// 总空间,单位:Bytes
58    pub total: u64,
59    /// 空闲空间,单位:Bytes
60    pub free: u64,
61}
62
63/// 网络状态
64#[derive(Debug, Clone, Default, Serialize, Deserialize)]
65pub struct NetState {
66    /// 接收的字节数
67    pub rx: u64,
68    /// 发送的字节数
69    pub tx: u64,
70    /// TCP连接数
71    pub tcp_conn_count: usize,
72}
73
74/// 计数器
75///
76/// 注意:该计数器仅统计自上次上报到现在为止这段时间内的数据。
77/// 上报到控制台后,由控制台汇总。
78#[derive(Debug, Default, Clone, Serialize, Deserialize)]
79pub struct Counter {
80    /// 自从上次统计到现在的请求数
81    /// 统计范围:
82    /// - 所有进入到网关的请求,包含后续可能被防火墙拦截的请求
83    pub request_count: usize,
84    /// 非法请求数
85    /// 统计范围:
86    /// - 由安全组件拦截到的无效、非法、恶意请求等
87    /// - 拦截的请求会返回403错误,也会被计算到4xx响应数中
88    pub request_invalid_count: usize,
89    /// 自从上次统计到现在的 2xx 响应数
90    pub response_2xx_count: usize,
91    /// 自从上次统计到现在的 3xx 响应数
92    pub response_3xx_count: usize,
93    /// 自从上次统计到现在的 4xx 响应数
94    /// 统计范围:
95    /// - 前置安全验证不通过的
96    /// - API Key验证失败的
97    /// - 客户端错误(一般是参数错误)
98    pub response_4xx_count: usize,
99    /// 自从上次统计到现在的 5xx 响应数。
100    /// 5xx为重要关注指标
101    pub response_5xx_count: usize,
102    /// 自从上次统计到现在的请求累计响应时间,单位:毫秒
103    /// 统计范围:
104    /// - 每个请求的响应时间
105    ///
106    /// 统计周期内的平均响应时间 = response_time_since_last / request_count
107    pub response_time_since_last: usize,
108}
109
110/// 瞬时计数器
111#[derive(Debug, Clone, Default, Serialize, Deserialize)]
112pub struct MomentCounter {
113    /// 统计时刻的http连接数
114    /// 该值用于记录在上报时,仍处于连接状态的http请求的数量。
115    /// 统计范围:
116    /// - 所有请求
117    /// - 请求时,+1,清理或发生panic时,-1
118    /// - 不含被防火墙拦截的请求
119    ///
120    pub http_connect_count: isize,
121    /// SSE计数
122    pub sse_connect_count: isize,
123    /// WebSocket计数
124    pub websocket_connect_count: isize,
125}
126
127impl State {
128    pub fn reset_counter(&mut self) {
129        self.counter.request_count = 0;
130        self.counter.response_time_since_last = 0;
131        self.counter.request_invalid_count = 0;
132        self.counter.response_2xx_count = 0;
133        self.counter.response_3xx_count = 0;
134        self.counter.response_4xx_count = 0;
135        self.counter.response_5xx_count = 0;
136    }
137}