From aca61c1e56de0f7788e1fcdceef80b6ca3fbc671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 13 Aug 2018 14:47:21 +0200 Subject: [PATCH 1/2] general: don't log anything for connectors that are down (#25611) --- passerelle/base/models.py | 24 ++++++++++-------- tests/__init__.py | 0 tests/test_generic_endpoint.py | 3 ++- tests/test_proxylogger.py | 46 +++++++++++++++++++++++++++------- 4 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 tests/__init__.py diff --git a/passerelle/base/models.py b/passerelle/base/models.py index aec872b..a10e9f2 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -141,7 +141,7 @@ class BaseResource(models.Model): def __init__(self, *args, **kwargs): super(BaseResource, self).__init__(*args, **kwargs) - self.logger = ProxyLogger(self.log_level, self.get_connector_slug(), self.slug) + self.logger = ProxyLogger(connector=self) def __unicode__(self): return self.title @@ -238,6 +238,10 @@ class BaseResource(models.Model): resource_pk=self.pk).first() return current_status + def down(self): + status = self.get_availability_status() + return (status and status.down()) + def export_json(self): d = { '@type': 'passerelle-resource', @@ -477,22 +481,22 @@ class ResourceStatus(models.Model): class ProxyLogger(object): - def __init__(self, level, appname=None, slug=None): - self.appname = appname - self.slug = slug - if appname: - logger_name = 'passerelle.resource.%s.%s' % (self.appname, self.slug) - else: - logger_name = 'passerelle.resource' - + def __init__(self, connector): + self.connector = connector + self.appname = connector.get_connector_slug() + self.slug = connector.slug + logger_name = 'passerelle.resource.%s.%s' % (self.appname, self.slug) self._logger = logging.getLogger(logger_name) - self._logger.setLevel(level) + self._logger.setLevel(connector.log_level) @property def level(self): return self._logger.getEffectiveLevel() def _log(self, levelname, message, *args, **kwargs): + if self.connector.down(): + # don't log if the connector is known to be down + return levelno = getattr(logging, levelname) if self._logger.level <= levelno: diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_generic_endpoint.py b/tests/test_generic_endpoint.py index 4c16c1a..abf893f 100644 --- a/tests/test_generic_endpoint.py +++ b/tests/test_generic_endpoint.py @@ -84,7 +84,8 @@ def test_proxy_logger(mocked_get, caplog, app, arcgis): mocked_get.return_value = utils.FakedResponse(content=payload, status_code=200) # simple logger - logger = ProxyLogger('DEBUG') + arcgis.log_evel = 'DEBUG' + logger = ProxyLogger(connector=arcgis) logger.debug('this is a debug test') logger.info('this is an info test') diff --git a/tests/test_proxylogger.py b/tests/test_proxylogger.py index b48ed93..3bc2e40 100644 --- a/tests/test_proxylogger.py +++ b/tests/test_proxylogger.py @@ -1,37 +1,65 @@ import logging +import pytest +from httmock import all_requests, HTTMock + from passerelle.base.models import ProxyLogger, ResourceLog +from passerelle.apps.feeds.models import Feed + +from .test_availability import down_mock + + +@pytest.fixture +def connector(): + connector, created = Feed.objects.get_or_create(slug='some-slug') + connector.log_level = 'DEBUG' + connector.url = 'http://example.net/' + connector.save() + return connector -def test_proxy_logger_basic(db): - pr = ProxyLogger(level=u'DEBUG', appname=u'some-app', slug=u'some-slug') +def test_proxy_logger_basic(db, connector): + pr = ProxyLogger(connector) pr.debug(u'some message') rl_query = ResourceLog.objects.all() assert len(rl_query) == 1 rl = rl_query.first() assert rl.message == u'some message' assert rl.levelno == logging.DEBUG - assert rl.appname == u'some-app' + assert rl.appname == u'feeds' assert rl.slug == u'some-slug' -def test_proxy_logger_std_interpolation(db): - pr = ProxyLogger(level=u'DEBUG') +def test_proxy_logger_std_interpolation(db, connector): + ResourceLog.objects.all().delete() + pr = ProxyLogger(connector) pr.debug(u'some message %s', u'some var') rl_query = ResourceLog.objects.all() rl = rl_query.first() assert rl.message == u'some message some var' -def test_proxy_logger_dict_interpolation(db): - pr = ProxyLogger(level=u'DEBUG') +def test_proxy_logger_dict_interpolation(db, connector): + ResourceLog.objects.all().delete() + pr = ProxyLogger(connector) pr.debug(u'some message %(var_name)s', {u'var_name': u'some var'}) rl_query = ResourceLog.objects.all() rl = rl_query.first() assert rl.message == u'some message some var' -def test_proxy_logger_ignore(db): - pr = ProxyLogger(level=u'INFO') +def test_proxy_logger_ignore(db, connector): + ResourceLog.objects.all().delete() + connector.log_level = 'INFO' + pr = ProxyLogger(connector) + pr.debug(u'some message') + assert len(ResourceLog.objects.all()) == 0 + +def test_proxy_logger_ignore_when_down(db, connector): + with HTTMock(down_mock): # set connector as down + connector.availability() + assert connector.down() is True + ResourceLog.objects.all().delete() + pr = ProxyLogger(connector) pr.debug(u'some message') assert len(ResourceLog.objects.all()) == 0 -- 2.18.0