fix: correctly parse various numeric forms (#10923)
This commit is contained in:
parent
956264076d
commit
bcc7c57f18
|
|
@ -822,6 +822,7 @@ func (m *Smart) gatherDisk(acc telegraf.Accumulator, device string, wg *sync.Wai
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := parse(fields, deviceFields, matches[2]); err != nil {
|
if err := parse(fields, deviceFields, matches[2]); err != nil {
|
||||||
|
acc.AddError(fmt.Errorf("error parsing %s: '%s': %s", attr.Name, matches[2], err.Error()))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// if the field is classified as an attribute, only add it
|
// if the field is classified as an attribute, only add it
|
||||||
|
|
@ -969,8 +970,20 @@ func parseInt(str string) int64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseCommaSeparatedInt(fields, _ map[string]interface{}, str string) error {
|
func parseCommaSeparatedInt(fields, _ map[string]interface{}, str string) error {
|
||||||
str = strings.Join(strings.Fields(str), "")
|
// remove any non-utf8 values
|
||||||
i, err := strconv.ParseInt(strings.Replace(str, ",", "", -1), 10, 64)
|
// '1\xa0292' --> 1292
|
||||||
|
value := strings.ToValidUTF8(strings.Join(strings.Fields(str), ""), "")
|
||||||
|
|
||||||
|
// remove any non-alphanumeric values
|
||||||
|
// '16,626,888' --> 16626888
|
||||||
|
// '16 829 004' --> 16829004
|
||||||
|
numRegex, err := regexp.Compile(`[^0-9\-]+`)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to compile numeric regex")
|
||||||
|
}
|
||||||
|
value = numRegex.ReplaceAllString(value, "")
|
||||||
|
|
||||||
|
i, err := strconv.ParseInt(value, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -985,7 +998,8 @@ func parsePercentageInt(fields, deviceFields map[string]interface{}, str string)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseDataUnits(fields, deviceFields map[string]interface{}, str string) error {
|
func parseDataUnits(fields, deviceFields map[string]interface{}, str string) error {
|
||||||
units := strings.Fields(str)[0]
|
// Remove everything after '['
|
||||||
|
units := strings.Split(str, "[")[0]
|
||||||
return parseCommaSeparatedInt(fields, deviceFields, units)
|
return parseCommaSeparatedInt(fields, deviceFields, units)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -313,6 +313,24 @@ func TestGatherNVMe(t *testing.T) {
|
||||||
testutil.SortMetrics(), testutil.IgnoreTime())
|
testutil.SortMetrics(), testutil.IgnoreTime())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGatherNVMeWindows(t *testing.T) {
|
||||||
|
runCmd = func(timeout config.Duration, sudo bool, command string, args ...string) ([]byte, error) {
|
||||||
|
return []byte(smartctlNVMeInfoDataWindows), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
acc = &testutil.Accumulator{}
|
||||||
|
wg = &sync.WaitGroup{}
|
||||||
|
)
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
sampleSmart.gatherDisk(acc, "nvme0", wg)
|
||||||
|
|
||||||
|
metrics := acc.GetTelegrafMetrics()
|
||||||
|
testutil.RequireMetricsEqual(t, testSmartctlNVMeWindowsAttributes, metrics,
|
||||||
|
testutil.SortMetrics(), testutil.IgnoreTime())
|
||||||
|
}
|
||||||
|
|
||||||
func TestGatherIntelNVMeMetrics(t *testing.T) {
|
func TestGatherIntelNVMeMetrics(t *testing.T) {
|
||||||
runCmd = func(timeout config.Duration, sudo bool, command string, args ...string) ([]byte, error) {
|
runCmd = func(timeout config.Duration, sudo bool, command string, args ...string) ([]byte, error) {
|
||||||
return []byte(nvmeIntelInfoDataMetricsFormat), nil
|
return []byte(nvmeIntelInfoDataMetricsFormat), nil
|
||||||
|
|
@ -1123,6 +1141,253 @@ var (
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
testSmartctlNVMeWindowsAttributes = []telegraf.Metric{
|
||||||
|
testutil.MustMetric("smart_device",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"exit_status": 0,
|
||||||
|
"health_ok": true,
|
||||||
|
"temp_c": 47,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"id": "9",
|
||||||
|
"name": "Power_On_Hours",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 1290,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
"name": "Unsafe_Shutdowns",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 9,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"id": "12",
|
||||||
|
"name": "Power_Cycle_Count",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 10779,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Media_and_Data_Integrity_Errors",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 0,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Error_Information_Log_Entries",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 979,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Available_Spare",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 100,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Available_Spare_Threshold",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 10,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"id": "194",
|
||||||
|
"name": "Temperature_Celsius",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": 47,
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Critical_Warning",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(0),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Percentage_Used",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(0),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Data_Units_Read",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(16626888),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Data_Units_Written",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(16829004),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Host_Read_Commands",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(205868508),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Host_Write_Commands",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(228472943),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Controller_Busy_Time",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(686),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"name": "Critical_Temperature_Time",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(0),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
"name": "Temperature_Sensor_1",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(47),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
"name": "Temperature_Sensor_2",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(68),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
testutil.MustMetric("smart_attribute",
|
||||||
|
map[string]string{
|
||||||
|
"device": "nvme0",
|
||||||
|
"serial_no": "xxx",
|
||||||
|
"model": "Samsung SSD 970 EVO 1TB",
|
||||||
|
"name": "Warning_Temperature_Time",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"raw_value": int64(0),
|
||||||
|
},
|
||||||
|
time.Now(),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
testsAda0Device = []struct {
|
testsAda0Device = []struct {
|
||||||
fields map[string]interface{}
|
fields map[string]interface{}
|
||||||
tags map[string]string
|
tags map[string]string
|
||||||
|
|
@ -1956,6 +2221,74 @@ Temperature Sensor 7: 44 C
|
||||||
Temperature Sensor 8: 43 C
|
Temperature Sensor 8: 43 C
|
||||||
`
|
`
|
||||||
|
|
||||||
|
smartctlNVMeInfoDataWindows = `smartctl 7.3 2022-02-28 r5338 [x86_64-w64-mingw32-w10-20H2] (sf-7.3-1)
|
||||||
|
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org
|
||||||
|
|
||||||
|
=== START OF INFORMATION SECTION ===
|
||||||
|
Model Number: Samsung SSD 970 EVO 1TB
|
||||||
|
Serial Number: xxx
|
||||||
|
Firmware Version: 2B2QEXE7
|
||||||
|
PCI Vendor/Subsystem ID: 0x144d
|
||||||
|
IEEE OUI Identifier: 0x002538
|
||||||
|
Total NVM Capacity: 1 000 204 886 016 [1,00 TB]
|
||||||
|
Unallocated NVM Capacity: 0
|
||||||
|
Controller ID: 4
|
||||||
|
NVMe Version: 1.3
|
||||||
|
Number of Namespaces: 1
|
||||||
|
Namespace 1 Size/Capacity: 1 000 204 886 016 [1,00 TB]
|
||||||
|
Namespace 1 Utilization: 732 789 374 976 [732 GB]
|
||||||
|
Namespace 1 Formatted LBA Size: 512
|
||||||
|
Namespace 1 IEEE EUI-64: 002538 590141cfa4
|
||||||
|
Local Time is: Wed Mar 30 13:30:12 2022
|
||||||
|
Firmware Updates (0x16): 3 Slots, no Reset required
|
||||||
|
Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test
|
||||||
|
Optional NVM Commands (0x005f): Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat Timestmp
|
||||||
|
Log Page Attributes (0x03): S/H_per_NS Cmd_Eff_Lg
|
||||||
|
Maximum Data Transfer Size: 512 Pages
|
||||||
|
Warning Comp. Temp. Threshold: 85 Celsius
|
||||||
|
Critical Comp. Temp. Threshold: 85 Celsius
|
||||||
|
|
||||||
|
Supported Power States
|
||||||
|
St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat
|
||||||
|
0 + 6.20W - - 0 0 0 0 0 0
|
||||||
|
1 + 4.30W - - 1 1 1 1 0 0
|
||||||
|
2 + 2.10W - - 2 2 2 2 0 0
|
||||||
|
3 - 0.0400W - - 3 3 3 3 210 1200
|
||||||
|
4 - 0.0050W - - 4 4 4 4 2000 8000
|
||||||
|
|
||||||
|
Supported LBA Sizes (NSID 0x1)
|
||||||
|
Id Fmt Data Metadt Rel_Perf
|
||||||
|
0 + 512 0 0
|
||||||
|
|
||||||
|
=== START OF SMART DATA SECTION ===
|
||||||
|
SMART overall-health self-assessment test result: PASSED
|
||||||
|
|
||||||
|
SMART/Health Information (NVMe Log 0x02)
|
||||||
|
Critical Warning: 0x00
|
||||||
|
Temperature: 47 Celsius
|
||||||
|
Available Spare: 100%
|
||||||
|
Available Spare Threshold: 10%
|
||||||
|
Percentage Used: 0%
|
||||||
|
Data Units Read: 16,626,888 [8,51 TB]
|
||||||
|
Data Units Written: 16 829 004 [8,61 TB]
|
||||||
|
Host Read Commands: 205 868 508
|
||||||
|
Host Write Commands: 228 472 943
|
||||||
|
Controller Busy Time: 686
|
||||||
|
Power Cycles: 10<EFBFBD>779
|
||||||
|
Power On Hours: 1<EFBFBD>290
|
||||||
|
Unsafe Shutdowns: 9
|
||||||
|
Media and Data Integrity Errors: 0
|
||||||
|
Error Information Log Entries: 979
|
||||||
|
Warning Comp. Temperature Time: 0
|
||||||
|
Critical Comp. Temperature Time: 0
|
||||||
|
Temperature Sensor 1: 47 Celsius
|
||||||
|
Temperature Sensor 2: 68 Celsius
|
||||||
|
|
||||||
|
Error Information (NVMe Log 0x01, 16 of 64 entries)
|
||||||
|
Num ErrCount SQId CmdId Status PELoc LBA NSID VS
|
||||||
|
0 979 0 0x002a 0x4212 0x028 0 - -
|
||||||
|
`
|
||||||
|
|
||||||
smartctlNVMeInfoDataWithOverflow = `
|
smartctlNVMeInfoDataWithOverflow = `
|
||||||
Temperature Sensor 1: 9223372036854775808 C
|
Temperature Sensor 1: 9223372036854775808 C
|
||||||
Temperature Sensor 2: -9223372036854775809 C
|
Temperature Sensor 2: -9223372036854775809 C
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue