def jserror(request): agent = request.META.get('HTTP_USER_AGENT', None) os = browser_name = browser_version = bot = TAG_UNKNOWN if agent: parsed_agent = httpagentparser.detect(agent) bot = parsed_agent.get('bot', False) if 'os' in parsed_agent: os = parsed_agent['os'].get('name', TAG_UNKNOWN) if 'browser' in parsed_agent: browser_version = parsed_agent['browser'].get( 'version', TAG_UNKNOWN) browser_name = parsed_agent['browser'].get('name', TAG_UNKNOWN) metrics_counter('commcare.jserror.count', tags={ 'os': os, 'browser_version': browser_version, 'browser_name': browser_name, 'url': sanitize_url(request.POST.get('page', None)), 'file': request.POST.get('filename'), 'bot': bot, }) return HttpResponse('')
def get_context(self, record): from corehq.util.metrics import metrics_counter try: request = record.request except Exception: request = None request_repr = get_sanitized_request_repr(request) tb_list = [] if record.exc_info: etype, _value, tb = record.exc_info value = clean_exception(_value) tb_list = ['Traceback (most recent call first):\n'] formatted_exception = traceback.format_exception_only(etype, value) tb_list.extend(formatted_exception) extracted_tb = list(reversed(traceback.extract_tb(tb))) tb_list.extend(traceback.format_list(extracted_tb)) stack_trace = '\n'.join(tb_list) subject = '%s: %s' % (record.levelname, formatted_exception[0].strip() if formatted_exception else record.getMessage()) else: stack_trace = 'No stack trace available' subject = '%s: %s' % (record.levelname, record.getMessage()) context = defaultdict(lambda: '') context.update({ 'subject': self.format_subject(subject), 'message': record.getMessage(), 'details': getattr(record, 'details', None), 'tb_list': tb_list, 'request_repr': request_repr, 'stack_trace': stack_trace, }) if request: sanitized_url = sanitize_url(request.build_absolute_uri()) metrics_counter('commcare.error.count', tags={ 'url': sanitized_url, 'group': get_url_group(sanitized_url), 'domain': getattr(request, 'domain', TAG_UNKNOWN), }) context.update({ 'get': list(request.GET.items()), 'post': SafeExceptionReporterFilter().get_post_parameters(request), 'method': request.method, 'username': request.user.username if getattr(request, 'user', None) else "", 'url': request.build_absolute_uri(), }) return context
def jserror(request): agent = request.META.get('HTTP_USER_AGENT', None) os = browser_name = browser_version = bot = TAG_UNKNOWN if agent: parsed_agent = httpagentparser.detect(agent) bot = parsed_agent.get('bot', False) if 'os' in parsed_agent: os = parsed_agent['os'].get('name', TAG_UNKNOWN) if 'browser' in parsed_agent: browser_version = parsed_agent['browser'].get( 'version', TAG_UNKNOWN) browser_name = parsed_agent['browser'].get('name', TAG_UNKNOWN) url = request.POST.get('page', None) domain = None if url: path = urlparse(url).path if path: domain = get_domain_from_url(path) domain = domain or '_unknown' metrics_counter('commcare.jserror.count', tags={ 'os': os, 'browser_version': browser_version, 'browser_name': browser_name, 'url': sanitize_url(url), 'bot': bot, 'domain': domain, }) notify_error(message=f'[JS] {request.POST.get("message")}', details={ 'message': request.POST.get('message'), 'domain': domain, 'page': url, 'file': request.POST.get('file'), 'line': request.POST.get('line'), 'stack': request.POST.get('stack'), 'meta': { 'os': os, 'browser_version': browser_version, 'browser_name': browser_name, 'bot': bot, } }) return HttpResponse('')
def test_sanitize_url(self, url, sanitized): self.assertEqual(sanitize_url(url), sanitized)