diff --git a/agent_based/checkpoint_asg_smo_counters.py b/agent_based/checkpoint_asg_smo_counters.py index f67256fb873ba0241c9218c82c8a635ef0f05c47..f35d377177eae57ea7df25cb06c26c5e8bffec3b 100644 --- a/agent_based/checkpoint_asg_smo_counters.py +++ b/agent_based/checkpoint_asg_smo_counters.py @@ -10,7 +10,7 @@ # Monitor Check Point Maestro SMO SGM Counters # # 2021-09-10: rewritten for CMK 2.0 -# +# 2021-09-11: added metrics file # # sample snmpwalk # .1.3.6.1.4.1.2620.1.48.20.1.0 = STRING: "111802" @@ -35,12 +35,12 @@ # .1.3.6.1.4.1.2620.1.48.20.20.0 = STRING: "0" # .1.3.6.1.4.1.2620.1.48.20.21.0 = STRING: "N/A" # -# sample info -# [[u'111802', u'0', u'84', u'91', u'N/A', u'0', u'0', u'9', u'79', u'1', u'0', u'0', u'0', u'1', u'0', u'7', u'0', u'0', u'0', u'0', u'N/A']] +# sample string_table +# [['111802', '0', '84', '91', 'N/A', '0', '0', '9', '79', '1', '0', '0', '0', '1', '0', '7', '0', '0', '0', '0', 'N/A']] # -import time + from dataclasses import dataclass -from typing import List, Dict, NamedTuple, Optional +from typing import Dict from cmk.base.plugins.agent_based.agent_based_api.v1 import ( register, @@ -53,8 +53,6 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import ( startswith, any_of, equals, - check_levels, - render, ) from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( DiscoveryResult, @@ -63,7 +61,15 @@ from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import ( ) -def parse_checkpoint_asg_smo_counters(string_table: StringTable) -> Dict[str, Dict[str, int]]: +@dataclass +class CheckpointAsgSmoCounters: + counters: Dict[str, int] + label: str + unit: str + text: str + + +def parse_checkpoint_asg_smo_counters(string_table: StringTable) -> Dict[str, CheckpointAsgSmoCounters]: items = {} for entry in string_table: asgThroughput, asgConnectionRate, asgPacketRate, asgConcurrConn, asgClearConn, asgAccelConnectionRate, \ @@ -71,120 +77,103 @@ def parse_checkpoint_asg_smo_counters(string_table: StringTable) -> Dict[str, Di asgAccelLoadMin, asgAccelLoadMax, asgInstancesLoadAvg, asgInstancesLoadMin, asgInstancesLoadMax, \ asgVpnThroughput, asgVpnConn, asgNatConnRate, asgNatConn, asgVsxCpu1MinAvg = entry - items['Concurrent connections'] = { - 'asgConcurrConn': int(asgConcurrConn), - 'asgAccelConcurrConn': int(asgAccelConcurrConn), - 'asgNonAccelConcurrConn': int(asgNonAccelConcurrConn), - } - items['Connection rate'] = { - 'asgConnectionRate': int(asgConnectionRate), - 'asgAccelConnectionRate': int(asgAccelConnectionRate), - 'asgNonAccelConnectionRate': int(asgNonAccelConnectionRate), - } - - items['Load'] = { - 'asgLoad': int(asgLoad), - 'asgAccelLoadAvg': int(asgAccelLoadAvg), - 'asgAccelLoadMin': int(asgAccelLoadMin), - 'asgAccelLoadMax': int(asgAccelLoadMax), - } - - items['Instances load'] = { - 'asgInstancesLoadAvg': int(asgInstancesLoadAvg), - 'asgInstancesLoadMin': int(asgInstancesLoadMin), - 'asgInstancesLoadMax': int(asgInstancesLoadMax), - } - items['NAT'] = { - 'asgNatConnRate': int(asgNatConnRate), - 'asgNatConn': int(asgNatConn), - } - items['VPN'] = { - 'asgVpnThroughput': int(asgVpnThroughput), - 'asgVpnConn': int(asgVpnConn), - } - items['Throughput'] = { - 'asgThroughput': int(asgThroughput), - } - items['Packet rate'] = { - 'asgPacketRate': int(asgPacketRate), - } - return items - - -def discovery_checkpoint_asg_smo_counters(section:Dict[str, Dict[str, int]]) -> DiscoveryResult: - # sample parsed - # { - # 'Load': {'asgAccelLoadAvg': 0, 'asgAccelLoadMin': 0, 'asgLoad': 1, 'asgAccelLoadMax': 0}, - # 'Connection rate': {'asgConnectionRate': 0, 'asgNonAccelConnectionRate': 0, 'asgAccelConnectionRate': 0}, - # 'Instances load': {'asgInstancesLoadMin': 0, 'asgInstancesLoadMax': 7, 'asgInstancesLoadAvg': 1}, - # 'Throughput': {'asgThroughput': 111802}, - # 'Concurrent connections': {'asgAccelConcurrConn': 9, 'asgNonAccelConcurrConn': 79, 'asgConcurrConn': 91}, - # 'NAT': {'asgNatConn': 0, 'asgNatConnRate': 0}, - # 'VPN': {'asgVpnConn': 0, 'asgVpnThroughput': 0}, - # 'Packet rate': {'asgPacketRate': 84}} - # + items['Concurrent connections'] = CheckpointAsgSmoCounters( + counters={ + 'concurr_conn': int(asgConcurrConn), + 'accel_concurr_conn': int(asgAccelConcurrConn), + 'non_accel_concurr_conn': int(asgNonAccelConcurrConn), + }, + label='all/accelerated/non accelerated', + unit='connections', + text=f'{int(asgConcurrConn):d}/{int(asgAccelConcurrConn):d}/{int(asgNonAccelConcurrConn):d}', + ) + items['Connection rate'] = CheckpointAsgSmoCounters( + counters={ + 'connection_rate': int(asgConnectionRate), + 'accel_connection_rate': int(asgAccelConnectionRate), + 'non_accel_connection_rate': int(asgNonAccelConnectionRate), + }, + label='current/average/min/max', + unit='connections/s', + text=f'{int(asgLoad):d}/{int(asgAccelLoadAvg):d}/{int(asgAccelLoadMin):d}/{int(asgAccelLoadMax):d}', + ) + items['Load'] = CheckpointAsgSmoCounters( + counters={ + 'load': int(asgLoad), + 'accel_load_avg': int(asgAccelLoadAvg), + 'accel_load_min': int(asgAccelLoadMin), + 'accel_load_max': int(asgAccelLoadMax), + }, + label='current/average/min/max', + unit='%', + text=f'{int(asgLoad):d}/{int(asgAccelLoadAvg):d}/{int(asgAccelLoadMin):d}/{int(asgAccelLoadMax):d}', + ) + items['Instances load'] = CheckpointAsgSmoCounters( + counters={ + 'instances_load_avg': int(asgInstancesLoadAvg), + 'instances_load_min': int(asgInstancesLoadMin), + 'instances_load_max': int(asgInstancesLoadMax), + }, + label='average/min/max', + unit='%', + text=f'{int(asgInstancesLoadAvg):d}/{int(asgInstancesLoadMin):d}/{int(asgInstancesLoadMax):d}', + ) + items['NAT'] = CheckpointAsgSmoCounters( + counters={ + 'nat_conn_rate': int(asgNatConnRate), + 'nat_conn': int(asgNatConn), + }, + label='NAT Connections/NAT connection rate', + unit='connections', + text=f'{int(asgNatConn):d}/{int(asgNatConn):d}', + ) + items['VPN'] = CheckpointAsgSmoCounters( + counters={ + 'vpn_throughput': int(asgVpnThroughput), + 'vpn_conn': int(asgVpnConn), + }, + label='VPN Connections/VPN Throughput', + unit='', + text=f'{int(asgVpnConn):d}/{int(asgVpnThroughput):d}', + ) + items['Throughput'] = CheckpointAsgSmoCounters( + counters={ + 'throughput': int(asgThroughput), + }, + label='Throughput', + unit='Bytes/s', + text=f'{int(asgThroughput):d}' + ) + items['Packet rate'] = CheckpointAsgSmoCounters( + counters={ + 'packet_rate': int(asgPacketRate), + }, + label='Packet Rate', + unit='Packets/s', + text=f'{int(asgPacketRate):d}', + ) + if items: + return items + +def discovery_checkpoint_asg_smo_counters(section:Dict[str, CheckpointAsgSmoCounters]) -> DiscoveryResult: for item in section.keys(): yield Service(item=item) -def check_checkpoint_asg_smo_counters(item, params, section:Dict[str, Dict[str, int]]) -> CheckResult: +def check_checkpoint_asg_smo_counters(item, params, section: Dict[str, CheckpointAsgSmoCounters]) -> CheckResult: try: entry = section[item] except KeyError: yield Result(state=State.UNKNOWN, notice='Item not found in SNMP data') return - for key in entry.keys(): - yield Metric(value=entry[key], name=f'checkpoint_asg_mso_counters_{key}') + for key in entry.counters.keys(): + yield Metric(value=entry.counters[key], name=f'checkpoint_asg_smo_counters_{key}') - if item.lower() == 'concurrent connections': - yield Result( - state=State.OK, - summary=f'all/accelerated/non accelerated: {entry["asgConcurrConn"]:d}/{entry["asgAccelConcurrConn"]:d}/{entry["asgNonAccelConcurrConn"]:d}' - ) - - elif item.lower() == 'load': - yield Result( - state=State.OK, - summary=f'current/average/min/max: {entry["asgLoad"]:d}/{entry["asgAccelLoadAvg"]:d}/{entry["asgAccelLoadMin"]:d}/{entry["asgAccelLoadMax"]:d}' - ) + yield Result(state=State.OK, summary=f'{entry.label}: {entry.text}') - elif item.lower() == 'connection rate': - yield Result( - state=State.OK, - summary=f'all/accelerated/non accelerated: {entry["asgConnectionRate"]:d}/{entry["asgAccelConnectionRate"]:d}/{entry["asgNonAccelConnectionRate"]:d}' - ) - elif item.lower() == 'instances load': - yield Result( - state=State.OK, - summary=f'average/min/max: {entry["asgInstancesLoadAvg"]:d}/{entry["asgInstancesLoadMin"]:d}/{entry["asgInstancesLoadMax"]:d}' - ) - - elif item.lower() == 'throughput': - yield Result( - state=State.OK, - summary=f'Throughput: {entry["asgThroughput"]:d}' - ) - - elif item.lower() == 'packet rate': - yield Result( - state=State.OK, - summary=f'Packet Rate: {entry["asgPacketRate"]:d}' - ) - - elif item.lower() == 'nat': - yield Result( - state=State.OK, - summary=f'NAT Connections/NAT connection rate: {entry["asgNatConn"]:d}/{entry["asgNatConn"]:d}' - ) - - elif item.lower() == 'vpn': - yield Result( - state=State.OK, - summary=f'VPN Connections/VPN Throughput: {entry["asgVpnConn"]:d}/{entry["asgVpnThroughput"]:d}' - ) register.snmp_section( diff --git a/checkpoint_asg_smo_counters.mkp b/checkpoint_asg_smo_counters.mkp index 12a3e8c8a121b008617504a9f0b1343b8d0323d2..4dd5a4a8ae1485f815bd9b8637e39ed3171fea9d 100644 Binary files a/checkpoint_asg_smo_counters.mkp and b/checkpoint_asg_smo_counters.mkp differ diff --git a/packages/checkpoint_asg_smo_counters b/packages/checkpoint_asg_smo_counters index aa77eade9e4db47493b64b0eb02dbe25c70b7b4c..9d0e3be02b815bb0e1e80fe9a3777052eed21ca4 100644 --- a/packages/checkpoint_asg_smo_counters +++ b/packages/checkpoint_asg_smo_counters @@ -1,11 +1,12 @@ {'author': 'Th.L. (thl-cmk[at]outlook[dot]com)', 'description': 'Monitor Check Point Maestro SMO performance counters\n', 'download_url': 'http://thl-cmk.hopto.org/', - 'files': {'agent_based': ['checkpoint_asg_smo_counters.py']}, + 'files': {'agent_based': ['checkpoint_asg_smo_counters.py'], + 'web': ['plugins/metrics/checkpoint_asg_smo_counters.py']}, 'name': 'checkpoint_asg_smo_counters', - 'num_files': 1, + 'num_files': 2, 'title': 'Check Point Maestro SMO performance counters', - 'version': '20210910.v0.2', + 'version': '20210911.v0.2a', 'version.min_required': '2.0.0', 'version.packaged': '2021.07.14', 'version.usable_until': None} \ No newline at end of file diff --git a/web/plugins/metrics/checkpoint_asg_smo_counters.py b/web/plugins/metrics/checkpoint_asg_smo_counters.py new file mode 100644 index 0000000000000000000000000000000000000000..c59c14d0eb90196ca9b211f23a02574c88331d9d --- /dev/null +++ b/web/plugins/metrics/checkpoint_asg_smo_counters.py @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# + +from cmk.gui.i18n import _ + +from cmk.gui.plugins.metrics import ( + metric_info, + graph_info, + perfometer_info, +) + +metric_info['checkpoint_asg_smo_counters_concurr_conn'] = { + 'title': _('Connections'), + 'unit': 'count', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_accel_concurr_conn'] = { + 'title': _('Connections Accelerated'), + 'unit': 'count', + 'color': '32/a', +} +metric_info['checkpoint_asg_smo_counters_non_accel_concurr_conn'] = { + 'title': _('Connections non Accelerated'), + 'unit': 'count', + 'color': '16/a', +} + +metric_info['checkpoint_asg_smo_counters_connection_rate'] = { + 'title': _('Connection Rate'), + 'unit': '1/s', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_accel_connection_rate'] = { + 'title': _('Connection Rate Accelerated'), + 'unit': '1/s', + 'color': '32/a', +} +metric_info['checkpoint_asg_smo_counters_non_accel_connection_rate'] = { + 'title': _('Connection Rate non Accelerated'), + 'unit': '1/s', + 'color': '16/a', +} + +metric_info['checkpoint_asg_smo_counters_load'] = { + 'title': _('Load'), + 'unit': '%', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_accel_load_max'] = { + 'title': _('Accel load (max)'), + 'unit': '%', + 'color': '31/a', +} +metric_info['checkpoint_asg_smo_counters_accel_load_avg'] = { + 'title': _('Accel load (avg)'), + 'unit': '%', + 'color': '16/a', +} +metric_info['checkpoint_asg_smo_counters_accel_load_min'] = { + 'title': _('Accel load (min)'), + 'unit': '%', + 'color': '11/a', +} + +metric_info['checkpoint_asg_smo_counters_instances_load_avg'] = { + 'title': _('Instances load (avg)'), + 'unit': '%', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_instances_load_min'] = { + 'title': _('Instances load (min)'), + 'unit': '%', + 'color': '32/a', +} +metric_info['checkpoint_asg_smo_counters_instances_load_max'] = { + 'title': _('Instances load (max)'), + 'unit': '%', + 'color': '16/a', +} + +metric_info['checkpoint_asg_smo_counters_nat_conn'] = { + 'title': _('NAT connections'), + 'unit': 'count', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_nat_conn_rate'] = { + 'title': _('NAT Conn Rate'), + 'unit': '1/s', + 'color': '32/a', +} + +metric_info['checkpoint_asg_smo_counters_vpn_conn'] = { + 'title': _('VPN connections'), + 'unit': 'count', + 'color': '26/a', +} +metric_info['checkpoint_asg_smo_counters_vpn_throughput'] = { + 'title': _('VPN Throughput'), + 'unit': 'bytes/s', + 'color': '32/a', +} + +metric_info['checkpoint_asg_smo_counters_throughput'] = { + 'title': _('Throughput'), + 'unit': 'bytes/s', + 'color': '26/a', +} + +metric_info['checkpoint_asg_smo_counters_packet_rate'] = { + 'title': _('Packet Rate'), + 'unit': '1/s', + 'color': '26/a', +} + +graph_info['checkpoint_asg_smo_counters_connections'] = { + 'title': _('Check Point SMO Concurrent Connections'), + 'metrics': [ + ('checkpoint_asg_smo_counters_non_accel_concurr_conn', 'line'), + ('checkpoint_asg_smo_counters_accel_concurr_conn', 'line'), + ('checkpoint_asg_smo_counters_concurr_conn', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_concurr_conn:max'), +} + +graph_info['checkpoint_asg_smo_counters_connection_rate'] = { + 'title': _('Check Point SMO Counter Connection Rate'), + 'metrics': [ + ('checkpoint_asg_smo_counters_non_accel_connection_rate', 'line'), + ('checkpoint_asg_smo_counters_accel_connection_rate', 'line'), + ('checkpoint_asg_smo_counters_connection_rate', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_connection_rate:max'), +} + +graph_info['checkpoint_asg_smo_counters_accel_load'] = { + 'title': _('Check Point SMO Counter Load'), + 'metrics': [ + ('checkpoint_asg_smo_counters_accel_load_min', 'line'), + ('checkpoint_asg_smo_counters_accel_load_avg', 'line'), + ('checkpoint_asg_smo_counters_accel_load_max', 'line'), + ('checkpoint_asg_smo_counters_load', 'area'), + ], + 'range': (0, 110), +} + +graph_info['checkpoint_asg_smo_counters_instances_load'] = { + 'title': _('Check Point SMO Counter Instances Load'), + 'metrics': [ + ('checkpoint_asg_smo_counters_instances_load_min', 'line'), + ('checkpoint_asg_smo_counters_instances_load_avg', 'area'), + ('checkpoint_asg_smo_counters_instances_load_max', 'line'), + ], + 'range': (0, 110), +} + +graph_info['checkpoint_asg_smo_counters_nat_conn'] = { + 'title': _('Check Point SMO Counter NAT connections'), + 'metrics': [ + ('checkpoint_asg_smo_counters_nat_conn', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_nat_conn:max'), +} +graph_info['checkpoint_asg_smo_counters_nat_conn_rate'] = { + 'title': _('Check Point SMO Counter NAT connection rate'), + 'metrics': [ + ('checkpoint_asg_smo_counters_nat_conn_rate', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_nat_conn_rate:max'), +} + +graph_info['checkpoint_asg_smo_counters_vpn_conn'] = { + 'title': _('Check Point SMO Counter VPN connections'), + 'metrics': [ + ('checkpoint_asg_smo_counters_vpn_conn', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_vpn_conn:max'), +} +graph_info['checkpoint_asg_smo_counters_vpn_throughput'] = { + 'title': _('Check Point SGM Counter VPN Throughput'), + 'metrics': [ + ('checkpoint_asg_smo_counters_vpn_throughput', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_vpn_throughput:max'), +} + +graph_info['checkpoint_asg_smo_counters_throughput'] = { + 'title': _('Check Point SGM Counter Throughput'), + 'metrics': [ + ('checkpoint_asg_smo_counters_throughput', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_throughput:max'), +} + +graph_info['checkpoint_asg_smo_counters_packet_rate'] = { + 'title': _('Check Point SMO Counter Packet Rate'), + 'metrics': [ + ('checkpoint_asg_smo_counters_packet_rate', 'area'), + ], + 'range': (0, 'checkpoint_asg_smo_counters_packet_rate:max'), +} + + +perfometer_info.append(('stacked', [ + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_accel_concurr_conn', + 'half_value': 100000.0, + 'exponent': 2, + }, + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_non_accel_concurr_conn', + 'half_value': 100000.0, + 'exponent': 2, + }, +])) + +perfometer_info.append(('stacked', [ + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_accel_connection_rate', + 'half_value': 10000.0, + 'exponent': 2, + }, + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_non_accel_connection_rate', + 'half_value': 10000.0, + 'exponent': 2, + }, +])) + +perfometer_info.append({ + 'type': 'linear', + 'segments': ['checkpoint_asg_smo_counters_accel_load_avg'], + 'total': 100, +}) + +perfometer_info.append({ + 'type': 'linear', + 'segments': ['checkpoint_asg_smo_counters_instances_load_avg'], + 'total': 100, +}) + +perfometer_info.append(('stacked', [ + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_nat_conn', + 'half_value': 10000.0, + 'exponent': 2, + }, + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_nat_conn_rate', + 'half_value': 500.0, + 'exponent': 2, + }, +])) + +perfometer_info.append(('stacked', [ + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_vpn_conn', + 'half_value': 500.0, + 'exponent': 2, + }, + { + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_vpn_throughput', + 'half_value': 2592000.0, + 'exponent': 2, + }, +])) + +perfometer_info.append({ + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_throughput', + 'half_value': 500.0, + 'exponent': 2, +}) + +perfometer_info.append({ + 'type': 'logarithmic', + 'metric': 'checkpoint_asg_smo_counters_packet_rate', + 'half_value': 100000.0, + 'exponent': 2, +})