diff --git a/agent_based/cisco_cellular_lte.py b/agent_based/cisco_cellular_lte.py index 449c72dee0ed45d5f8e86f27d13118bbf6118f5d..a53be97a4567e77a7ca969863f90a12d5cf255c4 100644 --- a/agent_based/cisco_cellular_lte.py +++ b/agent_based/cisco_cellular_lte.py @@ -12,6 +12,7 @@ # Monitor status of Cisco cellular modems/connections/interfaces # # 2022-09-20: added WATO options +# 2022-11-10: added upper_levels to perfdata for scalars in metrics # # sample snmpwalk # @@ -83,14 +84,14 @@ class CiscoCellular3g: modem_status: str network: str channel: int - rssi: int band: str + rssi: Optional[int] @dataclass class CiscoCellularRadio: - lte_rsrp: int - lte_rsrq: int + lte_rsrp: Optional[int] + lte_rsrq: Optional[int] @dataclass @@ -141,6 +142,7 @@ _cisco_gsm_service_type = { } _cisco_gsm_band = { + '0': 'UMTS', # not part of the Cisco MIB '1': 'unknown', '2': 'invalid', '3': 'none', @@ -152,7 +154,7 @@ _cisco_gsm_band = { '9': 'WCDMA-850', '10': 'WCDMA-1900', '11': 'WCDMA-2100', - '12': 'LTE Band', + '12': 'LTE', } _cisco_roaming_status = { @@ -198,8 +200,8 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di for radio_oid_end, current_rsrp, current_rsrq in radio_table: radios[radio_oid_end] = CiscoCellularRadio( - lte_rsrp=int(current_rsrp), - lte_rsrq=int(current_rsrq) # // 10, # See Cisco bug ID CSCvt55347 + lte_rsrp=int(current_rsrp) if current_rsrp.lstrip('-').isdigit() else None, + lte_rsrq=int(current_rsrq) if current_rsrq.lstrip('-').isdigit() else None, # // 10, # See Cisco bug ID CSCvt55347 ) for profile_oid_end, apn_type, apn in profile_table: @@ -213,6 +215,12 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di for modem_oid_end, modem_state, service_type, roaming_status, modem_time, conn_status,\ modem_status, network, totyl_bytes_tx, total_bytes_rx, rssi, channel, band in modem_table: + if band == 1: + if channel in ['2938', '2961', '2963', '3011', '3027', '3087']: + band = '0' + elif channel in ['6200']: + band = '12' + modems[modem_oid_end] = CiscoCellular3g( modem_state=modem_state, service_type=str(service_type[0]*256 + service_type[1]), @@ -223,7 +231,7 @@ def parse_cisco_cellular_lte(string_table: List[StringByteTable]) -> Optional[Di total_bytes_rx=int(total_bytes_rx), modem_status=modem_status, network=network, - rssi=int(rssi), + rssi=int(rssi) if rssi.lstrip('-').isdigit() else None, channel=int(channel), band=band, ) @@ -317,19 +325,59 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter else: yield Result(state=State(params['roaming_state']), notice=text) - for value, label, render_func, levels_lower, metric in [ - (interface.radio.lte_rsrp, 'RSRP', lambda v: f'{v} dBm', params['rsrp_levels_lower'], 'rsrp'), - (interface.radio.lte_rsrq if params['CSCvt55347_fixed'] else interface.radio.lte_rsrq // 10, # handle Cisco BugID CSCvt55347 - 'RSRQ', lambda v: f'{v} dB', params['rsrp_levels_lower'], 'rsrq',), - (interface.modem.rssi, 'RSSI', lambda v: f'{v} dBm', params['rssi_levels_lower'], 'rssi'), + if not params['CSCvt55347_fixed'] and interface.radio.lte_rsrq: + interface.radio.lte_rsrq = interface.radio.lte_rsrq / 10 # handle Cisco BugID CSCvt55347 + + if interface.radio.lte_rsrp < -111: + lte_rsrp_quality = 'Poor' + elif interface.radio.lte_rsrp <= -103: + lte_rsrp_quality = 'Fair' + elif interface.radio.lte_rsrp <= -85: + lte_rsrp_quality = 'Good' + elif interface.radio.lte_rsrp >= -84: + lte_rsrp_quality = 'Excellent' + + if interface.radio.lte_rsrq < -12: + lte_rsrq_quality = 'Poor' + elif interface.radio.lte_rsrq <= -9: + lte_rsrq_quality = 'Fair' + elif interface.radio.lte_rsrq <= -5: + lte_rsrq_quality = 'Good' + elif interface.radio.lte_rsrq > -5: + lte_rsrq_quality = 'Excellent' + + if interface.modem.rssi < -85: + rssi_quality = 'Poor' + elif interface.modem.rssi <= -75: + rssi_quality = 'Fair' + elif interface.modem.rssi <= -65: + rssi_quality = 'Good' + elif interface.modem.rssi >= -65: + rssi_quality = 'Excellent' + + for value, label, render_func, levels_lower, metric, in [ + (interface.radio.lte_rsrp, 'RSRP', lambda v: f'{v} dBm ({lte_rsrp_quality})', params['rsrp_levels_lower'], 'rsrp'), + (interface.radio.lte_rsrq, 'RSRQ', lambda v: f'{v} dB ({lte_rsrq_quality})', params['rsrp_levels_lower'], 'rsrq'), + (interface.modem.rssi, 'RSSI', lambda v: f'{v} dBm ({rssi_quality})', params['rssi_levels_lower'], 'rssi'), ]: - yield from check_levels( - value=value, - label=label, - render_func=render_func, - levels_lower=levels_lower, - metric_name=f'{metric_prefix}{metric}', - ) + if value: + warn, crit = levels_lower + if warn: + warn = warn * -1 + if crit: + crit = crit * -1 + yield from check_levels( + value=value, + label=label, + render_func=render_func, + levels_upper=(warn, crit), # used for scalars in metrics + levels_lower=levels_lower, + metric_name=f'{metric_prefix}{metric}', + ) + + if interface.radio.lte_rsrp or interface.radio.lte_rsrq: + if not interface.radio.lte_rsrq or not interface.radio.lte_rsrp: + yield Result(state=State.OK, notice='Channel changed while polling') now_time = time.time() value_store = get_value_store() @@ -355,6 +403,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter yield Result(state=State.OK, notice=f'IPv6 Address: {interface.ipv6_addr}') yield Result(state=State.OK, notice=f'Networkcode: {interface.modem.network}') + expected_band = params['expected_band'] if interface.modem.band == expected_band: yield Result(state=State.OK, summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)}') @@ -363,6 +412,7 @@ def check_cisco_cellular_lte(item, params, section: Dict[str, CiscoCellularInter state=State(params['state_not_expected_band']), summary=f'Band: {_cisco_gsm_band.get(interface.modem.band)} (expected: {_cisco_gsm_band.get(expected_band)})' ) + yield Result(state=State.OK, notice=f'Channel: {interface.modem.channel}') yield Result(state=State.OK, notice=f'Service type: {_cisco_gsm_service_type.get(interface.modem.service_type)}') yield Result(state=State.OK, notice=f'Provider Time: {interface.modem.current_system_time}') @@ -448,8 +498,8 @@ register.check_plugin( }, check_function=check_cisco_cellular_lte, check_default_parameters={ - 'rsrp_levels_lower': (-100, -115), - 'rsrq_levels_lower': (-8, -15), + 'rsrp_levels_lower': (-103, -112), + 'rsrq_levels_lower': (-9, -13), 'rssi_levels_lower': (-75, -85), 'roaming_state': 1, 'no_profile_state': 1, diff --git a/cisco_cellular_lte.mkp b/cisco_cellular_lte.mkp index 8856b2e231159e3f9908b6007de6cf5a07aa4eeb..4ba640e57dc1f03ba4d8165c9196cd9c6f93d6e2 100644 Binary files a/cisco_cellular_lte.mkp and b/cisco_cellular_lte.mkp differ diff --git a/packages/cisco_cellular_lte b/packages/cisco_cellular_lte index b197fed6af17032fa3d0b4ff9b95f46a4f43a7b9..86e04f18c4e58e2707f6d32d011303229475b337 100644 --- a/packages/cisco_cellular_lte +++ b/packages/cisco_cellular_lte @@ -11,7 +11,7 @@ 'name': 'cisco_cellular_lte', 'num_files': 6, 'title': 'Cisco cellular LTE', - 'version': '20220920.v0.0.1', + 'version': '20221110.v0.0.1a', 'version.min_required': '2.0.0', 'version.packaged': '2021.09.20', 'version.usable_until': None} \ No newline at end of file diff --git a/web/plugins/metrics/cisco_cellular_lte.py b/web/plugins/metrics/cisco_cellular_lte.py index 0164494e65efddd3512bb4fd7e2a4b4c46bd1c37..495c52e05f9ae1e51362f1ac4f5212ba6c5f873c 100644 --- a/web/plugins/metrics/cisco_cellular_lte.py +++ b/web/plugins/metrics/cisco_cellular_lte.py @@ -10,6 +10,9 @@ # # Cisco Cellular LTE metrics plugin # +# 2022-11-10: fixed range for RSRP and RSRQ +# added range for RSSI +# added scalars for all # from cmk.gui.i18n import _ @@ -40,7 +43,11 @@ graph_info['cisco_cellular.rsrp'] = { 'metrics': [ ('cisco_cellular_rsrp', 'area'), ], - 'range': (0, 'cisco_cellular_rsrp:max'), + 'scalars': [ + ('cisco_cellular_rsrp:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrp:warn,-1,*', 'Warning'), + ], + 'range': ('cisco_cellular_rsrp:max,-', 1), } graph_info['cisco_cellular.rsrq'] = { @@ -49,10 +56,10 @@ graph_info['cisco_cellular.rsrq'] = { ('cisco_cellular_rsrq', 'area'), ], 'scalars': [ - ('cisco_cellular_rsrq:crit', _('crit')), - ('cisco_cellular_rsrq:warn', _('warn')), + ('cisco_cellular_rsrq:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrq:warn,-1,*', 'Critical'), ], - 'range': (0, 'cisco_cellular_rsrq:max'), + 'range': ('cisco_cellular_rsrq:max,-', 1), } graph_info['cisco_cellular.rssi'] = { @@ -60,4 +67,9 @@ graph_info['cisco_cellular.rssi'] = { 'metrics': [ ('cisco_cellular_rssi', 'area'), ], + 'scalars': [ + ('cisco_cellular_rssi:crit,-1,*', 'Critical'), + ('cisco_cellular_rsrq:warn,-1,*', 'Critical'), + ], + 'range': ('cisco_cellular_rssi:max,-', 1) } diff --git a/web/plugins/wato/cisco_cellular_lte.py b/web/plugins/wato/cisco_cellular_lte.py index 66d86980f80b2ce59d64bdc096e0e378a4f62833..46a86f06b82594fae16b5420a154a2e80a3b2511 100644 --- a/web/plugins/wato/cisco_cellular_lte.py +++ b/web/plugins/wato/cisco_cellular_lte.py @@ -37,16 +37,16 @@ def _parameter_valuespec_cisco_cellular_lte(): title=_('Lower levels for RSRP'), help=_('Lower levels for RSRP (Reference Signal Received Power) in dBm'), elements=[ - Integer(title=_('Warning below'), default_value=-100, unit=_('dBm')), - Integer(title=_('Critical below'), default_value=-115, unit=_('dBm')), + Integer(title=_('Warning below'), default_value=-103, unit=_('dBm')), + Integer(title=_('Critical below'), default_value=-112, unit=_('dBm')), ])), ('rsrq_levels_lower', Tuple( title=_('Lower levels for RSRQ'), help=_('Lower levels for RSRQ (Reference Signal Received Quality) in dB'), elements=[ - Integer(title=_('Warning below'), default_value=-8, unit=_('dB')), - Integer(title=_('Critical below'), default_value=-15, unit=_('dB')), + Integer(title=_('Warning below'), default_value=-9, unit=_('dB')), + Integer(title=_('Critical below'), default_value=-13, unit=_('dB')), ])), ('rssi_levels_lower', Tuple( @@ -62,7 +62,8 @@ def _parameter_valuespec_cisco_cellular_lte(): help=_('The expected cellular band.'), default_value='12', choices=[ - ('12', 'LTE Band'), + ('12', 'LTE'), + ('0', 'UMTS'), ('11', 'WCDMA-2100'), ('10', 'WCDMA-1900'), ('9', 'WCDMA-850'),