diff --git a/agent_based/checkpoint_mho_buffer.py b/agent_based/checkpoint_mho_buffer.py new file mode 100644 index 0000000000000000000000000000000000000000..7fb2adcc645c229e73594232775739962bcafa02 --- /dev/null +++ b/agent_based/checkpoint_mho_buffer.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# License: GNU General Public License v2 +# +# Author: thl-cmk[at]outlook[dot]com +# URL : https://thl-cmk.hopto.org +# Date : 2020-11-30 +# +# Monitor Check Point MHO port buffers +# +# +# +# sample snmpwalk +# +# +# sample string_table +# +# +# +# sample section +# + +import time +from typing import List, NamedTuple, Optional, Dict +from dataclasses import dataclass +from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( + DiscoveryResult, + CheckResult, + StringTable, +) + +from cmk.base.plugins.agent_based.agent_based_api.v1 import ( + register, + Service, + equals, + Result, + State, + SNMPTree, + startswith, + all_of, + any_of, + Metric, + GetRateError, + get_rate, + get_value_store, + IgnoreResultsError, + render, +) + + +@dataclass +class CheckPointMhoRxBuffer: + frames: int + octets: int + discard: int + + +@dataclass +class CheckPointMhoPortBuffer: + label: str + admin_state: str + link_state: str + buffer: Dict[str, CheckPointMhoRxBuffer] + + +def parse_checkpoint_mho_buffer(string_table: StringTable) -> Dict[str, CheckPointMhoPortBuffer]: + section = {} + for line in string_table: + _0_frames, _0_octet, _0_discard, _1_frames, _1_octet, _1_discard, _2_frames, _2_octet, _2_discard, _3_frames,\ + _3_octet, _3_discard, _4_frames, _4_octet, _4_discard, _5_frames, _5_octet, _5_discard, _6_frames, _6_octet,\ + _6_discard, _7_frames, _7_octet, _7_discard, index, label, link_state, admin_state = line + + _i = 0 + buffer = {} + for frames, octet, discard in [ + (_0_frames, _0_octet, _0_discard), + (_1_frames, _1_octet, _1_discard), + (_2_frames, _2_octet, _2_discard), + (_3_frames, _3_octet, _3_discard), + (_4_frames, _4_octet, _4_discard), + (_5_frames, _5_octet, _5_discard), + (_6_frames, _6_octet, _6_discard), + (_7_frames, _7_octet, _7_discard), + ]: + buffer[str(_i)] = CheckPointMhoRxBuffer( + frames=int(frames) if frames.isdigit() else 0, + octets=int(octet) if octet.isdigit() else 0, + discard=int(discard) if discard.isdigit() else 0, + ) + _i += 1 + + section[str(index)] = CheckPointMhoPortBuffer( + label=label, + admin_state=admin_state, + link_state=link_state, + buffer=buffer, + ) + + return section + + +def discovery_checkpoint_mho_buffer(params, section: Dict[str, CheckPointMhoPortBuffer]) -> DiscoveryResult: + for item in section.keys(): + if params['add_admin_down'] is not True and section[item].admin_state.lower() in ['down', 'na']: + continue + if params['add_link_down'] is not True and section[item].link_state.lower() == 'down': + continue + yield Service(item=item) + + +def check_checkpoint_mho_buffer(item, params, section: Dict[str, CheckPointMhoPortBuffer]) -> CheckResult: + try: + port = section[item] + except KeyError: + yield Result(state=State.UNKNOWN, notice='Item not found in SNMP data.') + return + + yield Result(state=State.OK, summary=f'Label: {port.label}') + yield Result(state=State.OK, summary=f'Admin state: {port.admin_state}') + yield Result(state=State.OK, summary=f'Link state: {port.link_state}') + + now = time.time() + value_store = get_value_store() + metric_prefix = 'checkpoint_mho_port_buffer' + raise_ingore_res = False + + for buffer in port.buffer.keys(): + try: + value = get_rate(value_store, f'{buffer}_frames', now, port.buffer[buffer].frames, raise_overflow=True, ) + except GetRateError: + raise_ingore_res = True + else: + yield Metric(value=value, name=f'{metric_prefix}_{buffer}_frames') + + try: + value = get_rate(value_store, f'{buffer}_octets', now, port.buffer[buffer].octets, raise_overflow=True, ) + except GetRateError: + raise_ingore_res = True + else: + yield Metric(value=value, name=f'{metric_prefix}_{buffer}_octets') + + try: + value = get_rate(value_store, f'{buffer}_discards', now, port.buffer[buffer].discard, raise_overflow=True, ) + except GetRateError: + raise_ingore_res = True + else: + yield Metric(value=value, name=f'{metric_prefix}_{buffer}_discards') + + if raise_ingore_res: + raise IgnoreResultsError('Initializing counters') + + +register.snmp_section( + name='checkpoint_mho_buffer', + parse_function=parse_checkpoint_mho_buffer, + fetch=SNMPTree( + base='.1.3.6.1.4.1.2620.1.55.1', # CHECKPOINT-MIB::mhoPortsStatus + oids=[ + # '3.1.1', # mhoRxBuffPortIndex + # '3.1.2', # mhoRxBuffPortLabel + '3.1.3', # mhoRxBuff0Frames + '3.1.4', # mhoRxBuff0Octet + '3.1.5', # mhoRxBuff0Discard + '3.1.6', # mhoRxBuff1Frames + '3.1.7', # mhoRxBuff1Octet + '3.1.8', # mhoRxBuff1Discard + '3.1.9', # mhoRxBuff2Frames + '3.1.10', # mhoRxBuff2Octet + '3.1.11', # mhoRxBuff2Discard + '3.1.12', # mhoRxBuff3Frames + '3.1.13', # mhoRxBuff3Octet + '3.1.14', # mhoRxBuff3Discard + '3.1.15', # mhoRxBuff4Frames + '3.1.16', # mhoRxBuff4Octet + '3.1.17', # mhoRxBuff4Discard + '3.1.18', # mhoRxBuff5Frames + '3.1.19', # mhoRxBuff5Octet + '3.1.20', # mhoRxBuff5Discard + '3.1.21', # mhoRxBuff6Frames + '3.1.22', # mhoRxBuff6Octet + '3.1.23', # mhoRxBuff6Discard + '3.1.24', # mhoRxBuff7Frames + '3.1.25', # mhoRxBuff7Octet + '3.1.26', # mhoRxBuff7Discard + + '4.1.1', # mhoStatePortIndex + '4.1.2', # mhoStatePortLabel + '4.1.3', # mhoStateLinkState + '4.1.4', # mhoStateAdminState + # '4.1.5', # mhoStateSpeed + + # '5.1.1', # mhoSummaryPortIndex + # '5.1.2', # mhoSummaryPortLabel + # '5.1.3', # mhoSummaryLinkState + # '5.1.4', # mhoSummaryAdminState + # '5.1.5', # mhoSummarySpeed + # '5.1.6', # mhoSummaryRxFcsErr + # '5.1.7', # mhoSummaryRxErr + # '5.1.8', # mhoSummaryRxFrames + # '5.1.9', # mhoSummaryRxBytes + # '5.1.10', # mhoSummaryTxErr + # '5.1.11', # mhoSummaryTxFrames + # '5.1.12', # mhoSummaryTxBytes + + ] + ), + detect=any_of( + startswith('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.2620'), + all_of( + equals('.1.3.6.1.2.1.1.2.0', '.1.3.6.1.4.1.8072.3.2.10'), + equals('.1.3.6.1.4.1.2620.1.6.1.0', 'SVN Foundation'), + ) + ) +) + +register.check_plugin( + name='checkpoint_mho_buffer', + service_name='RX buffer port %s', + discovery_function=discovery_checkpoint_mho_buffer, + discovery_ruleset_name='discovery_checkpoint_mho_buffer', + discovery_default_parameters={ + 'add_admin_down': False, + 'add_link_down': False, + }, + check_function=check_checkpoint_mho_buffer, + check_default_parameters={}, + check_ruleset_name='checkpoint_mho_buffer', +) diff --git a/checkpoint_mho_buffers.mkp b/checkpoint_mho_buffers.mkp new file mode 100644 index 0000000000000000000000000000000000000000..11e6a4ad70817b57404a7e4f39d8a73991a8a6cd Binary files /dev/null and b/checkpoint_mho_buffers.mkp differ diff --git a/packages/checkpoint_mho_buffers b/packages/checkpoint_mho_buffers new file mode 100644 index 0000000000000000000000000000000000000000..1055a922bd78736b6f28eada8ad668a5f26d38da --- /dev/null +++ b/packages/checkpoint_mho_buffers @@ -0,0 +1,14 @@ +{'author': 'cmkadmin', + 'description': 'Monitors Check Point MHO port RX buffers\n' + '\n' + 'Tested on Orchestrator MHO-140 with R8020.SP HFA_317\n', + 'download_url': '', + 'files': {'agent_based': ['checkpoint_mho_buffer.py'], + 'web': ['plugins/metrics/checkpoint_mho_buffer.py']}, + 'name': 'checkpoint_mho_buffers', + 'num_files': 2, + 'title': 'Check Point MHO port RX buffers', + 'version': '20211130.v0.0.1', + '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/checkpoint_mho_buffer.py b/web/plugins/metrics/checkpoint_mho_buffer.py new file mode 100644 index 0000000000000000000000000000000000000000..9723e497eaf5d0c9ef691e35acc862c6b810d155 --- /dev/null +++ b/web/plugins/metrics/checkpoint_mho_buffer.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# + +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics import ( + metric_info, + graph_info, + perfometer_info, +) + + +_i = 0 +while _i < 8: + metric_info[f'checkpoint_mho_port_buffer_{_i}_frames'] = { + 'title': _(f'RX buffer {_i} frames'), + 'unit': '1/s', + 'color': f'1{_i // 2 + 1}/{chr(97 + _i % 2)}', + } + metric_info[f'checkpoint_mho_port_buffer_{_i}_octets'] = { + 'title': _(f'RX buffer {_i} octets'), + 'unit': '1/s', + 'color': f'2{_i // 2 + 1}/{chr(97 + _i % 2)}', + } + + metric_info[f'checkpoint_mho_port_buffer_{_i}_discards'] = { + 'title': _(f'RX buffer {_i} discards'), + 'unit': '1/s', + 'color': f'3{_i // 2 + 1}/{chr(97 + _i % 2)}', + } + + _i += 1 + +graph_info['checkpoint_mho_port_buffer_frames'] = { + 'title': _('Check Point MHO RX buffer frames'), + 'metrics': [ + ('checkpoint_mho_port_buffer_0_frames', 'line'), + ('checkpoint_mho_port_buffer_1_frames', 'line'), + ('checkpoint_mho_port_buffer_2_frames', 'line'), + ('checkpoint_mho_port_buffer_3_frames', 'line'), + ('checkpoint_mho_port_buffer_4_frames', 'line'), + ('checkpoint_mho_port_buffer_5_frames', 'line'), + ('checkpoint_mho_port_buffer_6_frames', 'line'), + ('checkpoint_mho_port_buffer_7_frames', 'line'), + ], +} + +graph_info['checkpoint_mho_port_buffer_octets'] = { + 'title': _('Check Point MHO RX buffer octets'), + 'metrics': [ + ('checkpoint_mho_port_buffer_0_octets', 'line'), + ('checkpoint_mho_port_buffer_1_octets', 'line'), + ('checkpoint_mho_port_buffer_2_octets', 'line'), + ('checkpoint_mho_port_buffer_3_octets', 'line'), + ('checkpoint_mho_port_buffer_4_octets', 'line'), + ('checkpoint_mho_port_buffer_5_octets', 'line'), + ('checkpoint_mho_port_buffer_6_octets', 'line'), + ('checkpoint_mho_port_buffer_7_octets', 'line'), + ], +} + +graph_info['checkpoint_mho_port_buffer_discards'] = { + 'title': _('Check Point MHO RX buffer discards'), + 'metrics': [ + ('checkpoint_mho_port_buffer_0_discards', 'line'), + ('checkpoint_mho_port_buffer_1_discards', 'line'), + ('checkpoint_mho_port_buffer_2_discards', 'line'), + ('checkpoint_mho_port_buffer_3_discards', 'line'), + ('checkpoint_mho_port_buffer_4_discards', 'line'), + ('checkpoint_mho_port_buffer_5_discards', 'line'), + ('checkpoint_mho_port_buffer_6_discards', 'line'), + ('checkpoint_mho_port_buffer_7_discards', 'line'), + ], +}