From 0b710bb0c95c32402477c7df0ad74c2e4f13c4d9 Mon Sep 17 00:00:00 2001 From: Solvik Date: Fri, 2 Aug 2019 12:38:46 +0200 Subject: [PATCH] Handle JBOD setup for storcli exporter (#1419) * handle jbod setup Signed-off-by: Solvik Blum --- text_collector_examples/storcli.py | 45 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/text_collector_examples/storcli.py b/text_collector_examples/storcli.py index ed279e66..7dc6f952 100755 --- a/text_collector_examples/storcli.py +++ b/text_collector_examples/storcli.py @@ -48,7 +48,7 @@ def main(args): for controller in data: response = controller['Response Data'] - + handle_common_controller(response) if response['Version']['Driver Name'] == 'megaraid_sas': handle_megaraid_controller(response) @@ -82,7 +82,7 @@ def handle_sas_controller(response): for key, basic_disk_info in response['Physical Device Information'].items(): if 'Detailed Information' in key: continue - create_metrcis_of_physical_drive(basic_disk_info[0], + create_metrics_of_physical_drive(basic_disk_info[0], response['Physical Device Information'], controller_index) @@ -95,9 +95,6 @@ def handle_megaraid_controller(response): add_metric('degraded', baselabel, int(response['Status']['Controller Status'] == 'Degraded')) add_metric('failed', baselabel, int(response['Status']['Controller Status'] == 'Failed')) add_metric('healthy', baselabel, int(response['Status']['Controller Status'] == 'Optimal')) - add_metric('drive_groups', baselabel, response['Drive Groups']) - add_metric('virtual_drives', baselabel, response['Virtual Drives']) - add_metric('physical_drives', baselabel, response['Physical Drives']) add_metric('ports', baselabel, response['HwCfg']['Backend Port Count']) add_metric('scheduled_patrol_read', baselabel, int('hrs' in response['Scheduled Tasks']['Patrol Read Reoccurrence'])) @@ -113,26 +110,32 @@ def handle_megaraid_controller(response): time_difference_seconds = abs(system_time - controller_time).seconds add_metric('time_difference', baselabel, time_difference_seconds) - for virtual_drive in response['VD LIST']: - vd_position = virtual_drive.get('DG/VD') - drive_group, volume_group = -1, -1 - if vd_position: - drive_group = vd_position.split('/')[0] - volume_group = vd_position.split('/')[1] - vd_baselabel = 'controller="{0}",DG="{1}",VG="{2}"'.format(controller_index, drive_group, - volume_group) - vd_info_label = vd_baselabel + ',name="{0}",cache="{1}",type="{2}",state="{3}"'.format( - str(virtual_drive.get('Name')).strip(), - str(virtual_drive.get('Cache')).strip(), - str(virtual_drive.get('TYPE')).strip(), - str(virtual_drive.get('State')).strip()) - add_metric('vd_info', vd_info_label, 1) + # Make sure it doesn't crash if it's a JBOD setup + if 'Drive Groups' in response.keys(): + add_metric('drive_groups', baselabel, response['Drive Groups']) + add_metric('virtual_drives', baselabel, response['Virtual Drives']) + for virtual_drive in response['VD LIST']: + vd_position = virtual_drive.get('DG/VD') + drive_group, volume_group = -1, -1 + if vd_position: + drive_group = vd_position.split('/')[0] + volume_group = vd_position.split('/')[1] + vd_baselabel = 'controller="{0}",DG="{1}",VG="{2}"'.format(controller_index, drive_group, + volume_group) + vd_info_label = vd_baselabel + ',name="{0}",cache="{1}",type="{2}",state="{3}"'.format( + str(virtual_drive.get('Name')).strip(), + str(virtual_drive.get('Cache')).strip(), + str(virtual_drive.get('TYPE')).strip(), + str(virtual_drive.get('State')).strip()) + add_metric('vd_info', vd_info_label, 1) + + add_metric('physical_drives', baselabel, response['Physical Drives']) if response['Physical Drives'] > 0: data = get_storcli_json('/cALL/eALL/sALL show all J') drive_info = data['Controllers'][controller_index]['Response Data'] for physical_drive in response['PD LIST']: - create_metrcis_of_physical_drive(physical_drive, drive_info, controller_index) + create_metrics_of_physical_drive(physical_drive, drive_info, controller_index) def get_basic_controller_info(response): @@ -149,7 +152,7 @@ def get_basic_controller_info(response): return (controller_index, baselabel) -def create_metrcis_of_physical_drive(physical_drive, detailed_info_array, controller_index): +def create_metrics_of_physical_drive(physical_drive, detailed_info_array, controller_index): enclosure = physical_drive.get('EID:Slt').split(':')[0] slot = physical_drive.get('EID:Slt').split(':')[1]