Skip to content
Snippets Groups Projects
Commit cd6d0838 authored by Bjarke Madsen's avatar Bjarke Madsen
Browse files

cleanup events for deleted checks

parent 29dece4c
No related branches found
No related tags found
No related merge requests found
...@@ -100,6 +100,9 @@ def refresh(config, force=False): ...@@ -100,6 +100,9 @@ def refresh(config, force=False):
} }
jsonschema.validate(result, REFRESH_RESULT_SCHEMA) # sanity jsonschema.validate(result, REFRESH_RESULT_SCHEMA) # sanity
# remove events for deleted checks, otherwise they stick around forever
sensu.clean_events(config['sensu'])
statsd_config = config.get('statsd', None) statsd_config = config.get('statsd', None)
if statsd_config: if statsd_config:
for key, counts in result.items(): for key, counts in result.items():
......
...@@ -5,6 +5,7 @@ import copy ...@@ -5,6 +5,7 @@ import copy
import logging import logging
import random import random
import requests import requests
from datetime import datetime
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -100,6 +101,38 @@ def checks_match(a, b) -> bool: ...@@ -100,6 +101,38 @@ def checks_match(a, b) -> bool:
return True return True
def clean_events(params, namespace='default'):
logger.info('cleaning events for deleted checks')
url = random.choice(params['api-base'])
r = requests.get(f'{url}/api/core/v2/namespaces/{namespace}/events',
headers={'Authorization': f'Key {params["api-key"]}'})
r.raise_for_status()
events = r.json()
all_checks = load_all_checks(params, namespace)
check_names = {c['metadata']['name'] for c in all_checks}
with requests.Session() as session:
session.headers.update({'Authorization': f'Key {params["api-key"]}'})
for event in events:
if event['check']['metadata']['name'] not in check_names:
last_execution = event['check']['executed']
days_since_last_execution = (datetime.utcnow() - datetime.fromtimestamp(last_execution)).days
if days_since_last_execution <= 1:
continue
logger.info(f'deleting event for deleted check: '
f'{event["check"]["metadata"]["name"]}'
f' (last execution: {days_since_last_execution} days ago)')
r = session.delete(
f'{url}/api/core/v2/namespaces/{namespace}/events/'
f'{event["entity"]["metadata"]["name"]}/'
f'{event["check"]["metadata"]["name"]}')
r.raise_for_status()
class AbstractCheck(object): class AbstractCheck(object):
""" """
not explicitly using abc.ABC ... more readable than stacks of decorators not explicitly using abc.ABC ... more readable than stacks of decorators
...@@ -230,7 +263,6 @@ def refresh(sensu_params, required_checks, current_checks): ...@@ -230,7 +263,6 @@ def refresh(sensu_params, required_checks, current_checks):
:param current_checks: dict of {name:check_dict} from sensu :param current_checks: dict of {name:check_dict} from sensu
:return: dict with change counts :return: dict with change counts
""" """
# cf. main.REFRESH_RESULT_SCHEMA # cf. main.REFRESH_RESULT_SCHEMA
result = { result = {
'checks': len(current_checks), 'checks': len(current_checks),
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
envlist = py36 envlist = py36
[flake8] [flake8]
max-line-length = 120
exclude = venv,.tox exclude = venv,.tox
[testenv] [testenv]
...@@ -12,7 +13,7 @@ deps = ...@@ -12,7 +13,7 @@ deps =
commands = commands =
coverage erase coverage erase
coverage run --source brian_polling_manager -m py.test {posargs} coverage run --source brian_polling_manager -m pytest {posargs}
coverage xml coverage xml
coverage html coverage html
coverage report coverage report
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment