Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9eb7444d56 | |||
| 278d1763aa | |||
| f874264e13 |
6
Cargo.lock
generated
6
Cargo.lock
generated
@@ -270,7 +270,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cm-dashboard"
|
name = "cm-dashboard"
|
||||||
version = "0.1.56"
|
version = "0.1.59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
@@ -292,7 +292,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cm-dashboard-agent"
|
name = "cm-dashboard-agent"
|
||||||
version = "0.1.56"
|
version = "0.1.59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
@@ -315,7 +315,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cm-dashboard-shared"
|
name = "cm-dashboard-shared"
|
||||||
version = "0.1.56"
|
version = "0.1.59"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"serde",
|
"serde",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cm-dashboard-agent"
|
name = "cm-dashboard-agent"
|
||||||
version = "0.1.57"
|
version = "0.1.60"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cm-dashboard"
|
name = "cm-dashboard"
|
||||||
version = "0.1.57"
|
version = "0.1.60"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -191,6 +191,17 @@ impl Dashboard {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Render UI immediately after handling input for responsive feedback
|
||||||
|
if let Some(ref mut terminal) = self.terminal {
|
||||||
|
if let Some(ref mut tui_app) = self.tui_app {
|
||||||
|
if let Err(e) = terminal.draw(|frame| {
|
||||||
|
tui_app.render(frame, &self.metric_store);
|
||||||
|
}) {
|
||||||
|
error!("Error rendering TUI after input: {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for new metrics
|
// Check for new metrics
|
||||||
|
|||||||
@@ -90,10 +90,13 @@ pub struct TuiApp {
|
|||||||
user_navigated_away: bool,
|
user_navigated_away: bool,
|
||||||
/// Dashboard configuration
|
/// Dashboard configuration
|
||||||
config: DashboardConfig,
|
config: DashboardConfig,
|
||||||
|
/// Cached localhost hostname to avoid repeated system calls
|
||||||
|
localhost: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TuiApp {
|
impl TuiApp {
|
||||||
pub fn new(config: DashboardConfig) -> Self {
|
pub fn new(config: DashboardConfig) -> Self {
|
||||||
|
let localhost = gethostname::gethostname().to_string_lossy().to_string();
|
||||||
let mut app = Self {
|
let mut app = Self {
|
||||||
host_widgets: HashMap::new(),
|
host_widgets: HashMap::new(),
|
||||||
current_host: None,
|
current_host: None,
|
||||||
@@ -102,6 +105,7 @@ impl TuiApp {
|
|||||||
should_quit: false,
|
should_quit: false,
|
||||||
user_navigated_away: false,
|
user_navigated_away: false,
|
||||||
config,
|
config,
|
||||||
|
localhost,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sort predefined hosts
|
// Sort predefined hosts
|
||||||
@@ -131,31 +135,31 @@ impl TuiApp {
|
|||||||
// Only update widgets if we have metrics for this host
|
// Only update widgets if we have metrics for this host
|
||||||
let all_metrics = metric_store.get_metrics_for_host(&hostname);
|
let all_metrics = metric_store.get_metrics_for_host(&hostname);
|
||||||
if !all_metrics.is_empty() {
|
if !all_metrics.is_empty() {
|
||||||
// Get metrics first while hostname is borrowed
|
// Single pass metric categorization for better performance
|
||||||
let cpu_metrics: Vec<&Metric> = all_metrics
|
let mut cpu_metrics = Vec::new();
|
||||||
.iter()
|
let mut memory_metrics = Vec::new();
|
||||||
.filter(|m| {
|
let mut service_metrics = Vec::new();
|
||||||
m.name.starts_with("cpu_")
|
let mut backup_metrics = Vec::new();
|
||||||
|| m.name.contains("c_state_")
|
let mut nixos_metrics = Vec::new();
|
||||||
|| m.name.starts_with("process_top_")
|
let mut disk_metrics = Vec::new();
|
||||||
})
|
|
||||||
.copied()
|
for metric in all_metrics {
|
||||||
.collect();
|
if metric.name.starts_with("cpu_")
|
||||||
let memory_metrics: Vec<&Metric> = all_metrics
|
|| metric.name.contains("c_state_")
|
||||||
.iter()
|
|| metric.name.starts_with("process_top_") {
|
||||||
.filter(|m| m.name.starts_with("memory_") || m.name.starts_with("disk_tmp_"))
|
cpu_metrics.push(metric);
|
||||||
.copied()
|
} else if metric.name.starts_with("memory_") || metric.name.starts_with("disk_tmp_") {
|
||||||
.collect();
|
memory_metrics.push(metric);
|
||||||
let service_metrics: Vec<&Metric> = all_metrics
|
} else if metric.name.starts_with("service_") {
|
||||||
.iter()
|
service_metrics.push(metric);
|
||||||
.filter(|m| m.name.starts_with("service_"))
|
} else if metric.name.starts_with("backup_") {
|
||||||
.copied()
|
backup_metrics.push(metric);
|
||||||
.collect();
|
} else if metric.name == "system_nixos_build" || metric.name == "system_active_users" || metric.name == "agent_version" {
|
||||||
let all_backup_metrics: Vec<&Metric> = all_metrics
|
nixos_metrics.push(metric);
|
||||||
.iter()
|
} else if metric.name.starts_with("disk_") {
|
||||||
.filter(|m| m.name.starts_with("backup_"))
|
disk_metrics.push(metric);
|
||||||
.copied()
|
}
|
||||||
.collect();
|
}
|
||||||
|
|
||||||
// Clear completed transitions first
|
// Clear completed transitions first
|
||||||
self.clear_completed_transitions(&hostname, &service_metrics);
|
self.clear_completed_transitions(&hostname, &service_metrics);
|
||||||
@@ -166,21 +170,7 @@ impl TuiApp {
|
|||||||
// Collect all system metrics (CPU, memory, NixOS, disk/storage)
|
// Collect all system metrics (CPU, memory, NixOS, disk/storage)
|
||||||
let mut system_metrics = cpu_metrics;
|
let mut system_metrics = cpu_metrics;
|
||||||
system_metrics.extend(memory_metrics);
|
system_metrics.extend(memory_metrics);
|
||||||
|
|
||||||
// Add NixOS metrics - using exact matching for build display fix
|
|
||||||
let nixos_metrics: Vec<&Metric> = all_metrics
|
|
||||||
.iter()
|
|
||||||
.filter(|m| m.name == "system_nixos_build" || m.name == "system_active_users" || m.name == "agent_version")
|
|
||||||
.copied()
|
|
||||||
.collect();
|
|
||||||
system_metrics.extend(nixos_metrics);
|
system_metrics.extend(nixos_metrics);
|
||||||
|
|
||||||
// Add disk/storage metrics
|
|
||||||
let disk_metrics: Vec<&Metric> = all_metrics
|
|
||||||
.iter()
|
|
||||||
.filter(|m| m.name.starts_with("disk_"))
|
|
||||||
.copied()
|
|
||||||
.collect();
|
|
||||||
system_metrics.extend(disk_metrics);
|
system_metrics.extend(disk_metrics);
|
||||||
|
|
||||||
host_widgets.system_widget.update_from_metrics(&system_metrics);
|
host_widgets.system_widget.update_from_metrics(&system_metrics);
|
||||||
@@ -189,7 +179,7 @@ impl TuiApp {
|
|||||||
.update_from_metrics(&service_metrics);
|
.update_from_metrics(&service_metrics);
|
||||||
host_widgets
|
host_widgets
|
||||||
.backup_widget
|
.backup_widget
|
||||||
.update_from_metrics(&all_backup_metrics);
|
.update_from_metrics(&backup_metrics);
|
||||||
|
|
||||||
host_widgets.last_update = Some(Instant::now());
|
host_widgets.last_update = Some(Instant::now());
|
||||||
}
|
}
|
||||||
@@ -221,13 +211,12 @@ impl TuiApp {
|
|||||||
self.available_hosts = all_hosts;
|
self.available_hosts = all_hosts;
|
||||||
|
|
||||||
// Get the current hostname (localhost) for auto-selection
|
// Get the current hostname (localhost) for auto-selection
|
||||||
let localhost = gethostname::gethostname().to_string_lossy().to_string();
|
|
||||||
if !self.available_hosts.is_empty() {
|
if !self.available_hosts.is_empty() {
|
||||||
if self.available_hosts.contains(&localhost) && !self.user_navigated_away {
|
if self.available_hosts.contains(&self.localhost) && !self.user_navigated_away {
|
||||||
// Localhost is available and user hasn't navigated away - switch to it
|
// Localhost is available and user hasn't navigated away - switch to it
|
||||||
self.current_host = Some(localhost.clone());
|
self.current_host = Some(self.localhost.clone());
|
||||||
// Find the actual index of localhost in the sorted list
|
// Find the actual index of localhost in the sorted list
|
||||||
self.host_index = self.available_hosts.iter().position(|h| h == &localhost).unwrap_or(0);
|
self.host_index = self.available_hosts.iter().position(|h| h == &self.localhost).unwrap_or(0);
|
||||||
} else if self.current_host.is_none() {
|
} else if self.current_host.is_none() {
|
||||||
// No current host - select first available (which is localhost if available)
|
// No current host - select first available (which is localhost if available)
|
||||||
self.current_host = Some(self.available_hosts[0].clone());
|
self.current_host = Some(self.available_hosts[0].clone());
|
||||||
@@ -424,9 +413,8 @@ impl TuiApp {
|
|||||||
self.current_host = Some(self.available_hosts[self.host_index].clone());
|
self.current_host = Some(self.available_hosts[self.host_index].clone());
|
||||||
|
|
||||||
// Check if user navigated away from localhost
|
// Check if user navigated away from localhost
|
||||||
let localhost = gethostname::gethostname().to_string_lossy().to_string();
|
|
||||||
if let Some(ref current) = self.current_host {
|
if let Some(ref current) = self.current_host {
|
||||||
if current != &localhost {
|
if current != &self.localhost {
|
||||||
self.user_navigated_away = true;
|
self.user_navigated_away = true;
|
||||||
} else {
|
} else {
|
||||||
self.user_navigated_away = false; // User navigated back to localhost
|
self.user_navigated_away = false; // User navigated back to localhost
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cm-dashboard-shared"
|
name = "cm-dashboard-shared"
|
||||||
version = "0.1.57"
|
version = "0.1.60"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
Reference in New Issue
Block a user