error_notify: Drop any remaining browser-side errors in RabbitMQ queue.

This commit is contained in:
Alex Vandiver
2023-04-10 18:58:20 +00:00
committed by Tim Abbott
parent e536a14b61
commit daba72c116
3 changed files with 13 additions and 75 deletions

View File

@@ -40,67 +40,7 @@ def deployment_repr(report: Dict[str, Any]) -> str:
return deployment
def notify_browser_error(report: Dict[str, Any]) -> None:
report = defaultdict(lambda: None, report)
if settings.ERROR_BOT:
zulip_browser_error(report, settings.ERROR_BOT)
email_browser_error(report)
def email_browser_error(report: Dict[str, Any]) -> None:
user_info = user_info_str(report)
email_subject = f"Browser error for {user_info}"
body = f"User: {user_info}"
body += """\
Message:
{message}
Stacktrace:
{stacktrace}
IP address: {ip_address}
User agent: {user_agent}
href: {href}
Server path: {server_path}
Deployed server version: {server_version}
Web version: {web_version}
""".format(
**report
)
more_info = report["more_info"]
if more_info is not None:
body += "\nAdditional information:"
for key, value in more_info.items():
body += f"\n {key}: {value}"
body += "\n\nLog:\n{log}".format(**report)
mail_admins(email_subject, body)
def zulip_browser_error(report: Dict[str, Any], error_bot_email: str) -> None:
user_info = user_info_str(report)
email_subject = f"JS error: {user_info}"
body = f"User: {user_info}\n"
body += "Message: {message}\n".format(**report)
error_bot_realm = get_realm(settings.STAFF_SUBDOMAIN)
error_bot = get_system_bot(error_bot_email, error_bot_realm.id)
errors_stream = get_stream("errors", error_bot_realm)
internal_send_stream_message(
error_bot,
errors_stream,
format_email_subject(email_subject),
body,
)
def notify_server_error(report: Dict[str, Any]) -> None:
def do_report_error(report: Dict[str, Any]) -> None:
report = defaultdict(lambda: None, report)
email_server_error(report)
if settings.ERROR_BOT:
@@ -188,10 +128,3 @@ Error generated by {user_info}
{request_repr}"""
mail_admins(format_email_subject(email_subject), message, fail_silently=True)
def do_report_error(type: str, report: Dict[str, Any]) -> None:
if type == "browser":
notify_browser_error(report)
elif type == "server":
notify_server_error(report)

View File

@@ -118,7 +118,7 @@ class AdminNotifyHandlerTest(ZulipTestCase):
return record
def run_handler(self, record: logging.LogRecord) -> Dict[str, object]:
with patch("zerver.lib.error_notify.notify_server_error") as patched_notify:
with patch("zerver.worker.queue_processors.do_report_error") as patched_notify:
self.handler.emit(record)
patched_notify.assert_called_once()
return patched_notify.call_args[0][0]
@@ -210,7 +210,7 @@ class AdminNotifyHandlerTest(ZulipTestCase):
# Test the catch-all exception handler doesn't throw
with patch(
"zerver.lib.error_notify.notify_server_error", side_effect=Exception("queue error")
"zerver.worker.queue_processors.do_report_error", side_effect=Exception("queue error")
):
self.handler.emit(record)
with mock_queue_publish(

View File

@@ -830,11 +830,16 @@ class ErrorReporter(QueueProcessingWorker):
error_types = ["browser", "server"]
assert event["type"] in error_types
logging.info(
"Processing traceback with type %s for %s", event["type"], event.get("user_email")
)
if settings.ERROR_REPORTING:
do_report_error(event["type"], event["report"])
# Drop any old remaining browser-side errors; these now use
# Sentry.
if event["type"] == "browser":
return
if not settings.ERROR_REPORTING:
return
logging.info("Processing traceback for %s", event.get("user_email"))
do_report_error(event["report"])
@assign_queue("digest_emails")