Example #1
0
 def process_request(self, request):
     request.__e_processed_exception__ = False
     request.__traceback__ = None
     environ = request.environ
     environ['errormator.request_id'] = str(uuid.uuid4())
     # inject client instance reference to environ
     if 'errormator.client' not in environ:
         environ['errormator.client'] = self.errormator_client
     environ['errormator.post_vars'] = request.POST
     request.__start_time__ = default_timer()
     return None
 def process_request(self, request):
     request.__e_processed_exception__ = False
     request.__traceback__ = None
     environ = request.environ
     environ['errormator.request_id'] = str(uuid.uuid4())
     # inject client instance reference to environ
     if 'errormator.client' not in environ:
         environ['errormator.client'] = self.errormator_client
     environ['errormator.post_vars'] = request.POST
     request.__start_time__ = default_timer()
     return None
 def process_request(self, request):
     request.__e_processed_exception__ = False
     request.__traceback__ = None
     environ = request.environ
     environ['errormator.request_id'] = str(uuid.uuid4())
     # inject client instance reference to environ
     if 'errormator.client' not in environ:
         environ['errormator.client'] = self.errormator_client
     environ['errormator.post_vars'] = request.POST
     errormator_storage = get_local_storage(local_timing)
     # clear out thread stats on request start
     errormator_storage.clear()
     request.__start_time__ = default_timer()
     return None
 def process_request(self, request):
     request.__e_processed_exception__ = False
     request.__traceback__ = None
     environ = request.environ
     environ['errormator.request_id'] = str(uuid.uuid4())
     # inject client instance reference to environ
     if 'errormator.client' not in environ:
         environ['errormator.client'] = self.errormator_client
     environ['errormator.post_vars'] = request.POST
     errormator_storage = get_local_storage(local_timing)
     # clear out thread stats on request start
     errormator_storage.clear()
     request.__start_time__ = default_timer()
     return None
Example #5
0
    def process_response(self, request, response):
        try:
            return response
        finally:
            if self.errormator_client.config.get('enabled'):
                end_time = default_timer()
                environ = request.environ
                user = getattr(request, 'user', None)
                if user:
                    environ['errormator.username'] = unicode(user.id)
                if (response.status_code == 404
                        and not request.__e_processed_exception__):
                    self.process_exception(request, Http404())
                delta = timedelta(seconds=(end_time - request.__start_time__))
                errormator_storage = get_local_storage(local_timing)
                errormator_storage.thread_stats[
                    'main'] = end_time - request.__start_time__
                stats, slow_calls = errormator_storage.get_thread_stats()
                errormator_storage.clear()
                # report slowness
                self.errormator_client.save_request_stats(stats)
                if self.errormator_client.config['slow_requests']:
                    # do we have slow calls ?
                    if (delta >=
                            self.errormator_client.config['slow_request_time']
                            or slow_calls):
                        self.errormator_client.py_slow_report(
                            environ,
                            datetime.utcfromtimestamp(request.__start_time__),
                            datetime.utcfromtimestamp(end_time),
                            slow_calls,
                            request_stats=stats)
                        # force log fetching
                        request.__traceback__ = True

                if self.errormator_client.config['logging']:
                    records = self.errormator_client.log_handler.get_records()
                    self.errormator_client.log_handler.clear_records()
                    self.errormator_client.py_log(
                        environ,
                        records=records,
                        r_uuid=environ['errormator.request_id'],
                        traceback=request.__traceback__)
                    # send all data we gathered immediately at the
                    # end of request
                self.errormator_client.check_if_deliver(
                    self.errormator_client.config['force_send']
                    or environ.get('errormator.force_send'))
    def process_response(self, request, response):
        try:
            return response
        finally:
            if self.errormator_client.config.get('enabled'):
                end_time = default_timer()
                environ = request.environ
                user = getattr(request, 'user', None)
                if user:
                    environ['errormator.username'] = unicode(user.id)
                if (response.status_code == 404 and
                        not request.__e_processed_exception__):
                    self.process_exception(request, Http404())
                delta = timedelta(
                    seconds=(end_time - request.__start_time__))
                errormator_storage = get_local_storage(local_timing)
                errormator_storage.thread_stats[
                    'main'] = end_time - request.__start_time__
                stats, slow_calls = errormator_storage.get_thread_stats()
                errormator_storage.clear()
                # report slowness
                self.errormator_client.save_request_stats(stats)
                if self.errormator_client.config['slow_requests']:
                    # do we have slow calls ?
                    if (delta >= self.errormator_client.config[
                        'slow_request_time'] or slow_calls):
                        self.errormator_client.py_slow_report(
                            environ,
                            datetime.utcfromtimestamp(request.__start_time__),
                            datetime.utcfromtimestamp(end_time),
                            slow_calls,
                            request_stats=stats)
                        # force log fetching
                        request.__traceback__ = True

                if self.errormator_client.config['logging']:
                    records = self.errormator_client.log_handler.get_records()
                    self.errormator_client.log_handler.clear_records()
                    self.errormator_client.py_log(
                        environ, records=records,
                        r_uuid=environ['errormator.request_id'],
                        traceback=request.__traceback__)
                    # send all data we gathered immediately at the
                    # end of request
                self.errormator_client.check_if_deliver(
                    self.errormator_client.config['force_send'] or
                    environ.get('errormator.force_send'))
Example #7
0
    def __call__(self, environ, start_response):
        """Run the application and conserve the traceback frames.
        also determine if we got 404
        """
        environ['errormator.request_id'] = str(uuid.uuid4())

        app_iter = None
        detected_data = []
        traceback = None
        start_time = default_timer()

        def detect_headers(status, headers, *k, **kw):
            detected_data[:] = status[:3], headers
            return start_response(status, headers, *k, **kw)

        # inject client instance reference to environ
        if 'errormator.client' not in environ:
            environ['errormator.client'] = self.errormator_client
            # some bw. compat stubs

            def local_report(message, include_traceback=True,
                             http_status=200):
                environ['errormator.force_send'] = True

            def local_log(level, message):
                environ['errormator.force_send'] = True

            environ['errormator.report'] = local_report
            environ['errormator.log'] = local_log

        try:
            app_iter = self.app(environ, detect_headers)
            return app_iter
        except Exception as exc:
            if hasattr(app_iter, 'close'):
                app_iter.close()
                # we need that here

            traceback = get_current_traceback(skip=1, show_hidden_frames=True,
                                              ignore_system_exceptions=True)
            # by default reraise exceptions for app/FW to handle
            if self.errormator_client.config['reraise_exceptions']:
                raise
            try:
                start_response('500 INTERNAL SERVER ERROR',
                               [('Content-Type', 'text/html; charset=utf-8')])
            except Exception as exc:
                environ['wsgi.errors'].write(
                    'ErrormatorWSGIWrapper middleware catched exception '
                    'in streamed response at a point where response headers '
                    'were already sent.\n')
            else:
                return 'Server Error'
        finally:
            # report 500's and 404's
            # report slowness
            end_time = default_timer()
            errormator_storage = get_local_storage(local_timing)
            errormator_storage.thread_stats['main'] = end_time - start_time
            stats, slow_calls = errormator_storage.get_thread_stats()
            errormator_storage.clear()
            if 'errormator.__traceback' in environ:
                # get traceback gathered by tween
                traceback = environ['errormator.__traceback']
                del environ['errormator.__traceback']
            if traceback and self.errormator_client.config['report_errors']:
                http_status = 500
            elif (self.errormator_client.config['report_404'] and
                      detected_data and detected_data[0] == '404'):
                http_status = int(detected_data[0])
            else:
                http_status = None
            if http_status:
                self.errormator_client.py_report(
                    environ, traceback,
                    message=None,
                    http_status=http_status,
                    start_time=datetime.datetime.utcfromtimestamp(
                        start_time),
                    request_stats=stats)
                # dereference
                del traceback
                traceback = True
            delta = datetime.timedelta(seconds=(end_time - start_time))
            self.errormator_client.save_request_stats(stats)
            if self.errormator_client.config['slow_requests']:
                # do we have slow calls ?
                if (delta >= self.errormator_client.config['slow_request_time']
                    or slow_calls):
                    self.errormator_client.py_slow_report(
                        environ,
                        datetime.datetime.utcfromtimestamp(start_time),
                        datetime.datetime.utcfromtimestamp(end_time),
                        slow_calls,
                        request_stats=stats)
                    # force log fetching
                    traceback = True
            if self.errormator_client.config['logging']:
                records = self.errormator_client.log_handler.get_records()
                self.errormator_client.log_handler.clear_records()
                self.errormator_client.py_log(
                    environ,
                    records=records,
                    r_uuid=environ[
                        'errormator.request_id'],
                    traceback=traceback)
                # send all data we gathered immediately at the end of request
            self.errormator_client.check_if_deliver(
                self.errormator_client.config['force_send'] or
                environ.get('errormator.force_send'))