aboutsummaryrefslogtreecommitdiffstats
path: root/collectors/smart-selftest.py
diff options
context:
space:
mode:
Diffstat (limited to 'collectors/smart-selftest.py')
-rw-r--r--collectors/smart-selftest.py18
1 files changed, 15 insertions, 3 deletions
diff --git a/collectors/smart-selftest.py b/collectors/smart-selftest.py
index fa9d68f..6cb026c 100644
--- a/collectors/smart-selftest.py
+++ b/collectors/smart-selftest.py
@@ -231,13 +231,25 @@ def collect_identity(reg: Registry, name: str, data: dict) -> None:
This exists to be read by a human in a Grafana row title, so it is deliberately a
single rendered string rather than separate labels -- Grafana can interpolate a
variable's display text into a title, but cannot assemble one from several labels.
+
+ Emits nothing unless smartctl actually returned identifying data. When it cannot
+ open the device -- no privileges, a controller that needs an explicit -d type -- it
+ still exits 0 with a well-formed JSON document that simply has no identity fields,
+ and filling those in with placeholders would put "unknown model · no serial" in a
+ dashboard row title. Emitting nothing instead lets the `smartctl:ident` recording
+ rule fall back to "identity pending", which is the truth.
"""
model = (data.get("model_name") or data.get("scsi_model_name")
- or (data.get("scsi_product") or "") or "unknown model")
- serial = data.get("serial_number") or "no serial"
+ or data.get("scsi_product") or "")
+ serial = data.get("serial_number") or ""
capacity = human_capacity((data.get("user_capacity") or {}).get("bytes"))
- parts = [p for p in (capacity, technology(data), model, serial) if p]
+ if not (model or serial or capacity):
+ warn(f"{name}: no identity data; is smartctl able to open the device?")
+ return
+
+ parts = [p for p in (capacity, technology(data), model or "unknown model",
+ serial or "no serial") if p]
reg.add("smart_drive_label", 1, {"device": name, "label": " · ".join(parts)},
"Drive identity rendered for display; the value is always 1.")