feat: metrics tree with process information

This commit is contained in:
Alex Zenla
2024-04-12 07:21:21 +00:00
parent 8bebda62ad
commit 6fa61a72be
20 changed files with 479 additions and 121 deletions

View File

@ -12,9 +12,8 @@ use krata::{
control::{
control_service_server::ControlService, ConsoleDataReply, ConsoleDataRequest,
CreateGuestReply, CreateGuestRequest, DestroyGuestReply, DestroyGuestRequest,
GuestMetrics, ListGuestsReply, ListGuestsRequest, ReadGuestMetricsReply,
ReadGuestMetricsRequest, ResolveGuestReply, ResolveGuestRequest, WatchEventsReply,
WatchEventsRequest,
ListGuestsReply, ListGuestsRequest, ReadGuestMetricsReply, ReadGuestMetricsRequest,
ResolveGuestReply, ResolveGuestRequest, WatchEventsReply, WatchEventsRequest,
},
},
};
@ -28,6 +27,7 @@ use uuid::Uuid;
use crate::{
console::DaemonConsoleHandle, db::GuestStore, event::DaemonEventContext, idm::DaemonIdmHandle,
metrics::idm_metric_to_api,
};
pub struct ApiError {
@ -328,10 +328,7 @@ impl ControlService for RuntimeControlService {
let mut reply = ReadGuestMetricsReply::default();
if let IdmResponseType::Metrics(metrics) = response {
reply.metrics = Some(GuestMetrics {
total_memory_bytes: metrics.total_memory_bytes,
used_memory_bytes: metrics.used_memory_bytes,
});
reply.root = metrics.root.map(idm_metric_to_api);
}
Ok(Response::new(reply))
}

View File

@ -101,16 +101,16 @@ impl DaemonIdm {
if let Some(data) = data {
let buffer = buffers.entry(domid).or_insert_with_key(|_| BytesMut::new());
buffer.extend_from_slice(&data);
if buffer.len() < 2 {
if buffer.len() < 4 {
continue;
}
let size = (buffer[0] as u16 | (buffer[1] as u16) << 8) as usize;
let needed = size + 2;
let size = (buffer[0] as u32 | (buffer[1] as u32) << 8 | (buffer[2] as u32) << 16 | (buffer[3] as u32) << 24) as usize;
let needed = size + 4;
if buffer.len() < needed {
continue;
}
let mut packet = buffer.split_to(needed);
packet.advance(2);
packet.advance(4);
match IdmPacket::decode(packet) {
Ok(packet) => {
let _ = client_or_create(domid, &self.tx_sender, &self.clients, &self.feeds).await?;
@ -139,10 +139,12 @@ impl DaemonIdm {
x = self.tx_receiver.recv() => match x {
Some((domid, packet)) => {
let data = packet.encode_to_vec();
let mut buffer = vec![0u8; 2];
let length = data.len();
let mut buffer = vec![0u8; 4];
let length = data.len() as u32;
buffer[0] = length as u8;
buffer[1] = (length << 8) as u8;
buffer[2] = (length << 16) as u8;
buffer[3] = (length << 24) as u8;
buffer.extend_from_slice(&data);
self.tx_raw_sender.send((domid, buffer)).await?;
},

View File

@ -24,6 +24,7 @@ pub mod control;
pub mod db;
pub mod event;
pub mod idm;
pub mod metrics;
pub mod reconcile;
pub struct Daemon {

View File

@ -0,0 +1,27 @@
use krata::{
idm::protocol::{IdmMetricFormat, IdmMetricNode},
v1::common::{GuestMetricFormat, GuestMetricNode},
};
fn idm_metric_format_to_api(format: IdmMetricFormat) -> GuestMetricFormat {
match format {
IdmMetricFormat::Unknown => GuestMetricFormat::Unknown,
IdmMetricFormat::Bytes => GuestMetricFormat::Bytes,
IdmMetricFormat::Integer => GuestMetricFormat::Integer,
IdmMetricFormat::DurationSeconds => GuestMetricFormat::DurationSeconds,
}
}
pub fn idm_metric_to_api(node: IdmMetricNode) -> GuestMetricNode {
let format = node.format();
GuestMetricNode {
name: node.name,
value: node.value,
format: idm_metric_format_to_api(format).into(),
children: node
.children
.into_iter()
.map(idm_metric_to_api)
.collect::<Vec<_>>(),
}
}