From d6b13d15a42493eb8d43b34a4a0ca4e61dfa92a6 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 21 Jul 2021 15:48:41 +0200 Subject: [PATCH] base: do not log errors in check status (#45001) --- passerelle/base/models.py | 22 +++++++++++++++++++++- tests/test_misc.py | 14 ++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/passerelle/base/models.py b/passerelle/base/models.py index e6628880..a90374d5 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -10,6 +10,7 @@ import re import sys import traceback import uuid +from contextlib import contextmanager from django import VERSION from django.apps import apps @@ -27,6 +28,7 @@ from django.test import override_settings from django.urls import reverse from django.utils import six, timezone from django.utils.encoding import force_text +from django.utils.log import AdminEmailHandler from django.utils.six.moves.urllib.parse import urlparse from django.utils.text import slugify from django.utils.timezone import now @@ -482,7 +484,8 @@ class BaseResource(models.Model): availability_parameters = self.availability_parameters try: - self.check_status() + with self.logger.disable_admin_emails(): + self.check_status() status = 'up' message = '' except NotImplementedError: @@ -905,6 +908,23 @@ class ProxyLogger(object): def level(self): return self._logger.getEffectiveLevel() + @contextmanager + def disable_admin_emails(self): + mail_admin_handler = [ + handler for handler in self._logger.root.handlers if isinstance(handler, AdminEmailHandler) + ] + if mail_admin_handler: + mail_admin_handler = mail_admin_handler[0] + + previous_level = mail_admin_handler.level + mail_admin_handler.setLevel(logging.CRITICAL) + try: + yield + finally: + mail_admin_handler.setLevel(previous_level) + else: + yield + def _log(self, levelname, message, *args, **kwargs): force = kwargs.pop('force', False) if self.connector.down() and not force: diff --git a/tests/test_misc.py b/tests/test_misc.py index 05f2df94..a4dcd635 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -1,5 +1,6 @@ import datetime +import mock import pytest from django.contrib.contenttypes.models import ContentType from django.core.files import File @@ -9,8 +10,10 @@ from django.urls import reverse from django.utils import timezone from django.utils.six import StringIO from mock import patch +from requests.exceptions import ReadTimeout from test_manager import login +from passerelle.apps.base_adresse.models import BaseAdresse from passerelle.apps.clicrdv.models import ClicRdv from passerelle.apps.opengis.models import OpenGIS from passerelle.base.models import ResourceLog @@ -172,3 +175,14 @@ def test_jsonb_migration(transactional_db): CsvDataSource = apps.get_model(app, 'CsvDataSource') connector = CsvDataSource.objects.get(pk=pk) assert connector._dialect_options == data + + +def test_check_status_no_traceback_email(db, settings, email_handler, mailoutbox): + settings.ADMINS = [('admin', 'admin@example.net')] + connector = BaseAdresse.objects.create(slug='base-adresse') + + with mock.patch('requests.sessions.HTTPAdapter.send', autospec=True, side_effect=ReadTimeout('timeout')): + connector.availability() + assert len(mailoutbox) == 1 + assert 'is now down' in mailoutbox[0].subject + assert ResourceLog.objects.exists() -- 2.20.1