diff --git a/check_mk-scality-ring/README.MD b/check_mk-scality-ring/README.MD new file mode 100644 index 0000000..bde66d9 --- /dev/null +++ b/check_mk-scality-ring/README.MD @@ -0,0 +1,9 @@ +This plugin monitors Scality Ring Supervisor through SNMP. +New checks added: +Ring Disks: Monitors the number of disks per ring. Parameters can be set for warn/crit if the number of disks reported is below a value. + +Ring Stage: Monitors the Ring Status. If the ring is not in Run State, service will be CRIT. + +Ring Storage: Storage used per Ring. Parameters can be set and the general filesystem parameters are used. + +Supervisor Status: Monitors the supervisor status and server status. If the supervisor is not available or any of the servers are not OK, the service goes CRIT. diff --git a/check_mk-scality-ring/ScalityRing-1.0.1.mkp b/check_mk-scality-ring/ScalityRing-1.0.1.mkp new file mode 100644 index 0000000..e2f3b0b Binary files /dev/null and b/check_mk-scality-ring/ScalityRing-1.0.1.mkp differ diff --git a/check_mk-scality-ring/local/share/check_mk/checks/scality b/check_mk-scality-ring/local/share/check_mk/checks/scality new file mode 100644 index 0000000..9032ccf --- /dev/null +++ b/check_mk-scality-ring/local/share/check_mk/checks/scality @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2 +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and +# conditions defined in the file COPYING, which is part of this source code package. + +# NOTE: Careful when replacing the *-import below with a more specific import. This can cause +# problems because it might remove variables from the check-context which are necessary for +# resolving legacy discovery results such as [("SUMMARY", "diskstat_default_levels")]. Furthermore, +# it might also remove variables needed for accessing discovery rulesets. +#from cmk.base.check_legacy_includes.cisco_sensor_item import * # pylint: disable=wildcard-import,unused-wildcard-import + + +def inventory_scality_disk(info): + for line in info[0]: + yield (line[0],{}) + +def check_scality_disk(item, params, info): + if params.get("disks"): + warn, crit = params["disks"] + for line in info[0]: + if item in line: + ringdisktotal = int(line[3]) + perfdata = [("Disks", ringdisktotal)] + infotext = "Number of disks: %s. " %ringdisktotal + if ringdisktotal <= warn: + if ringdisktotal <= crit: + infotext += "This is lower or equal with %s, critical level" %crit + yield 2, infotext, perfdata + else: + infotext += "This is lower or equal with %s, warning level" %warn + yield 1, infotext, perfdata + else: + yield 0, infotext, perfdata + + else: + for line in info[0]: + if item in line: + ringdisktotal = line[3] + perfdata = [("Disks", ringdisktotal)] + infotext = "Number of disks: %s" %ringdisktotal + yield 0, infotext, perfdata + +check_info["scality_ring.disk"] = { + "check_function": check_scality_disk, + "inventory_function": inventory_scality_disk, + "service_description": "Ring %s Disks", + "has_perfdata": True, + "group": "scality_disks" +} +##############RING STATUS############ +def inventory_scality_supervisor(info): + for line in info[1]: + yield (line[0],{}) + +def check_scality_supervisor(item, no_params, info): + for line in info[1]: + if item == str(line[0]): + infotext = "" + status = 0 + supNbSrvTotal = int(line[1]) + supNbSrvOk = int(line[2]) + supNbSrvNok = int(line[3]) + supAvailable = int(line[4]) + if supAvailable != 1 : + status = 2 + infotext += "Supervisor is not available" + yield status, infotext + else: + infotext = "Supervisor is available " + yield status, infotext + if supNbSrvNok > 0 : + status = 2 + infotext = "There are %s unavailable servers" %supNbSrvNok + yield status, infotext + else: + infotext = "All servers are available" + yield status, infotext + + + +check_info["scality_ring.supervisor"] = { + "check_function": check_scality_supervisor, + "inventory_function": inventory_scality_supervisor, + "service_description": "Supervisor %s", +} + + +#############Storage############# +from cmk.base.check_legacy_includes.df import * +from cmk.base.check_legacy_includes.size_trend import * +#factory_settings["filesystem_default_levels"] = FILESYSTEM_DEFAULT_LEVELS + +def inventory_scality_storage(info): + for line in info[0]: + yield (line[0],{}) + +def check_scality_storage(item, params, info): + for line in info[0]: + if item in line: + ringStorageAvailable = float(line[5]) + ringStorageTotal = float(line[6]) + fslist=[(item, ringStorageTotal, ringStorageAvailable, 0)] + return df_check_filesystem_list(item, params, fslist) + +check_info["scality_ring.storage"] = { + "check_function": check_scality_storage, + "inventory_function": inventory_scality_storage, + "service_description": "Ring %s Storage", + "default_levels_variable": "filesystem_default_levels", + "has_perfdata": True, + "group": "filesystem", +} + + +##############RING STATUS############ +def inventory_scality_ring(info): + for line in info[0]: + yield (line[0],{}) + +def check_scality_ring(item, no_params, info): + for line in info[0]: + if item in line: + ringstaterun = line[1] + ringstate = line[2] + if ringstate == "RUN": + status = 0 + text = "Ring is in Run State" + elif ringstate =="LOOP": + status = 2 + text = "Ring is LOOP State" + else: + status = 2 + text = "Ring is in Balancing State" + + yield status, text + + + +check_info["scality_ring"] = { + "check_function": check_scality_ring, + "inventory_function": inventory_scality_ring, + "service_description": "Ring %s State", + "snmp_info": [ + (".1.3.6.1.4.1.37489.2.1.1.1.4.1.1", + [ + "2", #ringName + "3", #ringStateRun + "8", #ringState + "9", #ringDiskTotal + "13", #ringStorageUsed + "14", #ringStorageAvailable + "15", #ringStorageTotal + ]), + (".1.3.6.1.4.1.37489.2.1.1.1.4.2.1", + [ + "2", #supName + "5", #supNbSrvTotal + "6", #supNbSrvOK + "7", #supNbSrvNok + "8", #supAvailable + ], + ), + ], + "snmp_scan_function": lambda oid: "scality" in oid(".1.3.6.1.2.1.1.1.0").lower(), +} + diff --git a/check_mk-scality-ring/local/share/check_mk/web/plugins/wato/scality_disks.py b/check_mk-scality-ring/local/share/check_mk/web/plugins/wato/scality_disks.py new file mode 100644 index 0000000..8222f23 --- /dev/null +++ b/check_mk-scality-ring/local/share/check_mk/web/plugins/wato/scality_disks.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2 +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and +# conditions defined in the file COPYING, which is part of this source code package. + +from cmk.gui.i18n import _ +from cmk.gui.plugins.wato.utils import ( + CheckParameterRulespecWithItem, + rulespec_registry, + RulespecGroupCheckParametersApplications, + Transform, +) +from cmk.gui.valuespec import Dictionary, Integer, Tuple, TextInput + +def _item_spec_scality_disks(): + return TextInput( + title=_("Ring"), help=_("Ring Name") + ) + + +def _parameter_valuespec_scality_disks(): + return Dictionary( + elements=[ + ( + "disks", + Tuple( + help=_( + "This rule sets lower limits for the number of disks in the " + "scality ring system and it's applied for each RING" + ), + title=_("Minimum number of disks:"), + elements=[ + Integer(title=_("Warning below")), + Integer(title=_("Critical below")), + ], + ), + ), + ], + ) + + +rulespec_registry.register( + CheckParameterRulespecWithItem( + check_group_name="scality_disks", + group=RulespecGroupCheckParametersApplications, + item_spec=_item_spec_scality_disks, + match_type="dict", + parameter_valuespec=_parameter_valuespec_scality_disks, + title=lambda: _("Scality Ring Disk Number"), + ) +)