From b696fb941752e71fde23e32db88efa3a41e4d0db Mon Sep 17 00:00:00 2001 From: Josh Powers Date: Thu, 9 May 2024 13:17:23 -0600 Subject: [PATCH 1/2] fix(inputs.smartctl): Add additional fields fixes: #15188 --- plugins/inputs/smartctl/smartctl_device.go | 47 ++++++++++++++++++- plugins/inputs/smartctl/smartctl_json.go | 34 +++++++++++--- plugins/inputs/smartctl/smartctl_test.go | 2 + .../testcases_device/megaraid/expected.out | 2 +- .../testcases_device/nvme/expected.out | 2 +- .../testcases_device/scsi/expected.out | 2 +- .../testcases_device/usb/expected.out | 2 +- 7 files changed, 79 insertions(+), 12 deletions(-) diff --git a/plugins/inputs/smartctl/smartctl_device.go b/plugins/inputs/smartctl/smartctl_device.go index 03ef6d60eaeb1..898cd8660b9cf 100644 --- a/plugins/inputs/smartctl/smartctl_device.go +++ b/plugins/inputs/smartctl/smartctl_device.go @@ -42,10 +42,12 @@ func (s *Smartctl) scanDevice(acc telegraf.Accumulator, deviceName string, devic tags := map[string]string{ "name": device.Device.Name, "type": device.Device.Type, - "model": device.ModelName, "serial": device.SerialNumber, } + if device.ModelName != "" { + tags["model"] = device.ModelName + } if device.Vendor != "" { tags["vendor"] = device.Vendor } @@ -62,6 +64,49 @@ func (s *Smartctl) scanDevice(acc telegraf.Accumulator, deviceName string, devic "firmware": device.FirmwareVersion, } + if device.SCSIVendor != "" { + fields["scsi_vendor"] = device.SCSIVendor + } + if device.SCSIModelName != "" { + fields["scsi_model"] = device.SCSIModelName + } + if device.SCSIRevision != "" { + fields["scsi_revision"] = device.SCSIRevision + } + if device.SCSIVersion != "" { + fields["scsi_version"] = device.SCSIVersion + } + if device.SCSITransportProtocol.Name != "" { + fields["scsi_transport_protocol"] = device.SCSITransportProtocol.Name + } + if device.SCSIProtectionType != 0 { + fields["scsi_protection_type"] = device.SCSIProtectionType + } + if device.SCSIProtectionIntervalBytesPerLB != 0 { + fields["scsi_protection_interval_bytes_per_lb"] = device.SCSIProtectionIntervalBytesPerLB + } + if device.SCSIGrownDefectList != 0 { + fields["scsi_grown_defect_list"] = device.SCSIGrownDefectList + } + if device.LogicalBlockSize != 0 { + fields["logical_block_size"] = device.LogicalBlockSize + } + if device.RotationRate != 0 { + fields["rotation_rate"] = device.RotationRate + } + if device.SCSIStartStopCycleCounter.SpecifiedCycleCountOverDeviceLifetime != 0 { + fields["specified_cycle_count_over_device_lifetime"] = device.SCSIStartStopCycleCounter.SpecifiedCycleCountOverDeviceLifetime + } + if device.SCSIStartStopCycleCounter.AccumulatedStartStopCycles != 0 { + fields["accumulated_start_stop_cycles"] = device.SCSIStartStopCycleCounter.AccumulatedStartStopCycles + } + if device.PowerOnTime.Hours != 0 { + fields["power_on_hours"] = device.PowerOnTime.Hours + } + if device.PowerOnTime.Minutes != 0 { + fields["power_on_minutes"] = device.PowerOnTime.Minutes + } + // Add NVMe specific fields if device.Device.Type == "nvme" { fields["critical_warning"] = device.NvmeSmartHealthInformationLog.CriticalWarning diff --git a/plugins/inputs/smartctl/smartctl_json.go b/plugins/inputs/smartctl/smartctl_json.go index a5bdb5ce8467b..4a1afa66bf28d 100644 --- a/plugins/inputs/smartctl/smartctl_json.go +++ b/plugins/inputs/smartctl/smartctl_json.go @@ -21,13 +21,33 @@ type smartctlDeviceJSON struct { Type string `json:"type"` Protocol string `json:"protocol"` } `json:"device"` - Vendor string `json:"vendor"` - Product string `json:"product"` - ModelFamily string `json:"model_family"` - ModelName string `json:"model_name"` - SerialNumber string `json:"serial_number"` - FirmwareVersion string `json:"firmware_version"` - Wwn struct { + Vendor string `json:"vendor"` + Product string `json:"product"` + ModelFamily string `json:"model_family"` + ModelName string `json:"model_name"` + SerialNumber string `json:"serial_number"` + FirmwareVersion string `json:"firmware_version"` + SCSIVendor string `json:"scsi_vendor"` + SCSIModelName string `json:"scsi_model_name"` + SCSIRevision string `json:"scsi_revision"` + SCSIVersion string `json:"scsi_version"` + SCSIProtectionType int `json:"scsi_protection_type"` + SCSIProtectionIntervalBytesPerLB int `json:"scsi_protection_interval_bytes_per_lb"` + SCSIGrownDefectList int `json:"scsi_grown_defect_list"` + LogicalBlockSize int `json:"logical_block_size"` + RotationRate int `json:"rotation_rate"` + SCSITransportProtocol struct { + Name string `json:"name"` + } `json:"scsi_transport_protocol"` + SCSIStartStopCycleCounter struct { + SpecifiedCycleCountOverDeviceLifetime int `json:"specified_cycle_count_over_device_lifetime"` + AccumulatedStartStopCycles int `json:"accumulated_start_stop_cycles"` + } `json:"scsi_start_stop_cycle_counter"` + PowerOnTime struct { + Hours int `json:"hours"` + Minutes int `json:"minutes"` + } `json:"power_on_time"` + Wwn struct { Naa int `json:"naa"` Oui int `json:"oui"` ID int64 `json:"id"` diff --git a/plugins/inputs/smartctl/smartctl_test.go b/plugins/inputs/smartctl/smartctl_test.go index 7e3dde07a7ec7..a5042e02cbdc6 100644 --- a/plugins/inputs/smartctl/smartctl_test.go +++ b/plugins/inputs/smartctl/smartctl_test.go @@ -183,6 +183,8 @@ func TestDeviceHelperProcess(t *testing.T) { filename = "testcases_device/megaraid/response.json" } else if slices.Contains(args, "/dev/sdb") { filename = "testcases_device/scsi/response.json" + } else if slices.Contains(args, "/dev/sdaa") { + filename = "testcases_device/scsi_extended/response.json" } else { fmt.Fprint(os.Stdout, "unknown filename") os.Exit(42) //nolint:revive // os.Exit called intentionally diff --git a/plugins/inputs/smartctl/testcases_device/megaraid/expected.out b/plugins/inputs/smartctl/testcases_device/megaraid/expected.out index 4d242d4747ef1..a6f62969a4613 100644 --- a/plugins/inputs/smartctl/testcases_device/megaraid/expected.out +++ b/plugins/inputs/smartctl/testcases_device/megaraid/expected.out @@ -1,4 +1,4 @@ -smartctl,model=ST6000NM0115-1YZ110,name=/dev/bus/6,serial=ZAD2C11G,type=sat+megaraid\,14,wwn=5000c500a496983d capacity=6001175126016i,firmware="SN04",health_ok=true,temperature=25i 1711726425026052398 +smartctl,model=ST6000NM0115-1YZ110,name=/dev/bus/6,serial=ZAD2C11G,type=sat+megaraid\,14,wwn=5000c500a496983d capacity=6001175126016i,firmware="SN04",health_ok=true,logical_block_size=512i,power_on_hours=44316i,rotation_rate=7200i,temperature=25i 1711726425026052398 smartctl_attributes,model=ST6000NM0115-1YZ110,name=Raw_Read_Error_Rate,serial=ZAD2C11G,type=sat+megaraid\,14,wwn=5000c500a496983d raw_value=181426040i,threshold=44i,value=83i,worst=64i 1711726425026052398 smartctl_attributes,model=ST6000NM0115-1YZ110,name=Spin_Up_Time,serial=ZAD2C11G,type=sat+megaraid\,14,wwn=5000c500a496983d raw_value=0i,threshold=0i,value=91i,worst=91i 1711726425026052398 smartctl_attributes,model=ST6000NM0115-1YZ110,name=Start_Stop_Count,serial=ZAD2C11G,type=sat+megaraid\,14,wwn=5000c500a496983d raw_value=62i,threshold=20i,value=100i,worst=100i 1711726425026052398 diff --git a/plugins/inputs/smartctl/testcases_device/nvme/expected.out b/plugins/inputs/smartctl/testcases_device/nvme/expected.out index f8316ab3708af..7a08b70b5e40c 100644 --- a/plugins/inputs/smartctl/testcases_device/nvme/expected.out +++ b/plugins/inputs/smartctl/testcases_device/nvme/expected.out @@ -1 +1 @@ -smartctl,model=Sabrent\ Rocket\ 4.0\ 1TB,name=/dev/nvme0,serial=6D1107091C9583054511,type=nvme available_spare=100i,available_spare_threshold=5i,capacity=1000204886016i,controller_busy_time=1635i,critical_comp_time=0i,critical_warning=0i,data_units_read=28337502i,data_units_written=76471882i,firmware="RKT401.3",health_ok=true,host_reads=294243226i,host_writes=733021025i,media_errors=0i,num_err_log_entries=4871i,percentage_used=4i,power_cycles=1815i,power_on_hours=8733i,temperature=48i,unsafe_shutdowns=39i,warning_temp_time=0i 1711480345635747372 +smartctl,model=Sabrent\ Rocket\ 4.0\ 1TB,name=/dev/nvme0,serial=6D1107091C9583054511,type=nvme available_spare=100i,available_spare_threshold=5i,capacity=1000204886016i,controller_busy_time=1635i,critical_comp_time=0i,critical_warning=0i,data_units_read=28337502i,data_units_written=76471882i,firmware="RKT401.3",health_ok=true,host_reads=294243226i,host_writes=733021025i,media_errors=0i,num_err_log_entries=4871i,percentage_used=4i,power_cycles=1815i,power_on_hours=8733i,temperature=48i,unsafe_shutdowns=39i,warning_temp_time=0i,logical_block_size=512i 1711480345635747372 diff --git a/plugins/inputs/smartctl/testcases_device/scsi/expected.out b/plugins/inputs/smartctl/testcases_device/scsi/expected.out index 1994b51ccc6a9..238e3d62a41cf 100644 --- a/plugins/inputs/smartctl/testcases_device/scsi/expected.out +++ b/plugins/inputs/smartctl/testcases_device/scsi/expected.out @@ -1,4 +1,4 @@ -smartctl,model=XXXX\ XX0000NM123,name=/dev/sdb,serial=XXXXXXX,type=scsi,vendor=XXXXXXX capacity=13715978077777i,firmware="",health_ok=true,temperature=24i 1712071085987864368 +smartctl,model=XXXX\ XX0000NM123,name=/dev/sdb,serial=XXXXXXX,type=scsi,vendor=XXXXXXX capacity=13715978077777i,firmware="",health_ok=true,logical_block_size=512i,power_on_hours=32978i,power_on_minutes=46i,rotation_rate=7200i,scsi_version="SPC-5",temperature=24i 1712071085987864368 smartctl_scsi_error_counter_log,model=XXXX\ XX0000NM123,name=/dev/sdb,serial=XXXXXXX,type=scsi,page=read,vendor=XXXXXXX correction_algorithm_invocations=0i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=1i,errors_corrected_by_rereads_rewrites=5i,gigabytes_processed="315926.142",total_errors_corrected=3i,total_uncorrected_errors=0i 1712071085987864368 smartctl_scsi_error_counter_log,model=XXXX\ XX0000NM123,name=/dev/sdb,serial=XXXXXXX,type=scsi,page=write,vendor=XXXXXXX correction_algorithm_invocations=20i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=0i,errors_corrected_by_rereads_rewrites=20i,gigabytes_processed="132513.233",total_errors_corrected=20i,total_uncorrected_errors=0i 1712071085987864368 smartctl_scsi_error_counter_log,model=XXXX\ XX0000NM123,name=/dev/sdb,serial=XXXXXXX,type=scsi,page=verify,vendor=XXXXXXX correction_algorithm_invocations=0i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=12i,errors_corrected_by_rereads_rewrites=0i,gigabytes_processed="1437.032",total_errors_corrected=3i,total_uncorrected_errors=0i 1712071085987864368 diff --git a/plugins/inputs/smartctl/testcases_device/usb/expected.out b/plugins/inputs/smartctl/testcases_device/usb/expected.out index 3eadb53dde1d2..a2cb238d85c56 100644 --- a/plugins/inputs/smartctl/testcases_device/usb/expected.out +++ b/plugins/inputs/smartctl/testcases_device/usb/expected.out @@ -1,4 +1,4 @@ -smartctl,model=SanDisk\ pSSD,name=/dev/sda,serial=06c9f4c44,type=sat,wwn=5001b4409f6c444c capacity=15693664256i,firmware="3",health_ok=true,temperature=0i 1711480345675066854 +smartctl,model=SanDisk\ pSSD,name=/dev/sda,serial=06c9f4c44,type=sat,wwn=5001b4409f6c444c capacity=15693664256i,firmware="3",health_ok=true,logical_block_size=512i,power_on_hours=11i,temperature=0i 1711480345675066854 smartctl_attributes,model=SanDisk\ pSSD,name=Reallocated_Sector_Ct,serial=06c9f4c44,type=sat,wwn=5001b4409f6c444c raw_value=0i,threshold=0i,value=100i,worst=100i 1711480345675066854 smartctl_attributes,model=SanDisk\ pSSD,name=Power_On_Hours,serial=06c9f4c44,type=sat,wwn=5001b4409f6c444c raw_value=11i,threshold=0i,value=100i,worst=100i 1711480345675066854 smartctl_attributes,model=SanDisk\ pSSD,name=Power_Cycle_Count,serial=06c9f4c44,type=sat,wwn=5001b4409f6c444c raw_value=223i,threshold=0i,value=100i,worst=100i 1711480345675066854 From d02565586d282508b881a240ba2ac53779c8acb1 Mon Sep 17 00:00:00 2001 From: Josh Powers Date: Fri, 10 May 2024 07:59:39 -0600 Subject: [PATCH 2/2] Add test case --- .../testcases_device/scsi_extended/device | 1 + .../testcases_device/scsi_extended/deviceType | 1 + .../scsi_extended/expected.out | 4 + .../scsi_extended/response.json | 196 ++++++++++++++++++ 4 files changed, 202 insertions(+) create mode 100644 plugins/inputs/smartctl/testcases_device/scsi_extended/device create mode 100644 plugins/inputs/smartctl/testcases_device/scsi_extended/deviceType create mode 100644 plugins/inputs/smartctl/testcases_device/scsi_extended/expected.out create mode 100644 plugins/inputs/smartctl/testcases_device/scsi_extended/response.json diff --git a/plugins/inputs/smartctl/testcases_device/scsi_extended/device b/plugins/inputs/smartctl/testcases_device/scsi_extended/device new file mode 100644 index 0000000000000..67a70a7c3bc81 --- /dev/null +++ b/plugins/inputs/smartctl/testcases_device/scsi_extended/device @@ -0,0 +1 @@ +/dev/sdaa diff --git a/plugins/inputs/smartctl/testcases_device/scsi_extended/deviceType b/plugins/inputs/smartctl/testcases_device/scsi_extended/deviceType new file mode 100644 index 0000000000000..7e90c4b42440a --- /dev/null +++ b/plugins/inputs/smartctl/testcases_device/scsi_extended/deviceType @@ -0,0 +1 @@ +scsi diff --git a/plugins/inputs/smartctl/testcases_device/scsi_extended/expected.out b/plugins/inputs/smartctl/testcases_device/scsi_extended/expected.out new file mode 100644 index 0000000000000..6c41d9dd1d71f --- /dev/null +++ b/plugins/inputs/smartctl/testcases_device/scsi_extended/expected.out @@ -0,0 +1,4 @@ +smartctl,name=/dev/sdaa,serial=XYZZZZ,type=scsi accumulated_start_stop_cycles=220i,capacity=13715978079776i,firmware="",health_ok=true,logical_block_size=512i,power_on_hours=34222i,power_on_minutes=9i,rotation_rate=7200i,scsi_model="SEAGATE ST0000000",scsi_protection_interval_bytes_per_lb=8i,scsi_protection_type=2i,scsi_revision="RSL5",scsi_transport_protocol="SAS (SPL-4)",scsi_vendor="XYZZZZZZ",scsi_version="SPC-5",specified_cycle_count_over_device_lifetime=50000i,temperature=24i 1715282104914128775 +smartctl_scsi_error_counter_log,name=/dev/sdaa,page=read,serial=XYZZZZ,type=scsi correction_algorithm_invocations=0i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=0i,errors_corrected_by_rereads_rewrites=0i,gigabytes_processed="316009.846",total_errors_corrected=0i,total_uncorrected_errors=0i 1715282104914128775 +smartctl_scsi_error_counter_log,name=/dev/sdaa,page=write,serial=XYZZZZ,type=scsi correction_algorithm_invocations=20i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=0i,errors_corrected_by_rereads_rewrites=20i,gigabytes_processed="132824.923",total_errors_corrected=20i,total_uncorrected_errors=0i 1715282104914128775 +smartctl_scsi_error_counter_log,name=/dev/sdaa,page=verify,serial=XYZZZZ,type=scsi correction_algorithm_invocations=0i,errors_corrected_by_eccdelayed=0i,errors_corrected_by_eccfast=0i,errors_corrected_by_rereads_rewrites=0i,gigabytes_processed="1467.278",total_errors_corrected=0i,total_uncorrected_errors=0i 1715282104914128775 diff --git a/plugins/inputs/smartctl/testcases_device/scsi_extended/response.json b/plugins/inputs/smartctl/testcases_device/scsi_extended/response.json new file mode 100644 index 0000000000000..b21e036a24379 --- /dev/null +++ b/plugins/inputs/smartctl/testcases_device/scsi_extended/response.json @@ -0,0 +1,196 @@ +{ + "json_format_version": [ + 1, + 0 + ], + "smartctl": { + "version": [ + 7, + 4 + ], + "pre_release": false, + "svn_revision": "6328", + "platform_info": "x86_64-linux-4.14.0-1-amd64", + "build_info": "(local build)", + "argv": [ + "smartctl", + "--json", + "--all", + "/dev/sdaa", + "--device", + "scsi" + ], + "exit_status": 0 + }, + "local_time": { + "time_t": 1712853808, + "asctime": "Thu Apr 11 16:43:28 2024 UTC" + }, + "device": { + "name": "/dev/sdaa", + "info_name": "/dev/sdaa", + "type": "scsi", + "protocol": "SCSI" + }, + "scsi_vendor": "XYZZZZZZ", + "scsi_product": "ST100000000", + "scsi_model_name": "SEAGATE ST0000000", + "scsi_revision": "RSL5", + "scsi_version": "SPC-5", + "user_capacity": { + "blocks": 26789019748, + "bytes": 13715978079776 + }, + "logical_block_size": 512, + "physical_block_size": 4096, + "scsi_protection_type": 2, + "scsi_protection_interval_bytes_per_lb": 8, + "scsi_lb_provisioning": { + "name": "fully provisioned", + "value": 0, + "management_enabled": { + "name": "LBPME", + "value": 0 + }, + "read_zeros": { + "name": "LBPRZ", + "value": 0 + } + }, + "rotation_rate": 7200, + "form_factor": { + "scsi_value": 2, + "name": "3.5 inches" + }, + "logical_unit_id": "0x5000cb0847", + "serial_number": "XYZZZZ", + "device_type": { + "scsi_terminology": "Peripheral Device Type [PDT]", + "scsi_value": 0, + "name": "disk" + }, + "scsi_transport_protocol": { + "name": "SAS (SPL-4)", + "value": 6 + }, + "smart_support": { + "available": true, + "enabled": true + }, + "temperature_warning": { + "enabled": true + }, + "smart_status": { + "passed": true + }, + "temperature": { + "current": 24, + "drive_trip": 60 + }, + "power_on_time": { + "hours": 34222, + "minutes": 9 + }, + "scsi_start_stop_cycle_counter": { + "year_of_manufacture": "2019", + "week_of_manufacture": "35", + "specified_cycle_count_over_device_lifetime": 50000, + "accumulated_start_stop_cycles": 220, + "specified_load_unload_count_over_device_lifetime": 600000, + "accumulated_load_unload_cycles": 1606 + }, + "scsi_grown_defect_list": 0, + "seagate_farm_log": { + "supported": true + }, + "scsi_error_counter_log": { + "read": { + "errors_corrected_by_eccfast": 0, + "errors_corrected_by_eccdelayed": 0, + "errors_corrected_by_rereads_rewrites": 0, + "total_errors_corrected": 0, + "correction_algorithm_invocations": 0, + "gigabytes_processed": "316009.846", + "total_uncorrected_errors": 0 + }, + "write": { + "errors_corrected_by_eccfast": 0, + "errors_corrected_by_eccdelayed": 0, + "errors_corrected_by_rereads_rewrites": 20, + "total_errors_corrected": 20, + "correction_algorithm_invocations": 20, + "gigabytes_processed": "132824.923", + "total_uncorrected_errors": 0 + }, + "verify": { + "errors_corrected_by_eccfast": 0, + "errors_corrected_by_eccdelayed": 0, + "errors_corrected_by_rereads_rewrites": 0, + "total_errors_corrected": 0, + "correction_algorithm_invocations": 0, + "gigabytes_processed": "1467.278", + "total_uncorrected_errors": 0 + } + }, + "scsi_self_test_0": { + "code": { + "value": 2, + "string": "Background long" + }, + "result": { + "value": 0, + "string": "Completed" + }, + "power_on_time": { + "hours": 90, + "aka": "accumulated_power_on_hours" + } + }, + "scsi_self_test_1": { + "code": { + "value": 2, + "string": "Background long" + }, + "result": { + "value": 0, + "string": "Completed" + }, + "power_on_time": { + "hours": 66, + "aka": "accumulated_power_on_hours" + } + }, + "scsi_self_test_2": { + "code": { + "value": 7, + "string": "Reserved(7)" + }, + "result": { + "value": 0, + "string": "Completed" + }, + "failed_segment": { + "value": 80, + "aka": "self_test_number" + }, + "power_on_time": { + "hours": 5, + "aka": "accumulated_power_on_hours" + } + }, + "scsi_self_test_3": { + "code": { + "value": 1, + "string": "Background short" + }, + "result": { + "value": 0, + "string": "Completed" + }, + "power_on_time": { + "hours": 2, + "aka": "accumulated_power_on_hours" + } + }, + "scsi_extended_self_test_seconds": 80400 + }