Remove hardcoded /tmp autodetection and implement proper tmpfs monitoring

- Remove /tmp autodetection from disk collector (57 lines removed)
- Add tmpfs monitoring to memory collector with get_tmpfs_metrics() method
- Generate memory_tmp_* metrics for proper RAM-based tmpfs monitoring
- Fix type annotations in tmpfs parsing for compilation
- System widget now correctly displays tmpfs usage in RAM section
This commit is contained in:
2025-10-23 14:26:15 +02:00
parent 39fc9cd22f
commit 9e80d6b654
3 changed files with 95 additions and 75 deletions

View File

@@ -188,8 +188,98 @@ impl MemoryCollector {
);
}
// Monitor tmpfs (/tmp) usage
if let Ok(tmpfs_metrics) = self.get_tmpfs_metrics() {
metrics.extend(tmpfs_metrics);
}
metrics
}
/// Get tmpfs (/tmp) usage metrics
fn get_tmpfs_metrics(&self) -> Result<Vec<Metric>, CollectorError> {
use std::process::Command;
let output = Command::new("df")
.arg("--block-size=1")
.arg("/tmp")
.output()
.map_err(|e| CollectorError::SystemRead {
path: "/tmp".to_string(),
error: e.to_string(),
})?;
if !output.status.success() {
return Ok(Vec::new()); // Return empty if /tmp not available
}
let output_str = String::from_utf8(output.stdout)
.map_err(|e| CollectorError::Parse {
value: "df output".to_string(),
error: e.to_string(),
})?;
let lines: Vec<&str> = output_str.lines().collect();
if lines.len() < 2 {
return Ok(Vec::new());
}
let fields: Vec<&str> = lines[1].split_whitespace().collect();
if fields.len() < 4 {
return Ok(Vec::new());
}
let total_bytes: u64 = fields[1].parse()
.map_err(|e: std::num::ParseIntError| CollectorError::Parse {
value: fields[1].to_string(),
error: e.to_string(),
})?;
let used_bytes: u64 = fields[2].parse()
.map_err(|e: std::num::ParseIntError| CollectorError::Parse {
value: fields[2].to_string(),
error: e.to_string(),
})?;
let total_gb = total_bytes as f32 / (1024.0 * 1024.0 * 1024.0);
let used_gb = used_bytes as f32 / (1024.0 * 1024.0 * 1024.0);
let usage_percent = if total_bytes > 0 {
(used_bytes as f32 / total_bytes as f32) * 100.0
} else {
0.0
};
let mut metrics = Vec::new();
let timestamp = chrono::Utc::now().timestamp() as u64;
metrics.push(Metric {
name: "memory_tmp_usage_percent".to_string(),
value: MetricValue::Float(usage_percent),
unit: Some("%".to_string()),
description: Some("tmpfs /tmp usage percentage".to_string()),
status: Status::Ok,
timestamp,
});
metrics.push(Metric {
name: "memory_tmp_used_gb".to_string(),
value: MetricValue::Float(used_gb),
unit: Some("GB".to_string()),
description: Some("tmpfs /tmp used space".to_string()),
status: Status::Ok,
timestamp,
});
metrics.push(Metric {
name: "memory_tmp_total_gb".to_string(),
value: MetricValue::Float(total_gb),
unit: Some("GB".to_string()),
description: Some("tmpfs /tmp total space".to_string()),
status: Status::Ok,
timestamp,
});
Ok(metrics)
}
}
#[async_trait]