From 28f79d144ed730490352e58a4a2838192455d7cf Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 29 Aug 2022 13:42:07 +0200
Subject: [PATCH] =?UTF-8?q?Maily=20o=20chyb=C3=A1ch:=20Napojen=C3=AD=20na?=
=?UTF-8?q?=20joby?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #270.
---
mo/jobs/__init__.py | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/mo/jobs/__init__.py b/mo/jobs/__init__.py
index 56e68e5f..67bff065 100644
--- a/mo/jobs/__init__.py
+++ b/mo/jobs/__init__.py
@@ -4,14 +4,16 @@ from datetime import timedelta
import os
import shutil
from sqlalchemy import or_
+import sys
from typing import Optional, Dict, Callable, List
import mo
import mo.config as config
import mo.db as db
+import mo.email
import mo.rights
import mo.util
-from mo.util import logger
+from mo.util import logger, ExceptionInfo
def send_notify():
@@ -141,6 +143,8 @@ class TheJob:
job.out_file = None
sess.commit()
+ exc_info: ExceptionInfo = (None, None, None)
+
try:
self.gatekeeper = mo.rights.Gatekeeper(job.user)
self.expires_in_minutes = config.JOB_EXPIRATION
@@ -159,7 +163,8 @@ class TheJob:
logger.info(f'Job: Úspěšně dokončen job #{job.job_id} ({job.result})')
job.state = db.JobState.done
except Exception as e:
- logger.error(f'Job: Chyba při zpracování jobu #{job.job_id}: %s', e, exc_info=e)
+ exc_info = sys.exc_info()
+ logger.error(f'Job: Chyba při zpracování jobu #{job.job_id}: %s', e, exc_info=exc_info)
job.state = db.JobState.internal_error
job.result = 'Interní chyba, informujte prosím správce systému.'
@@ -168,6 +173,16 @@ class TheJob:
job.expires_at = job.finished_at + timedelta(minutes=self.expires_in_minutes)
sess.commit()
+ # Maily o interních chybách posíláme mimo transakci
+ if job.state == db.JobState.internal_error:
+ err_attrs = {
+ 'Job': f'#{job.job_id}',
+ 'Type': str(job.type),
+ 'User': f'#{job.user_id}',
+ 'Desc': job.description,
+ }
+ mo.email.send_internal_error_email(f'Job #{job.job_id}', err_attrs, exc_info)
+
def process_jobs():
sess = db.get_session()
--
GitLab