Skip to main content

AirLibrary/Client/AirClient/
GetResourceUsage.rs

1//! `AirClient::GetResourceUsage` - fetches a structured resource snapshot
2//! from the Air daemon (memory, CPU, disk, network).
3//!
4//! `thread_count` and `open_file_handles` default to `0` because the
5//! daemon's `ResourceUsageResponse` proto does not yet carry those
6//! fields; populate them on the daemon side when needed.
7
8use tonic::Request;
9
10use crate::{
11	AirError,
12	Client::AirClient::{AirClient, ResourceUsage},
13	Vine::Generated::air::ResourceUsageRequest,
14	dev_log,
15};
16
17impl AirClient {
18	/// Gets daemon resource-usage stats.
19	pub async fn GetResourceUsage(&self, request_id:String) -> Result<ResourceUsage::Struct, AirError> {
20		dev_log!("grpc", "[AirClient] Getting resource usage");
21
22		let RequestPayload = ResourceUsageRequest { request_id };
23
24		let Client = self
25			.Client()
26			.ok_or_else(|| AirError::Network("Air client not initialized".to_string()))?;
27
28		let mut ClientGuard = Client.lock().await;
29
30		match ClientGuard.get_resource_usage(Request::new(RequestPayload)).await {
31			Ok(Response) => {
32				let Response = Response.into_inner();
33
34				dev_log!("grpc", "[AirClient] Resource usage retrieved");
35
36				Ok(ResourceUsage::Struct {
37					memory_usage_mb:Response.memory_usage_mb,
38					cpu_usage_percent:Response.cpu_usage_percent,
39					disk_usage_mb:Response.disk_usage_mb,
40					network_usage_mbps:Response.network_usage_mbps,
41					thread_count:0,
42					open_file_handles:0,
43				})
44			},
45
46			Err(Status) => {
47				dev_log!("grpc", "error: [AirClient] Get resource usage RPC error: {}", Status);
48
49				Err(AirError::Network(format!("Get resource usage RPC error: {}", Status)))
50			},
51		}
52	}
53}