diff --git a/roles/float-base/files/node-exporter-scripts/smartmon.py b/roles/float-base/files/node-exporter-scripts/smartmon.py index 7f32f77f67cd83892defaa1b36800763abd38f28..7cfb6c1fdf78260b3107d6206100b37b8d11d8ff 100644 --- a/roles/float-base/files/node-exporter-scripts/smartmon.py +++ b/roles/float-base/files/node-exporter-scripts/smartmon.py @@ -196,10 +196,10 @@ def _wrap_hours(power_on_hours, n): # wraps around. Try to put it back in the range of the current # value of power_on_hours, although now we're just making up data # and this will fail spectacularly in certain circumstances. - if power_on_hours < 65536: - return n - if n < (power_on_hours & 0xffff): - return (power_on_hours & 0xffff0000) + n + up = power_on_hours & 0xffff0000 + n = up + n + while n > power_on_hours: + n -= 65536 return n @@ -214,6 +214,8 @@ def collect_self_test_status(device, data): # Attempt to extract the most recent self test status by type. most_recent_test_by_type = {} for test in data['ata_smart_self_test_log']['standard']['table']: + # Fix the timestamp + test['lifetime_hours'] = _wrap_hours(power_on_hours, test['lifetime_hours']) key = test['type']['value'] if (key not in most_recent_test_by_type) or \ (test['lifetime_hours'] > most_recent_test_by_type[key]['lifetime_hours']): @@ -222,8 +224,7 @@ def collect_self_test_status(device, data): labels = {'test': to_label_value(test['type']['string'])} labels.update(device.labels) yield Gauge('self_test_status', labels, test['status']['passed']) - yield Gauge('self_test_hours', labels, - _wrap_hours(power_on_hours, test['lifetime_hours'])) + yield Gauge('self_test_hours', labels, test['lifetime_hours']) def collect_ata_attributes(device, data):