Skip to content

Commit bcc13fa

Browse files
authored
Feat ping with node usage (#298)
* refactor: move gateway http logic to separate part * feat: collect node metrics to gateway services
1 parent e856cb8 commit bcc13fa

File tree

17 files changed

+618
-285
lines changed

17 files changed

+618
-285
lines changed

Cargo.lock

Lines changed: 55 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ We are actively refactoring entire media server and network stack with [sans-io-
6363
| MoQ | Media-over-Quic ||
6464
| Monitoring | Dashboard for monitoring ||
6565
| Recording | Record stream ||
66-
| Gateway | External gateway [RFC-0003](https://github.com/8xFF/rfcs/pull/3) | 🚧 |
66+
| Gateway | External gateway [RFC-0003](https://github.com/8xFF/rfcs/pull/3) | 🚀 |
6767
| Connector | External event handling ||
6868

6969
Status:

bin/Cargo.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ convert-enum = { workspace = true }
2828
num_enum = { workspace = true }
2929
derive_more = { workspace = true }
3030
rcgen = { version = "0.13", optional = true }
31-
maxminddb = "0.24.0"
31+
maxminddb = { version = "0.24.0", optional = true }
32+
sysinfo = { version = "0.30.12", optional = true }
3233

3334
[features]
3435
default = ["gateway", "media", "connector", "cert_utils"]
35-
gateway = ["media-server-gateway", "quinn_vnet"]
36-
media = ["media-server-runner", "quinn_vnet"]
36+
gateway = ["media-server-gateway", "quinn_vnet", "node_metrics", "maxminddb"]
37+
media = ["media-server-runner", "quinn_vnet", "node_metrics"]
3738
connector = ["quinn_vnet"]
3839
cert_utils = ["rcgen", "rustls"]
3940
quinn_vnet = ["rustls", "quinn"]
41+
node_metrics = ["sysinfo"]

bin/src/errors.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,7 @@
33
pub enum MediaServerError {
44
GatewayRpcError = 0x00020001,
55
InvalidConnId = 0x00020002,
6+
NodePoolEmpty = 0x00020003,
7+
MediaResError = 0x00020004,
8+
NotImplemented = 0x00020005,
69
}

bin/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use atm0s_sdn::{NodeAddr, NodeId};
44

55
mod errors;
66
mod http;
7+
#[cfg(feature = "node_metrics")]
8+
mod node_metrics;
79
#[cfg(feature = "quinn_vnet")]
810
mod quinn;
911
pub mod server;

bin/src/node_metrics.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use std::{
2+
sync::mpsc::{channel, Receiver},
3+
time::Duration,
4+
};
5+
6+
use media_server_gateway::NodeMetrics;
7+
use sans_io_runtime::ErrorDebugger2;
8+
use sysinfo::{Disks, System};
9+
10+
const REFRESH_INTERVAL_SECONDS: u64 = 2;
11+
12+
pub struct NodeMetricsCollector {
13+
rx: Receiver<NodeMetrics>,
14+
}
15+
16+
impl Default for NodeMetricsCollector {
17+
fn default() -> Self {
18+
let (tx, rx) = channel();
19+
let mut sys = System::new_all();
20+
let mut disks = Disks::new();
21+
22+
disks.refresh_list();
23+
sys.refresh_all();
24+
sys.refresh_cpu();
25+
26+
std::thread::spawn(move || {
27+
loop {
28+
disks.refresh();
29+
sys.refresh_all();
30+
sys.refresh_cpu();
31+
32+
let mut sum = 0.0;
33+
for cpu in sys.cpus() {
34+
sum += cpu.cpu_usage();
35+
}
36+
37+
let mut disk_used = 0;
38+
let mut disk_sum = 0;
39+
for disk in disks.iter() {
40+
disk_sum += disk.total_space();
41+
disk_used += disk.total_space() - disk.available_space();
42+
}
43+
44+
tx.send(NodeMetrics {
45+
cpu: (sum as usize / sys.cpus().len()) as u8,
46+
memory: (100 * sys.used_memory() / sys.total_memory()) as u8,
47+
disk: (100 * disk_used / disk_sum) as u8,
48+
})
49+
.print_err2("Collect node metrics error");
50+
51+
// Sleeping to let time for the system to run for long
52+
// enough to have useful information.
53+
std::thread::sleep(Duration::from_secs(REFRESH_INTERVAL_SECONDS));
54+
}
55+
});
56+
57+
Self { rx }
58+
}
59+
}
60+
61+
impl NodeMetricsCollector {
62+
/// Only return data in each interval, if not return None.
63+
/// Node that this method must node blocking thread
64+
pub fn pop_measure(&mut self) -> Option<NodeMetrics> {
65+
self.rx.try_recv().ok()
66+
}
67+
}

0 commit comments

Comments
 (0)