5.02021-11-21T21:46:38ZLSILSI JSON discoveryLSI JSON discovery## Overview
Description
-----------
This template is for discovering and monitoring LSI (Avago, Broadcom) storage controllers by using json outputs of storcli tool. Now it works only with zabbix 4.2
Main features
-------------
* Discovery of controllers, logical discs, physical discs, batteries (bbu an cv) without scripts on servers side (it uses parsing of json and java scripts on zabbix side)
* Monitoring controllers, logical, physical discs, batteries
* Useful with OS, where storcli works
* Comfortable changing of time intervals by macroses.
Notes
-----
* Please follow link for the newest version and instruction
<
LSILSI batteryLSI controllersLSI Internal itemsLSI Logical disksLSI Physical disks- All bbus infolsi.bbusinfo{$ADAP_REQUEST_PERIOD}{$INTERNAL_ITEMS_HISTORY_PEIOD}0TEXTLSI Internal items
- All Ctls infolsi.ctlsinfo{$ADAP_REQUEST_PERIOD}{$INTERNAL_ITEMS_HISTORY_PEIOD}0TEXTLSI Internal items
- All cvs infolsi.cvsinfo{$ADAP_REQUEST_PERIOD}{$INTERNAL_ITEMS_HISTORY_PEIOD}0TEXTLSI Internal items
- All Lds infolsi.ldsinfo{$LD_REQUEST_PERIOD}{$INTERNAL_ITEMS_HISTORY_PEIOD}0TEXTLSI Internal items
- All Pds infolsi.pdsinfo{$PD_REQUEST_PERIOD}{$INTERNAL_ITEMS_HISTORY_PEIOD}0TEXTLSI Internal items
Controllers discoverylsi.ctllld{$ADAP_DISCOVERY_PERIOD}Controller "{#CTLID}" cache bbu dataDEPENDENTlsi.ctl.bbu.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI Internal itemsJSONPATH$['Controllers'][{#CTLID}]CHECK_REGEX_ERROR("Status"\s:\s"Failure")
\1JSONPATH$['Response Data']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.bbusinfoController "{#CTLID}" bbu low charge levelDEPENDENTlsi.ctl.bbulowcharge.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['BBU_Firmware_Status'][10]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.bbu.["{#CTLID}"]{str(No)}=0 and {strlen()}>0LSI controller {#CTLID} battery charge level is lowAVERAGEYESController "{#CTLID}" bbu need to replaceDEPENDENTlsi.ctl.bbureplace.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['BBU_Firmware_Status'][9]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.bbu.["{#CTLID}"]({str(No)}=0 and {strlen()}>0)LSI controller {#CTLID} bbu battery is need to be replacedAVERAGEYESController "{#CTLID}" bbu serial numberDEPENDENTlsi.ctl.bbusn.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['BBU_Design_Info'][4]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.bbu.["{#CTLID}"]({diff()}=1 and {strlen()}>0)NONELSI controller {#CTLID} bbu battery was replacedINFOYESController "{#CTLID}" bbu stateDEPENDENTlsi.ctl.bbustate.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['BBU_Info'][4]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.bbu.["{#CTLID}"]({str(Optimal)}=0 and {strlen()}>0)LSI controller {#CTLID} bbu battery state is {ITEM.LASTVALUE}AVERAGEYESController "{#CTLID}" bbu typeDEPENDENTlsi.ctl.bbutype.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['BBU_Info'][0]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.bbu.["{#CTLID}"]Controller "{#CTLID}" cache vault dataDEPENDENTlsi.ctl.cvdata.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI Internal itemsJSONPATH$['Controllers'][{#CTLID}]CHECK_REGEX_ERROR("Status"\s:\s"Failure")
\1JSONPATH$['Response Data']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.cvsinfoController "{#CTLID}" cache vault need to replaceDEPENDENTlsi.ctl.cvreplace.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['Firmware_Status'][0]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.cvdata.["{#CTLID}"]({str(No)}=0 and {strlen()}>0)LSI controller {#CTLID} cachevault battery is need to be replacedAVERAGEYESController "{#CTLID}" cache vault serial numberDEPENDENTlsi.ctl.cvsn.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['Design_Info'][1]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.cvdata.["{#CTLID}"]({diff()}=1 and {strlen()}>0)NONELSI controller {#CTLID} cachevault battery was replacedINFOYESController "{#CTLID}" cache vault stateDEPENDENTlsi.ctl.cvstate.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['Cachevault_Info'][2]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.cvdata.["{#CTLID}"]({str(Optimal)}=0 and {strlen()}>0)LSI controller {#CTLID} cachevault battery state is {ITEM.LASTVALUE}AVERAGEYESController "{#CTLID}" cache vault typeDEPENDENTlsi.ctl.cvtype.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI batteryJSONPATH$['Cachevault_Info'][0]['Value']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctl.cvdata.["{#CTLID}"]Controller "{#CTLID}" modelDEPENDENTlsi.ctl.model.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI controllersJSONPATH$['Controllers'][{#CTLID}]['Response Data']['Basics']['Model']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctlsinfoController "{#CTLID}" serial numberDEPENDENTlsi.ctl.sn.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI controllersJSONPATH$['Controllers'][{#CTLID}]['Response Data']['Basics']['Serial Number']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctlsinfo{diff()}=1 and {strlen()}>0NONELSI controller {#CTLID} was replacedINFOYESController "{#CTLID}" state (health)DEPENDENTlsi.ctl.state.["{#CTLID}"]0{$ADAP_HISTORY_PERIOD}0TEXTLSI controllersJSONPATH$['Controllers'][{#CTLID}]['Response Data']['Status']['Controller Status']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}lsi.ctlsinfo{str(Opt)}=0RECOVERY_EXPRESSION{str(Opt)}=1LSI controller {#CTLID} status is {ITEM.LASTVALUE}HIGHRAID_CTL_STATE{ITEM.LASTVALUE}{#CTLID}$.CtlCHECK_JSON_ERROR$['Controllers'][0]['Command Status']['Detailed Status'][0]['ErrMsg']JSONPATH$['Controllers'][0]['Response Data']['System Overview']DISCARD_UNCHANGED_HEARTBEAT{$ADAP_THROTTLING_HB_PERIOD}Logical disks discoverylsi.ldlld{$LD_DISCOVERY_PERIOD}Logical disk "{#LDNAME}" (id {#LDID}) levelDEPENDENTlsi.ld.level.["{#LDID}"]0{$LD_HISTORY_PERIOD}0TEXTLSI Logical disksJSONPATH$['Controllers'][0]['Response Data']['{#LDID}'][0]['TYPE']DISCARD_UNCHANGED_HEARTBEAT{$LD_THROTTLING_HB_PERIOD}lsi.ldsinfoLogical disk "{#LDNAME}" (id {#LDID}) stateDEPENDENTlsi.ld.state.["{#LDID}"]0{$LD_HISTORY_PERIOD}0TEXTLSI Logical disksJSONPATH$['Controllers'][0]['Response Data']['{#LDID}'][0]['State']DISCARD_UNCHANGED_HEARTBEAT{$LD_THROTTLING_HB_PERIOD}JAVASCRIPTswitch(value)
{
case 'Optl':
value='Optimal';
break;
case 'OfLn':
value='Offline';
break;
case 'Pdgd':
value='Partially degraded';
break;
case 'Dgrd':
value='Degraded';
break;
}
return valuelsi.ldsinfo{str(Optimal)}=0RECOVERY_EXPRESSION{str(Optimal)}=1LSI logical disk "{#LDNAME}" ("{#LDID}") state is "{ITEM.LASTVALUE}"HIGHLD STATE{ITEM.LASTVALUE}{#LDID}$.LDID{#LDNAME}$.NameJAVASCRIPTvar JsonValue = JSON.parse(value);
var ResponseStatus=JsonValue.Controllers[0]['Command Status']['Status'];
var TxtValue='';
if (ResponseStatus.match(/Success/g)) {
var ResponseData = JsonValue.Controllers[0]['Response Data'];
var NeedData = [];
var i=0;
for (var key in ResponseData) {
if (key.match(/\/c\d{1,}\/v\d{1,}/g)) {
JsonValue.Controllers[0]['Response Data'][key][0]['LDID'] = key;
NeedData[i] = JsonValue.Controllers[0]['Response Data'][key][0];
i = i + 1;
}
}
TxtValue = JSON.stringify(NeedData);
}
else {
TxtValue = JsonValue.Controllers[0]['Command Status']['Description'];
}
return TxtValueDISCARD_UNCHANGED_HEARTBEAT{$LD_THROTTLING_HB_PERIOD}Physical disks discoverylsi.pdlld{$PD_DISCOVERY_PERIOD}Physical disk "{#PDID}" media error countDEPENDENTlsi.pd.merrcount.["{#PDID}"]0{$PD_HISTORY_PERIOD}{$PD_TRENDS_PERIOD}LSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID} - Detailed Information']['Drive {#PDID} State']['Media Error Count']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfo{last()}>0RECOVERY_EXPRESSION{last()}=0LSI physical disk "{#PDID}" media error count is "{ITEM.LASTVALUE}"AVERAGEYESPhysical disk "{#PDID}" modelDEPENDENTlsi.pd.model.["{#PDID}"]0{$PD_HISTORY_PERIOD}0TEXTLSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID}'][0]['Model']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfoPhysical disk "{#PDID}" other error countDEPENDENTlsi.pd.otherrcount.["{#PDID}"]0{$PD_HISTORY_PERIOD}{$PD_TRENDS_PERIOD}LSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID} - Detailed Information']['Drive {#PDID} State']['Other Error Count']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfoPhysical disk "{#PDID}" predictive failure countDEPENDENTlsi.pd.predicterrcount.["{#PDID}"]0{$PD_HISTORY_PERIOD}{$PD_TRENDS_PERIOD}LSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID} - Detailed Information']['Drive {#PDID} State']['Predictive Failure Count']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfo{last()}>0RECOVERY_EXPRESSION{last()}=0LSI physical disk "{#PDID}" predictive failure count is "{ITEM.LASTVALUE}"WARNINGYES{last()}>0 and {diff()}=1RECOVERY_EXPRESSION{last()}=0LSI physical disk "{#PDID}" predictive failure count is "{ITEM.LASTVALUE}". Growing upWARNINGYESLSI physical disk "{#PDID}" predictive failure count is "{ITEM.LASTVALUE}"{LSI JSON discovery:lsi.pd.predicterrcount.["{#PDID}"].last()}>0{LSI JSON discovery:lsi.pd.predicterrcount.["{#PDID}"].last()}=0Physical disk "{#PDID}" SMART flagDEPENDENTlsi.pd.smartflag.["{#PDID}"]0{$PD_HISTORY_PERIOD}0CHARLSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID} - Detailed Information']['Drive {#PDID} State']['S.M.A.R.T alert flagged by drive']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfo{str(Yes)}=1RECOVERY_EXPRESSION{str(No)}=1LSI physical disk: SMART flag was raised up on "{#PDID}"AVERAGEYESPD SMART{ITEM.LASTVALUE}Physical disk "{#PDID}" serial numberDEPENDENTlsi.pd.sn.["{#PDID}"]0{$PD_HISTORY_PERIOD}0TEXTLSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID} - Detailed Information']['Drive {#PDID} Device attributes']['SN']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}lsi.pdsinfo{diff()}=1 and {strlen(#2)}>0NONELSI physical disk "{#PDID}" was replaced by sn "{ITEM.LASTVALUE1}". Previous sn: "{ITEM.LASTVALUE2}"INFOYESPD REPLACE{ITEM.LASTVALUE1}Physical disk "{#PDID}" stateDEPENDENTlsi.pd.state.["{#PDID}"]0{$PD_HISTORY_PERIOD}0TEXTLSI Physical disksJSONPATH$['Controllers'][0]['Response Data']['Drive {#PDID}'][0]['State']DISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}JAVASCRIPTswitch(value)
{
case 'Onln':
value='Online';
break;
case 'Ugood':
value='Unconfigured-Good';
break;
case 'Ubad':
value='Unconfigured-Bad';
break;
case 'Msng':
value='Missing';
break;
case 'Offln':
value='Offline';
break;
case 'F':
value='Foreign';
break;
case 'GHS':
value='Global Hot Spare';
break;
case 'DHS':
value='Dedicated Hot Spare';
break;
case 'Rbld':
value='Rebuild';
break;
}
return valuelsi.pdsinfo({str(Unconfigured-Bad)}=1 or {str(Unconfigured-Good)}=1 or {str(Missing)}=1 or {str(Offline)}=1 or {str(Foreign)}=1) and {diff()}=1 and {strlen()}>0RECOVERY_EXPRESSION{str(Unconfigured-Good)}=1 or {str(Online)}=1LSI physical disk "{#PDID}" is "{ITEM.LASTVALUE}"HIGHYESPD STATE{ITEM.LASTVALUE}{#PDID}$.PDIDJAVASCRIPTvar JsonValue = JSON.parse(value);
var ResponseStatus=JsonValue.Controllers[0]['Command Status']['Status'];
var TxtValue='';
if (ResponseStatus.match(/Success/g)) {
var ResponseData = JsonValue.Controllers[0]['Response Data'];
var NeedData = [];
var i=0;
for (var key in ResponseData) {
var KeySplitted = key.split(' ');
if (KeySplitted.length === 2) {
JsonValue.Controllers[0]['Response Data'][key][0]['PDID'] = KeySplitted[1];
NeedData[i] = JsonValue.Controllers[0]['Response Data'][key][0];
i = i + 1;
}
}
TxtValue = JSON.stringify(NeedData);
}
else{
TxtValue = JsonValue.Controllers[0]['Description'];
}
return TxtValueDISCARD_UNCHANGED_HEARTBEAT{$PD_THROTTLING_HB_PERIOD}{$ADAP_THROTTLING_HB_PERIOD}10800{$INTERNAL_ITEMS_HISTORY_PEIOD}0{$LD_THROTTLING_HB_PERIOD}10800{$PD_THROTTLING_HB_PERIOD}10800