##// END OF EJS Templates
exception_tracker: store request info if available.
marcink -
r4301:9712e26b default
parent child Browse files
Show More
@@ -34,7 +34,7 b" global_prefix = 'rhodecode'"
34 exc_store_dir_name = 'rc_exception_store_v1'
34 exc_store_dir_name = 'rc_exception_store_v1'
35
35
36
36
37 def exc_serialize(exc_id, tb, exc_type):
37 def exc_serialize(exc_id, tb, exc_type, extra_data=None):
38
38
39 data = {
39 data = {
40 'version': 'v1',
40 'version': 'v1',
@@ -44,6 +44,8 b' def exc_serialize(exc_id, tb, exc_type):'
44 'exc_message': tb,
44 'exc_message': tb,
45 'exc_type': exc_type,
45 'exc_type': exc_type,
46 }
46 }
47 if extra_data:
48 data.update(extra_data)
47 return msgpack.packb(data), data
49 return msgpack.packb(data), data
48
50
49
51
@@ -80,10 +82,20 b' def _store_exception(exc_id, exc_type_na'
80 """
82 """
81 Low level function to store exception in the exception tracker
83 Low level function to store exception in the exception tracker
82 """
84 """
85 from pyramid.threadlocal import get_current_request
83 import rhodecode as app
86 import rhodecode as app
87 request = get_current_request()
88 extra_data = {}
89 # NOTE(marcink): store request information into exc_data
90 if request:
91 extra_data['client_address'] = getattr(request, 'client_addr', '')
92 extra_data['user_agent'] = getattr(request, 'user_agent', '')
93 extra_data['method'] = getattr(request, 'method', '')
94 extra_data['url'] = getattr(request, 'url', '')
84
95
85 exc_store_path = get_exc_store()
96 exc_store_path = get_exc_store()
86 exc_data, org_data = exc_serialize(exc_id, exc_traceback, exc_type_name)
97 exc_data, org_data = exc_serialize(exc_id, exc_traceback, exc_type_name, extra_data=extra_data)
98
87 exc_pref_id = '{}_{}_{}'.format(exc_id, prefix, org_data['exc_timestamp'])
99 exc_pref_id = '{}_{}_{}'.format(exc_id, prefix, org_data['exc_timestamp'])
88 if not os.path.isdir(exc_store_path):
100 if not os.path.isdir(exc_store_path):
89 os.makedirs(exc_store_path)
101 os.makedirs(exc_store_path)
@@ -100,23 +112,20 b' def _store_exception(exc_id, exc_type_na'
100 send_email = send_email and mail_server
112 send_email = send_email and mail_server
101 if send_email:
113 if send_email:
102 try:
114 try:
103 send_exc_email(exc_id, exc_type_name)
115 send_exc_email(request, exc_id, exc_type_name)
104 except Exception:
116 except Exception:
105 log.exception('Failed to send exception email')
117 log.exception('Failed to send exception email')
106 pass
118 pass
107
119
108
120
109 def send_exc_email(exc_id, exc_type_name):
121 def send_exc_email(request, exc_id, exc_type_name):
110 import rhodecode as app
122 import rhodecode as app
111 from pyramid.threadlocal import get_current_request
112 from rhodecode.apps._base import TemplateArgs
123 from rhodecode.apps._base import TemplateArgs
113 from rhodecode.lib.utils2 import aslist
124 from rhodecode.lib.utils2 import aslist
114 from rhodecode.lib.celerylib import run_task, tasks
125 from rhodecode.lib.celerylib import run_task, tasks
115 from rhodecode.lib.base import attach_context_attributes
126 from rhodecode.lib.base import attach_context_attributes
116 from rhodecode.model.notification import EmailNotificationModel
127 from rhodecode.model.notification import EmailNotificationModel
117
128
118 request = get_current_request()
119
120 recipients = aslist(app.CONFIG.get('exception_tracker.send_email_recipients', ''))
129 recipients = aslist(app.CONFIG.get('exception_tracker.send_email_recipients', ''))
121 log.debug('Sending Email exception to: `%s`', recipients or 'all super admins')
130 log.debug('Sending Email exception to: `%s`', recipients or 'all super admins')
122
131
@@ -6,8 +6,17 b''
6 % if c.traceback:
6 % if c.traceback:
7
7
8 <h4>${_('Exception `{}` generated on UTC date: {}').format(c.traceback.get('exc_type', 'NO_TYPE'), c.traceback.get('exc_utc_date', 'NO_DATE'))}</h4>
8 <h4>${_('Exception `{}` generated on UTC date: {}').format(c.traceback.get('exc_type', 'NO_TYPE'), c.traceback.get('exc_utc_date', 'NO_DATE'))}</h4>
9 % if c.traceback.get('url'):
10 Request:
11 <code>${c.traceback.get('method')} ${c.traceback.get('url')}</code><br/>
12 <code>${c.traceback.get('client_address')} ${c.traceback.get('user_agent')}</code>
13 <br/>
14 <br/>
15 % endif
16
9 <pre>${c.traceback.get('exc_message', 'NO_MESSAGE')}</pre>
17 <pre>${c.traceback.get('exc_message', 'NO_MESSAGE')}</pre>
10
18
19
11 % else:
20 % else:
12 ${_('Unable to Read Exception. It might be removed or non-existing.')}
21 ${_('Unable to Read Exception. It might be removed or non-existing.')}
13 % endif
22 % endif
General Comments 0
You need to be logged in to leave comments. Login now