1 Commits

Author SHA1 Message Date
Gilles Soulier 017d7bb1bb fix(smart v0.1.8): NVMe — contrôleur correct + flag -a pour attributs complets
- /sys/block expose nvme0n1 (namespace), mais smartctl a besoin du contrôleur
  nvme0 → déduplication via HashSet pour éviter les doublons nvme0n1/nvme0
- smartctl -j → smartctl -a -j pour inclure nvme_smart_health_information_log
  (sans -a, le log de santé NVMe n'est pas dans la sortie JSON)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 07:07:45 +02:00
4 changed files with 18 additions and 4 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "nanometrics-agent" name = "nanometrics-agent"
version = "0.1.7" version = "0.1.8"
edition = "2021" edition = "2021"
[lib] [lib]
+17 -3
View File
@@ -89,15 +89,29 @@ pub fn collect() -> Option<Vec<crate::payload::SmartMetrics>> {
.flatten() .flatten()
.flatten() .flatten()
.map(|e| e.file_name().into_string().unwrap_or_default()) .map(|e| e.file_name().into_string().unwrap_or_default())
.filter(|n| n.starts_with("sd") || n.starts_with("nvme")) .filter_map(|n| {
.map(|n| format!("/dev/{}", n)) if n.starts_with("sd") {
Some(format!("/dev/{}", n))
} else if n.starts_with("nvme") && !n.contains('n') {
// /sys/block contient nvme0n1 (namespace) — on utilise le contrôleur nvme0
Some(format!("/dev/{}", n))
} else if n.starts_with("nvme") && n.contains('n') {
// Déduit le contrôleur depuis nvme0n1 → nvme0
let ctrl = n.split('n').next()?;
Some(format!("/dev/{}", ctrl))
} else {
None
}
})
.collect::<std::collections::HashSet<_>>()
.into_iter()
.collect(); .collect();
devs.sort(); devs.sort();
let mut results = Vec::new(); let mut results = Vec::new();
for dev in &devs { for dev in &devs {
let Ok(output) = std::process::Command::new("smartctl") let Ok(output) = std::process::Command::new("smartctl")
.args(["-j", dev]) .args(["-a", "-j", dev])
.output() else { continue }; .output() else { continue };
let json = String::from_utf8_lossy(&output.stdout); let json = String::from_utf8_lossy(&output.stdout);
if let Ok(metrics) = parse_json(&json) { if let Ok(metrics) = parse_json(&json) {
Binary file not shown.
Binary file not shown.