diff --git a/brian_polling_manager/cli.py b/brian_polling_manager/cli.py index f09828671d643231e864b861ad176c5c6616764c..48f4e82485d89aad665d9c1c92f7138883893827 100644 --- a/brian_polling_manager/cli.py +++ b/brian_polling_manager/cli.py @@ -29,6 +29,7 @@ from typing import Union import click import jsonschema +from statsd import StatsClient from brian_polling_manager import inventory, interfaces, environment @@ -60,7 +61,12 @@ _DEFAULT_CONFIG = { } }, 'statedir': '/tmp/', - 'logging': environment.DEFAULT_LOGGING_FILENAME + 'logging': environment.DEFAULT_LOGGING_FILENAME, + 'statsd': { + 'hostname': 'localhost', + 'port': 8125, + 'prefix': 'brian_polling' + } } CONFIG_SCHEMA = { @@ -102,6 +108,16 @@ CONFIG_SCHEMA = { }, 'required': ['api-base', 'token', 'interface-check'], 'additionalProperties': False + }, + 'statsd': { + 'type': 'object', + 'properties': { + 'hostname': {'type': 'string'}, + 'port': {'type': 'integer'}, + 'prefix': {'type': 'string'} + }, + 'required': ['hostname', 'port', 'prefix'], + 'additionalProperties': False } }, 'type': 'object', @@ -113,7 +129,8 @@ CONFIG_SCHEMA = { }, 'sensu': {'$ref': '#/definitions/sensu'}, 'statedir': {'type': 'string'}, - 'logging': {'type': 'string'} + 'logging': {'type': 'string'}, + 'statsd': {'$ref': '#/definitions/statsd'} }, 'required': ['inventory', 'sensu', 'statedir'], 'additionalProperties': False @@ -237,7 +254,16 @@ def main(config, force): state.last = last state.interfaces = inventory.load_interfaces(config['inventory']) - interfaces.refresh(config['sensu'], state) + statsd_config = config.get('statsd', None) + if statsd_config: + statsd = StatsClient( + host=statsd_config['hostname'], + port=statsd_config['port'], + prefix=statsd_config['prefix']) + else: + statsd = None + + interfaces.refresh(config['sensu'], state, statsd=statsd) if __name__ == '__main__': diff --git a/brian_polling_manager/interfaces.py b/brian_polling_manager/interfaces.py index cde5cef82dfc2ce39ae3a150661f9dfbf806a861..016a97319bb1d365b56fbc3f81a92b33397c8adb 100644 --- a/brian_polling_manager/interfaces.py +++ b/brian_polling_manager/interfaces.py @@ -68,22 +68,37 @@ def _checks_match(a, b) -> bool: return True -def refresh(sensu_params, state): + + +def refresh(sensu_params, state, statsd=None): ifc_checks = load_ifc_checks(sensu_params) + created = 0 + updated = 0 + interfaces = 0 for interface in state.interfaces: + interfaces += 1 + expected_check = _make_check( sensu_params['interface-check'], interface) expected_name = _check_name(interface) if expected_name not in ifc_checks: + created += 1 sensu.create_check(sensu_params, expected_check) elif not _checks_match(ifc_checks[expected_name], expected_check): + updated += 1 sensu.update_check(sensu_params, expected_check) wanted_checks = {_check_name(ifc) for ifc in state.interfaces} extra_checks = set(ifc_checks.keys()) - wanted_checks for name in extra_checks: sensu.delete_check(sensu_params, name) + + if statsd: + statsd.guage('checks', len(ifc_checks)) + statsd.guage('interfaces', interfaces) + statsd.guage('created', created) + statsd.guage('updated', updated)