|
| 1 | +#!/usr/bin/env python3 |
| 2 | +# Copyright (C) 2019 Checkmk GmbH - License: GNU General Public License v2 |
| 3 | +# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and |
| 4 | +# conditions defined in the file COPYING, which is part of this source code package. |
| 5 | + |
| 6 | +""" |
| 7 | +Kuhn & Rueß GmbH |
| 8 | +Consulting and Development |
| 9 | +https://kuhn-ruess.de |
| 10 | +""" |
| 11 | + |
| 12 | +from collections.abc import Mapping |
| 13 | +from json import loads |
| 14 | +from typing import Any, NamedTuple |
| 15 | + |
| 16 | +from cmk.agent_based.v2 import ( |
| 17 | + AgentSection, |
| 18 | + check_levels, |
| 19 | + CheckPlugin, |
| 20 | + CheckResult, |
| 21 | + DiscoveryResult, |
| 22 | + Service, |
| 23 | + StringTable, |
| 24 | +) |
| 25 | + |
| 26 | +# <<<graylog_alerts>>> |
| 27 | +# {"alerts": {"num_of_events": 547, "num_of_alerts": 4}} |
| 28 | + |
| 29 | +# <<<graylog_alerts>>> |
| 30 | +# {"alerts": {"num_of_events": 5, "num_of_alerts": 0}} |
| 31 | + |
| 32 | + |
| 33 | +class AlertsInfo(NamedTuple): |
| 34 | + num_of_events: int |
| 35 | + num_of_alerts: int |
| 36 | + |
| 37 | + |
| 38 | +def parse_graylog_alerts(string_table: StringTable) -> AlertsInfo | None: |
| 39 | + """ |
| 40 | + Parse JSON data to AlertsInfo |
| 41 | + """ |
| 42 | + alerts_section = loads(string_table[0][0]) |
| 43 | + |
| 44 | + if len(alerts_section) != 1: |
| 45 | + return None |
| 46 | + |
| 47 | + alerts_data = alerts_section.get("alerts") |
| 48 | + |
| 49 | + return AlertsInfo( |
| 50 | + num_of_events=alerts_data.get("num_of_events"), |
| 51 | + num_of_alerts=alerts_data.get("num_of_alerts"), |
| 52 | + ) |
| 53 | + |
| 54 | + |
| 55 | +agent_section_graylog_alerts = AgentSection( |
| 56 | + name="graylog_alerts", |
| 57 | + parse_function=parse_graylog_alerts, |
| 58 | +) |
| 59 | + |
| 60 | + |
| 61 | +def discover_graylog_alerts(section: AlertsInfo) -> DiscoveryResult: |
| 62 | + """ |
| 63 | + Discover one service |
| 64 | + """ |
| 65 | + if section: |
| 66 | + yield Service(item=None) |
| 67 | + |
| 68 | + |
| 69 | +def check_graylog_alerts(params: Mapping[str, Any], section: AlertsInfo) -> CheckResult: |
| 70 | + for which in ["alerts", "events"]: |
| 71 | + yield from check_levels( |
| 72 | + value=(section._asdict())[f"num_of_{which}"], |
| 73 | + levels_upper=params.get(f"{which}_upper", None), |
| 74 | + levels_lower=params.get(f"{which}_lower", None), |
| 75 | + metric_name=f"graylog_{which}", |
| 76 | + render_func=lambda x: str(int(x)), |
| 77 | + label=f"Total number of {which}", |
| 78 | + ) |
| 79 | + |
| 80 | + |
| 81 | +check_plugin_graylog_alerts = CheckPlugin( |
| 82 | + name="graylog_alerts", |
| 83 | + sections=["graylog_alerts"], |
| 84 | + service_name="Graylog Cluster Alerts", |
| 85 | + discovery_function=discover_graylog_alerts, |
| 86 | + check_function=check_graylog_alerts, |
| 87 | + check_default_parameters={}, |
| 88 | + check_ruleset_name="graylog_alerts", |
| 89 | +) |
0 commit comments