Ejemplo n.º 1
0
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('')
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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('')
Ejemplo n.º 4
0
def test_sanitize_url(self, url, sanitized):
    self.assertEqual(sanitize_url(url), sanitized)