def test_no_upstream_response_499_slow(self):
        # When the upstream didn't return because the user bailed, but it was a
        # slow request already, we should consider it a fail
        data_string = (
            "IP=10.215.222.128,"
            "TL=17/May/2011:06:32:10 -0400,"
            "DN=foo.bar.com,"
            "RQ=POST /i/51764/lock/ HTTP/1.1,"
            "HR=https://foo.bar.com/i/confirm/51764/,"
            "HU=Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1,"
            "CS=7f40318ada63a2efc3bb693a184a89ac,"
            "UT=-,"
            "RT=7.403,"
            "US=-,"
            "SC=499\n")

        data = NginxRequestTimesParser.parse_line(data_string)

        self.assertEqual(
            data['time'],
            datetime.datetime(
                year=2011, month=5, day=17, hour=6, minute=32, second=10))
        self.assertEqual(data['url'], '/i/51764/lock/')
        self.assertEqual(data['request_time'], 7.403)
        # Default time is 90 seconds if they bailed on a slow page
        self.assertEqual(data['upstream_response_time'], 90.0)
    def test_no_upstream_response(self):
        # When the upstream takes too long, Nginx returns a response quickly
        # and logs '-' as the upstream response
        data_string = (
            "IP=10.215.222.128,"
            "TL=17/May/2011:06:32:10 -0400,"
            "DN=foo.bar.com,"
            "RQ=POST /i/51764/lock/ HTTP/1.1,"
            "HR=https://foo.bar.com/i/confirm/51764/,"
            "HU=Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1,"
            "CS=7f40318ada63a2efc3bb693a184a89ac,"
            "UT=-,"
            "RT=0.403,"
            "US=403,"
            "SC=403\n")

        data = NginxRequestTimesParser.parse_line(data_string)

        self.assertEqual(
            data['time'],
            datetime.datetime(
                year=2011, month=5, day=17, hour=6, minute=32, second=10))
        self.assertEqual(data['url'], '/i/51764/lock/')
        self.assertEqual(data['request_time'], 0.403)
        # Default time is 90 seconds if they bail
        self.assertEqual(data['upstream_response_time'], 90.0)
    def test_no_upstream_response_499_fast(self):
        # When the upstream didn't return because the user bailed, and it was a
        # non-slow request, we should consider that a user action and mimick
        # the request time
        data_string = (
            "IP=10.215.222.128,"
            "TL=17/May/2011:06:32:10 -0400,"
            "DN=foo.bar.com,"
            "RQ=POST /i/51764/lock/ HTTP/1.1,"
            "HR=https://foo.bar.com/i/confirm/51764/,"
            "HU=Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1,"
            "CS=7f40318ada63a2efc3bb693a184a89ac,"
            "UT=-,"
            "RT=6.403,"
            "US=-,"
            "SC=499\n")

        data = NginxRequestTimesParser.parse_line(data_string)

        self.assertEqual(
            data['time'],
            datetime.datetime(
                year=2011, month=5, day=17, hour=6, minute=32, second=10))
        self.assertEqual(data['url'], '/i/51764/lock/')
        self.assertEqual(data['request_time'], 6.403)
        # Ensure we mimicked the request time
        self.assertEqual(data['upstream_response_time'], 6.403)
    def test_basic_parse(self):
        parsed_data = NginxRequestTimesParser.parse_file(FIXTURE_FP)

        # Ensure we have believable status codes
        count = 0
        for data in parsed_data:
            count += 1
            self.assertTrue(
                data['status'] in ['200', '403', '499'],
                "Status '%s' not in 200, 403 or 499" % data['status'])

        self.assertEqual(count, 14)
def dashboard(request):

    parsed_data = NginxRequestTimesParser.parse_file(
        settings.MO_REQUEST_TIMES_PATH)
    slow_threshold = getattr(settings, 'MO_SLOW_PAGE_SECONDS', 7.0)
    slow_pages = SlowPages(parsed_data, slow_threshold)
    slow_pages.run()

    context = dict(
        slow_pages=sorted(
            slow_pages.pages, key=lambda x: x.total_time, reverse=True))
    return render_to_response('mature_optimization/dashboard.html',
                              context, context_instance=RequestContext(request))
    def test_no_newline(self):
        data_string = (
            "IP=10.215.222.128,"
            "TL=17/May/2011:06:32:10 -0400,"
            "DN=foo.bar.com,"
            "RQ=POST /i/51764/lock/ HTTP/1.1,"
            "HR=https://foo.bar.com/i/confirm/51764/,"
            "HU=Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1,"
            "CS=7f40318ada63a2efc3bb693a184a89ac,"
            "UT=0.011,"
            "RT=0.403,"
            "US=403,"
            "SC=403")

        data = NginxRequestTimesParser.parse_line(data_string)

        self.assertEqual(
            data['time'],
            datetime.datetime(
                year=2011, month=5, day=17, hour=6, minute=32, second=10))
        self.assertEqual(data['url'], '/i/51764/lock/')
        self.assertEqual(data['request_time'], 0.403)
    def test_w_comma(self):
        # User agent has a comma
        data_string = (
            "IP=10.215.222.128,"
            "TL=17/May/2011:06:32:10 -0400,"
            "DN=foo.bar.com,"
            "RQ=POST /i/51764/lock/ HTTP/1.1,"
            "HR=https://foo.bar.com/i/confirm/51764/,"
            "HU=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.57 Safari/534.24,"
            "CS=7f40318ada63a2efc3bb693a184a89ac,"
            "UT=0.011,"
            "RT=0.403,"
            "US=403,"
            "SC=403\n")

        data = NginxRequestTimesParser.parse_line(data_string)

        self.assertEqual(
            data['time'],
            datetime.datetime(
                year=2011, month=5, day=17, hour=6, minute=32, second=10))
        self.assertEqual(data['url'], '/i/51764/lock/')
        self.assertEqual(data['request_time'], 0.403)