diff --git a/checks/iferrordetails b/checks/iferrordetails new file mode 100644 index 0000000000000000000000000000000000000000..832242de6a398e0fc2b67f4266cc1db04e3646a5 --- /dev/null +++ b/checks/iferrordetails @@ -0,0 +1,251 @@ +#!/usr/bin/python +# -*- encoding: utf-8; py-indent-offset: 4 -*- +# +# Interface error details +# +# Author: Th.L. +# Date : 2020-04-03 +# +# Monitor error details of ethernet like interfaces +# Please use only for troubleshooting purposes +# +# +# snmpwalk sample +# +# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -ObentU 1.3.6.1.2.1.10.7.10.1 +# +# +# OMD[mysite]:~$ snmpwalk -v2c -c public isr-1100 -m EtherLike-MIB 1.3.6.1.2.1.10.7.10.1 +# +# +# sample info +# + + + +factory_settings['iferrordetails_defaults'] = { + 'notFound': 3, +} + + +########################################################################### +# +# DATA Parser function +# +########################################################################### + + +def parse_iferrordetails(info): + def get_dot3StatsDuplexStatus(st): + name = { + 1: 'unknown', + 2: 'half duplex', + 3: 'full duplex', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_dot3StatsRateControlAbility(st): + name = { + 1: 'capable', + 2: 'non capable', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_dot3StatsRateControlStatus(st): + name = { + 1: 'off', + 2: 'on', + 3: 'unkown', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + def get_ifOperStatus(st): + name = { + 1: 'up', + 2: 'down', + 3: 'testing', + 4: 'unknown', + 5: 'dormant', + 6: 'notPresent', + 7: 'lowerLayerDown', + } + if st.isdigit(): + return name.get(int(st), 'unkown') + else: + return 'no digit' + + + def get_short_if_name(st): + names = {'ethernet': 'Eth', + 'fastethernet': 'Fa', + 'gigabitethernet': 'Gi', + 'tengigabitethernet': 'Te', + 'fortygigabitethernet': 'Fo', + 'hundredgigabitethernet': 'Hu', + 'port-channel': 'Po', + 'tunnel': 'Tu', + 'loopback': 'Lo', + 'wlan-gigabitethernet': 'Wlan-Gi', + } + for item in names.keys(): + if st.lower().startswith(item): + st = st.lower().replace(item, names.get(item)) + return st + + errorDetailsList, interfaces = info + + parsed = {} + + for entry in errorDetailsList: + ifIndex, dot3StatsAlignmentErrors, dot3StatsFCSErrors, dot3StatsSingleCollisionFrames, \ + dot3StatsMultipleCollisionFrames, dot3StatsSQETestErrors, dot3StatsDeferredTransmissions, \ + dot3StatsLateCollisions, dot3StatsExcessiveCollisions, dot3StatsInternalMacTransmitErr, \ + dot3StatsCarrierSenseErrors, dot3StatsFrameTooLongs, dot3StatsInternalMacReceiveErrors, \ + dot3StatsSymbolErrors, dot3StatsDuplexStatus, dot3StatsRateControlAbility, \ + dot3StatsRateControlStatus = entry + + for interface in interfaces: + if ifIndex == interface[0]: + ifIndex, ifName, ifOperStatus = interface + + if int(ifOperStatus) != 1: + dot3StatsDuplexStatus ='interface not up' + else: + dot3StatsDuplexStatus = get_dot3StatsDuplexStatus(dot3StatsDuplexStatus) + + + + errorsDetails = { + 'dot3StatsAlignmentErrors': int(dot3StatsAlignmentErrors), + 'dot3StatsFCSErrors': int(dot3StatsFCSErrors), + 'dot3StatsSingleCollisionFrames': int(dot3StatsSingleCollisionFrames), + 'dot3StatsMultipleCollisionFrames': int(dot3StatsMultipleCollisionFrames), + 'dot3StatsSQETestErrors': int(dot3StatsSQETestErrors), + 'dot3StatsDeferredTransmissions': int(dot3StatsDeferredTransmissions), + 'dot3StatsLateCollisions': int(dot3StatsLateCollisions), + 'dot3StatsExcessiveCollisions': int(dot3StatsExcessiveCollisions), + 'dot3StatsInternalMacTransmitErr': int(dot3StatsInternalMacTransmitErr), + 'dot3StatsCarrierSenseErrors': int(dot3StatsCarrierSenseErrors), + 'dot3StatsFrameTooLongs': int(dot3StatsFrameTooLongs), + 'dot3StatsInternalMacReceiveErrors': int(dot3StatsInternalMacReceiveErrors), + 'dot3StatsSymbolErrors': int(dot3StatsSymbolErrors), + 'dot3StatsDuplexStatus': dot3StatsDuplexStatus, + 'dot3StatsRateControlAbility': get_dot3StatsRateControlAbility(dot3StatsRateControlAbility), + 'dot3StatsRateControlStatus': get_dot3StatsRateControlStatus(dot3StatsRateControlStatus), + 'ifOperStatus': get_ifOperStatus(ifOperStatus), + } + + parsed.update({'{}'.format(get_short_if_name(ifName)): errorsDetails}) + + return parsed + + +########################################################################### +# +# INVENTORY function +# +########################################################################### + + +def inventory_iferrordetails(parsed): + for entry in parsed.keys(): + yield entry, {} + + +########################################################################### +# +# CHECK function +# +########################################################################### + + +def check_iferrordetails(item, params, parsed): + + if item in parsed.keys(): + + errorDetails = parsed[item] + longoutput = '' + infotext = '' + perfdata = [] + state = 0 + + infotext += 'Interface state: {}'.format(errorDetails['ifOperStatus']) + if errorDetails['ifOperStatus'].lower() == 'up': + infotext += ', duplex state: {}'.format(errorDetails['dot3StatsDuplexStatus']) + + longoutput += '\nRate control: {}'.format( errorDetails['dot3StatsRateControlAbility']) + longoutput += '\nRate control state: {}'.format(errorDetails['dot3StatsRateControlStatus']) + + perfdata = [ + ('dot3statsalignmenterrors', errorDetails['dot3StatsAlignmentErrors']), + ('dot3statsfcserrors', errorDetails['dot3StatsFCSErrors']), + ('dot3statssinglecollisionframes', errorDetails['dot3StatsSingleCollisionFrames']), + ('dot3statsmultiplecollisionframes', errorDetails['dot3StatsMultipleCollisionFrames']), + ('dot3statssqetesterrors', errorDetails['dot3StatsSQETestErrors']), + ('dot3statsdeferredtransmissions', errorDetails['dot3StatsDeferredTransmissions']), + ('dot3statslatecollisions', errorDetails['dot3StatsLateCollisions']), + ('dot3statsexcessivecollisions', errorDetails['dot3StatsExcessiveCollisions']), + ('dot3statsinternalmactransmiterr', errorDetails['dot3StatsInternalMacTransmitErr']), + ('dot3statscarriersenseerrors', errorDetails['dot3StatsCarrierSenseErrors']), + ('dot3statsframetoolongs', errorDetails['dot3StatsFrameTooLongs']), + ('dot3statsinternalmacreceiveerrors', errorDetails['dot3StatsInternalMacReceiveErrors']), + ('dot3statssymbolerrors', errorDetails['dot3StatsSymbolErrors']), + ] + + yield state, infotext + longoutput, perfdata + + else: + yield params['notFound'], 'item missing' + + +########################################################################### +# +# CHECK info +# +########################################################################### + + +check_info['iferrordetails'] = { + 'check_function': check_iferrordetails, + 'inventory_function': inventory_iferrordetails, + 'service_description': 'Error details %s', + 'has_perfdata': True, + 'snmp_scan_function': lambda oid: oid('.1.3.6.1.2.1.10.7.10.1.1') != '', # EtherLike-MIB::dot3PauseAdminMode + 'group': 'iferrordetails', + 'default_levels_variable': 'iferrordetails_defaults', + 'parse_function': parse_iferrordetails, + 'snmp_info': [('.1.3.6.1.2.1.10.7.2.1', [ # EtherLike-MIB::dot3StatsEntry + OID_END, # ifIndex + '2', # dot3StatsAlignmentErrors(2) + '3', # dot3StatsFCSErrors(3) + '4', # dot3StatsSingleCollisionFrames(4) + '5', # dot3StatsMultipleCollisionFrames(5) + '6', # dot3StatsSQETestErrors(6) + '7', # dot3StatsDeferredTransmissions(7) + '8', # dot3StatsLateCollisions(8) + '9', # dot3StatsExcessiveCollisions(9) + '10', # dot3StatsInternalMacTransmitErrors(10) + '11', # dot3StatsCarrierSenseErrors(11) + '13', # dot3StatsFrameTooLongs(13) + '16', # dot3StatsInternalMacReceiveErrors(16) + '18', # dot3StatsSymbolErrors(18) + '19', # dot3StatsDuplexStatus(19) + '20', # dot3StatsRateControlAbility(20) + '21', # dot3StatsRateControlStatus(21) + ]), + ('.1.3.6.1.2.1.2.2.1', ['1', # ifIndex + '2', # ifDescr + '8', # ifOperStatus + ]), + ] +} + diff --git a/iferrordetails.mkp b/iferrordetails.mkp new file mode 100644 index 0000000000000000000000000000000000000000..b218b10a4d2172fb0658777290403f111446efaa Binary files /dev/null and b/iferrordetails.mkp differ diff --git a/packages/iferrordetails b/packages/iferrordetails new file mode 100644 index 0000000000000000000000000000000000000000..b6373dab0e50603642f60ee62b7e1793e834278e --- /dev/null +++ b/packages/iferrordetails @@ -0,0 +1,11 @@ +{'author': u'Th.L. (thl-cmk[at]outlook[dot]com)', + 'description': u'Monitors interfaces error details\nPlease use only for troubleshooting purposes', + 'download_url': 'https://thl-cmk.hopto.org', + 'files': {'checks': ['iferrordetails'], + 'web': ['plugins/metrics/iferrordetails.py']}, + 'name': 'iferrordetails', + 'num_files': 2, + 'title': u'CInterface error details', + 'version': '20200403.v0.0.1', + 'version.min_required': '1.2.8b8', + 'version.packaged': '1.6.0p8'} \ No newline at end of file diff --git a/web/plugins/metrics/iferrordetails.py b/web/plugins/metrics/iferrordetails.py new file mode 100644 index 0000000000000000000000000000000000000000..80fb0dd414b43dfa320a3021c504e0fbe8098e47 --- /dev/null +++ b/web/plugins/metrics/iferrordetails.py @@ -0,0 +1,145 @@ +#!/usr/bin/python +# -*- encoding: utf-8; py-indent-offset: 4 -*- +# +# Interface error details metrics plugin +# +# Author: Th.L. +# Date : 2020-04-03 +# + +##################################################################################################################### +# +# define units +# +##################################################################################################################### + + +###################################################################################################################### +# +# map perfdata to metric, not really necessary but makes sure to use the right metrics +# +###################################################################################################################### + + +check_metrics['check_mk-iferrordetails'] = { + 'dot3statsalignmenterrors': {'name': 'iferrordetails_dot3statsalignmenterrors',}, + 'dot3statsfcserrors': {'name': 'iferrordetails_dot3statsfcserrors',}, + 'dot3statssinglecollisionframes': {'name': 'iferrordetails_dot3statssinglecollisionframes',}, + 'dot3statsmultiplecollisionframes': {'name': 'iferrordetails_dot3statsmultiplecollisionframes',}, + 'dot3statssqetesterrors': {'name': 'iferrordetails_dot3statssqetesterrors',}, + 'dot3statsdeferredtransmissions': {'name': 'iferrordetails_dot3statsdeferredtransmissions',}, + 'dot3statslatecollisions': {'name': 'iferrordetails_dot3statslatecollisions',}, + 'dot3statsexcessivecollisions': {'name': 'iferrordetails_dot3statsexcessivecollisions',}, + 'dot3statsinternalmactransmiterr': {'name': 'iferrordetails_dot3statsinternalmactransmiterr',}, + 'dot3statscarriersenseerrors': {'name': 'iferrordetails_dot3statscarriersenseerrors',}, + 'dot3statsframetoolongs': {'name': 'iferrordetails_dot3statsframetoolongs',}, + 'dot3statsinternalmacreceiveerrors': {'name': 'iferrordetails_dot3statsinternalmacreceiveerrors',}, + 'dot3statssymbolerrors': {'name': 'iferrordetails_dot3statssymbolerrors',}, +} + +##################################################################################################################### +# +# define metrics for perfdata +# +##################################################################################################################### + + +metric_info['iferrordetails_dot3statsalignmenterrors'] = { + 'title' : _('Alignment errors'), + 'unit' : 'count', + 'color' : '11/a', +} +metric_info['iferrordetails_dot3statsfcserrors'] = { + 'title' : _('FCS errors'), + 'unit' : 'count', + 'color' : '12/a', +} +metric_info['iferrordetails_dot3statssinglecollisionframes'] = { + 'title' : _('Single collision frames'), + 'unit' : 'count', + 'color' : '13/a', +} +metric_info['iferrordetails_dot3statsmultiplecollisionframes'] = { + 'title' : _('Multiple collision frames'), + 'unit' : 'count', + 'color' : '14/a', +} +metric_info['iferrordetails_dot3statssqetesterrors'] = { + 'title' : _('sqe test errors'), + 'unit' : 'count', + 'color' : '15/a', +} +metric_info['iferrordetails_dot3statsdeferredtransmissions'] = { + 'title' : _('Deferred transmissions'), + 'unit' : 'count', + 'color' : '16/a', +} +metric_info['iferrordetails_dot3statslatecollisions'] = { + 'title' : _('Late collisions'), + 'unit' : 'count', + 'color' : '21/a', +} +metric_info['iferrordetails_dot3statsexcessivecollisions'] = { + 'title' : _('Excessive collisions'), + 'unit' : 'count', + 'color' : '22/a', +} +metric_info['iferrordetails_dot3statsinternalmactransmiterr'] = { + 'title' : _('internal MAC transmit errors'), + 'unit' : 'count', + 'color' : '23/a', +} +metric_info['iferrordetails_dot3statscarriersenseerrors'] = { + 'title' : _('Sarrier sense errors'), + 'unit' : 'count', + 'color' : '24/a', +} +metric_info['iferrordetails_dot3statsframetoolongs'] = { + 'title' : _('Frame too long'), + 'unit' : 'count', + 'color' : '25/a', +} +metric_info['iferrordetails_dot3statsinternalmacreceiveerrors'] = { + 'title' : _('Internal MAC receive errors'), + 'unit' : 'count', + 'color' : '26/a', +} +metric_info['iferrordetails_dot3statssymbolerrors'] = { + 'title' : _('Symbol errors'), + 'unit' : 'count', + 'color' : '31/a', +} + + +###################################################################################################################### +# +# how to graph perdata +# +###################################################################################################################### + +graph_info.append({ + 'title': _('Interface error details'), + 'metrics': [ + ('iferrordetails_dot3statsalignmenterrors', 'line'), + ('iferrordetails_dot3statsfcserrors', 'line'), + ('iferrordetails_dot3statssinglecollisionframes', 'line'), + ('iferrordetails_dot3statsmultiplecollisionframes', 'line'), + ('iferrordetails_dot3statssqetesterrors', 'line'), + ('iferrordetails_dot3statsdeferredtransmissions', 'line'), + ('iferrordetails_dot3statslatecollisions', 'line'), + ('iferrordetails_dot3statsexcessivecollisions', 'line'), + ('iferrordetails_dot3statsinternalmactransmiterr', 'line'), + ('iferrordetails_dot3statscarriersenseerrors', 'line'), + ('iferrordetails_dot3statsframetoolongs', 'line'), + ('iferrordetails_dot3statsinternalmacreceiveerrors', 'line'), + ('iferrordetails_dot3statssymbolerrors', 'line'), + ], +}) + + +###################################################################################################################### +# +# define perf-o-meter +# +###################################################################################################################### +