Projet

Général

Profil

0001-general-don-t-log-anything-for-connectors-that-are-d.patch

Frédéric Péters, 13 août 2018 15:06

Télécharger (5,67 ko)

Voir les différences:

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
passerelle/base/models.py
141 141

  
142 142
    def __init__(self, *args, **kwargs):
143 143
        super(BaseResource, self).__init__(*args, **kwargs)
144
        self.logger = ProxyLogger(self.log_level, self.get_connector_slug(), self.slug)
144
        self.logger = ProxyLogger(connector=self)
145 145

  
146 146
    def __unicode__(self):
147 147
        return self.title
......
238 238
                resource_pk=self.pk).first()
239 239
        return current_status
240 240

  
241
    def down(self):
242
        status = self.get_availability_status()
243
        return (status and status.down())
244

  
241 245
    def export_json(self):
242 246
        d = {
243 247
            '@type': 'passerelle-resource',
......
477 481

  
478 482
class ProxyLogger(object):
479 483

  
480
    def __init__(self, level, appname=None, slug=None):
481
        self.appname = appname
482
        self.slug = slug
483
        if appname:
484
            logger_name = 'passerelle.resource.%s.%s' % (self.appname, self.slug)
485
        else:
486
            logger_name = 'passerelle.resource'
487

  
484
    def __init__(self, connector):
485
        self.connector = connector
486
        self.appname = connector.get_connector_slug()
487
        self.slug = connector.slug
488
        logger_name = 'passerelle.resource.%s.%s' % (self.appname, self.slug)
488 489
        self._logger = logging.getLogger(logger_name)
489
        self._logger.setLevel(level)
490
        self._logger.setLevel(connector.log_level)
490 491

  
491 492
    @property
492 493
    def level(self):
493 494
        return self._logger.getEffectiveLevel()
494 495

  
495 496
    def _log(self, levelname, message, *args, **kwargs):
497
        if self.connector.down():
498
            # don't log if the connector is known to be down
499
            return
496 500
        levelno = getattr(logging, levelname)
497 501
        if self._logger.level <= levelno:
498 502

  
tests/test_generic_endpoint.py
84 84
    mocked_get.return_value = utils.FakedResponse(content=payload, status_code=200)
85 85

  
86 86
    # simple logger
87
    logger = ProxyLogger('DEBUG')
87
    arcgis.log_evel = 'DEBUG'
88
    logger = ProxyLogger(connector=arcgis)
88 89
    logger.debug('this is a debug test')
89 90
    logger.info('this is an info test')
90 91

  
tests/test_proxylogger.py
1 1
import logging
2 2

  
3
import pytest
4
from httmock import all_requests, HTTMock
5

  
3 6
from passerelle.base.models import ProxyLogger, ResourceLog
7
from passerelle.apps.feeds.models import Feed
8

  
9
from .test_availability import down_mock
10

  
11

  
12
@pytest.fixture
13
def connector():
14
    connector, created = Feed.objects.get_or_create(slug='some-slug')
15
    connector.log_level = 'DEBUG'
16
    connector.url = 'http://example.net/'
17
    connector.save()
18
    return connector
4 19

  
5 20

  
6
def test_proxy_logger_basic(db):
7
    pr = ProxyLogger(level=u'DEBUG', appname=u'some-app', slug=u'some-slug')
21
def test_proxy_logger_basic(db, connector):
22
    pr = ProxyLogger(connector)
8 23
    pr.debug(u'some message')
9 24
    rl_query = ResourceLog.objects.all()
10 25
    assert len(rl_query) == 1
11 26
    rl = rl_query.first()
12 27
    assert rl.message == u'some message'
13 28
    assert rl.levelno == logging.DEBUG
14
    assert rl.appname == u'some-app'
29
    assert rl.appname == u'feeds'
15 30
    assert rl.slug == u'some-slug'
16 31

  
17 32

  
18
def test_proxy_logger_std_interpolation(db):
19
    pr = ProxyLogger(level=u'DEBUG')
33
def test_proxy_logger_std_interpolation(db, connector):
34
    ResourceLog.objects.all().delete()
35
    pr = ProxyLogger(connector)
20 36
    pr.debug(u'some message %s', u'some var')
21 37
    rl_query = ResourceLog.objects.all()
22 38
    rl = rl_query.first()
23 39
    assert rl.message == u'some message some var'
24 40

  
25 41

  
26
def test_proxy_logger_dict_interpolation(db):
27
    pr = ProxyLogger(level=u'DEBUG')
42
def test_proxy_logger_dict_interpolation(db, connector):
43
    ResourceLog.objects.all().delete()
44
    pr = ProxyLogger(connector)
28 45
    pr.debug(u'some message %(var_name)s', {u'var_name': u'some var'})
29 46
    rl_query = ResourceLog.objects.all()
30 47
    rl = rl_query.first()
31 48
    assert rl.message == u'some message some var'
32 49

  
33 50

  
34
def test_proxy_logger_ignore(db):
35
    pr = ProxyLogger(level=u'INFO')
51
def test_proxy_logger_ignore(db, connector):
52
    ResourceLog.objects.all().delete()
53
    connector.log_level = 'INFO'
54
    pr = ProxyLogger(connector)
55
    pr.debug(u'some message')
56
    assert len(ResourceLog.objects.all()) == 0
57

  
58
def test_proxy_logger_ignore_when_down(db, connector):
59
    with HTTMock(down_mock):  # set connector as down
60
        connector.availability()
61
    assert connector.down() is True
62
    ResourceLog.objects.all().delete()
63
    pr = ProxyLogger(connector)
36 64
    pr.debug(u'some message')
37 65
    assert len(ResourceLog.objects.all()) == 0
38
-