@@ -21,6 +21,31 @@ if ! command -v nvme >/dev/null 2>&1; then
2121 exit 1
2222fi
2323
24+ # Set path to the DWPD ratings file
25+ dwpd_file=" /opt/kayobe/etc/monitoring/dwpd_ratings.yml"
26+
27+ # Function to load rated DWPD values from the YML file
28+ load_dwpd_ratings () {
29+ declare -gA rated_dwpd
30+ if [[ -f " $dwpd_file " ]]; then
31+ while IFS= read -r line; do
32+ key=" $( echo " $line " | jq -r ' .model_name' ) "
33+ value=" $( echo " $line " | jq -r ' .rated_dwpd' ) "
34+ # Strip trailing spaces
35+ key=" $( echo " $key " | sed ' s/[[:space:]]*$//' ) "
36+ value=" $( echo " $value " | sed ' s/[[:space:]]*$//' ) "
37+ rated_dwpd[" $key " ]=" $value "
38+ done < <( jq -c ' .[]' " $dwpd_file " )
39+ else
40+ echo " Warning: DWPD ratings file not found at $dwpd_file . Defaulting to 1 DWPD."
41+ fi
42+ }
43+
44+ load_dwpd_ratings
45+
46+ # Debugging purpose: print the array
47+ # echo "${rated_dwpd[@]}"
48+
2449output_format_awk=" $(
2550 cat << 'OUTPUTAWK '
2651BEGIN { v = "" }
@@ -45,57 +70,68 @@ nvme_version="$(nvme version | awk '$1 == "nvme" {print $3}')"
4570echo " nvmecli{version=\" ${nvme_version} \" } 1" | format_output
4671
4772# Get devices (DevicePath and PhysicalSize)
48- device_info=" $( nvme list -o json | jq -c ' .Devices[] | {DevicePath: .DevicePath, PhysicalSize: .PhysicalSize}' ) "
73+ device_info=" $( nvme list -o json | jq -c ' .Devices[] | {DevicePath, PhysicalSize, ModelNumber}' ) "
74+
75+ # Convert device_info to an array
76+ device_info_array=()
77+ while IFS= read -r line; do
78+ device_info_array+=(" $line " )
79+ done <<< " $device_info"
4980
5081# Loop through the NVMe devices
51- echo " $device_info " | while read -r device_data ; do
52- device=$( echo " $device_data " | jq -r ' .DevicePath' )
82+ for device_data in " ${device_info_array[@]} " ; do
83+ device=" $( echo " $device_data " | jq -r ' .DevicePath' ) "
5384 json_check=" $( nvme smart-log -o json " ${device} " ) "
5485 disk=" ${device##*/ } "
86+ model_name=" $( echo " $device_data " | jq -r ' .ModelNumber' ) "
5587
56- physical_size=$( echo " $device_data " | jq -r ' .PhysicalSize' )
57- echo " physical_size_bytes{device=\" ${disk} \" } ${physical_size} "
88+ physical_size=" $( echo " $device_data " | jq -r ' .PhysicalSize' ) "
89+ echo " physical_size_bytes{device=\" ${disk} \" ,model= \" ${model_name} \" } ${physical_size} "
5890
5991 # The temperature value in JSON is in Kelvin, we want Celsius
6092 value_temperature=" $( echo " $json_check " | jq ' .temperature - 273' ) "
61- echo " temperature_celsius{device=\" ${disk} \" } ${value_temperature} "
93+ echo " temperature_celsius{device=\" ${disk} \" ,model=\" ${model_name} \" } ${value_temperature} "
94+
95+ # Get the rated DWPD from the dictionary or default to 1 if not found
96+ value_rated_dwpd=" ${rated_dwpd[$model_name]:- 1} "
97+ echo " rated_dwpd{device=\" ${disk} \" ,model=\" ${model_name} \" } ${value_rated_dwpd} "
6298
6399 value_available_spare=" $( echo " $json_check " | jq ' .avail_spare / 100' ) "
64- echo " available_spare_ratio{device=\" ${disk} \" } ${value_available_spare} "
100+ echo " available_spare_ratio{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_available_spare} "
65101
66102 value_available_spare_threshold=" $( echo " $json_check " | jq ' .spare_thresh / 100' ) "
67- echo " available_spare_threshold_ratio{device=\" ${disk} \" } ${value_available_spare_threshold} "
103+ echo " available_spare_threshold_ratio{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_available_spare_threshold} "
68104
69105 value_percentage_used=" $( echo " $json_check " | jq ' .percent_used / 100' ) "
70- echo " percentage_used_ratio{device=\" ${disk} \" } ${value_percentage_used} "
106+ echo " percentage_used_ratio{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_percentage_used} "
71107
72108 value_critical_warning=" $( echo " $json_check " | jq ' .critical_warning' ) "
73- echo " critical_warning_total{device=\" ${disk} \" } ${value_critical_warning} "
109+ echo " critical_warning_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_critical_warning} "
74110
75111 value_media_errors=" $( echo " $json_check " | jq ' .media_errors' ) "
76- echo " media_errors_total{device=\" ${disk} \" } ${value_media_errors} "
112+ echo " media_errors_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_media_errors} "
77113
78114 value_num_err_log_entries=" $( echo " $json_check " | jq ' .num_err_log_entries' ) "
79- echo " num_err_log_entries_total{device=\" ${disk} \" } ${value_num_err_log_entries} "
115+ echo " num_err_log_entries_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_num_err_log_entries} "
80116
81117 value_power_cycles=" $( echo " $json_check " | jq ' .power_cycles' ) "
82- echo " power_cycles_total{device=\" ${disk} \" } ${value_power_cycles} "
118+ echo " power_cycles_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_power_cycles} "
83119
84120 value_power_on_hours=" $( echo " $json_check " | jq ' .power_on_hours' ) "
85- echo " power_on_hours_total{device=\" ${disk} \" } ${value_power_on_hours} "
121+ echo " power_on_hours_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_power_on_hours} "
86122
87123 value_controller_busy_time=" $( echo " $json_check " | jq ' .controller_busy_time' ) "
88- echo " controller_busy_time_seconds{device=\" ${disk} \" } ${value_controller_busy_time} "
124+ echo " controller_busy_time_seconds{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_controller_busy_time} "
89125
90126 value_data_units_written=" $( echo " $json_check " | jq ' .data_units_written' ) "
91- echo " data_units_written_total{device=\" ${disk} \" } ${value_data_units_written} "
127+ echo " data_units_written_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_data_units_written} "
92128
93129 value_data_units_read=" $( echo " $json_check " | jq ' .data_units_read' ) "
94- echo " data_units_read_total{device=\" ${disk} \" } ${value_data_units_read} "
130+ echo " data_units_read_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_data_units_read} "
95131
96132 value_host_read_commands=" $( echo " $json_check " | jq ' .host_read_commands' ) "
97- echo " host_read_commands_total{device=\" ${disk} \" } ${value_host_read_commands} "
133+ echo " host_read_commands_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_host_read_commands} "
98134
99135 value_host_write_commands=" $( echo " $json_check " | jq ' .host_write_commands' ) "
100- echo " host_write_commands_total{device=\" ${disk} \" } ${value_host_write_commands} "
136+ echo " host_write_commands_total{device=\" ${disk} \" ,model= \" ${model_name} \" } ${value_host_write_commands} "
101137done | format_output
0 commit comments