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..de6322f3fa23ea84d3046448bd5ca364685755cc 100644 --- a/brian_polling_manager/interfaces.py +++ b/brian_polling_manager/interfaces.py @@ -68,22 +68,35 @@ 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) diff --git a/requirements.txt b/requirements.txt index ce85dbcd29a516b2fdd1b9899761f12b7345e3dc..14c092051717d2a1d81ef626c0e33e155083fb67 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ click jsonschema requests +statsd pytest responses diff --git a/setup.py b/setup.py index 05a2c7fe59e4194b93bc0674a74e406ac20c57db..cf6c751e088fecda7fd1a4f1df24acc0c80a578a 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,8 @@ setup( install_requires=[ 'click', 'requests', - 'jsonschema' + 'jsonschema', + 'statsd' ], entry_points={ 'console_scripts': [