)]}'
{"swift/common/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b31bf53cf3b6171b590299fb60603ce6fe825fcc","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"            # .errors.timing is for failures that *are* Swift\u0027s fault."},{"line_number":1655,"context_line":"            # Examples include 507 for an unmounted drive or 500 for an"},{"line_number":1656,"context_line":"            # unhandled exception."},{"line_number":1657,"context_line":"            if not is_server_error(resp.status_int):"},{"line_number":1658,"context_line":"                ctrl.logger.timing_since(method + \u0027.timing\u0027,"},{"line_number":1659,"context_line":"                                         start_time, **dec_kwargs)"},{"line_number":1660,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_153ebfd9","line":1657,"updated":"2018-01-23 20:09:52.000000000","message":"I think the archeology suggests the operational experience that a rash of 401\u0027s indicates the external auth system maybe borked and ops may need to coordinate.  Perhaps that doesn\u0027t need to confuse our timing stats - but it\u0027s definitely different from other 4XX where we talked to a storage node or container ACL\u0027s and they said \"nope\"","commit_id":"079fdc805b8eb0c7774360c0f26517e027e80217"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2f081919893a7b125dc8f7cf04eeef411337cbc","unresolved":false,"context_lines":[{"line_number":1654,"context_line":"            # .errors.timing is for failures that *are* Swift\u0027s fault."},{"line_number":1655,"context_line":"            # Examples include 507 for an unmounted drive or 500 for an"},{"line_number":1656,"context_line":"            # unhandled exception."},{"line_number":1657,"context_line":"            if not is_server_error(resp.status_int):"},{"line_number":1658,"context_line":"                ctrl.logger.timing_since(method + \u0027.timing\u0027,"},{"line_number":1659,"context_line":"                                         start_time, **dec_kwargs)"},{"line_number":1660,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_70f071ca","line":1657,"in_reply_to":"7f96bb07_153ebfd9","updated":"2018-01-23 20:22:13.000000000","message":"Does this give us an indication of the *number* of requests, as well as the timing? Maybe it\u0027s worth breaking out to\n\n .timing                # for 2xx\n .errors.auth.timing    # for 401/403\n .errors.client.timing  # for non-auth-related 4xx\n .errors.server.timing\n\n\u003e the external auth system maybe borked and ops may need to coordinate\n\nI wonder if that may result in 503s, depending on how your auth is configured and the nature of the borkage... see https://github.com/openstack/keystonemiddleware/blob/4.21.0/keystonemiddleware/auth_token/__init__.py#L781","commit_id":"079fdc805b8eb0c7774360c0f26517e027e80217"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"04cf883688a33fa24c2ade81350522d4d83e8dc9","unresolved":false,"context_lines":[{"line_number":1667,"context_line":"            resp \u003d func(ctrl, *args, **kwargs)"},{"line_number":1668,"context_line":"            if server_handled_successfully(resp.status_int):"},{"line_number":1669,"context_line":"                ctrl.logger.timing_since(method + \u0027.timing\u0027,"},{"line_number":1670,"context_line":"                                         start_time, **dec_kwargs)"},{"line_number":1671,"context_line":"            else:"},{"line_number":1672,"context_line":"                ctrl.logger.timing_since(method + \u0027.errors.timing\u0027,"},{"line_number":1673,"context_line":"                                         start_time, **dec_kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_57bad86d","side":"PARENT","line":1670,"updated":"2018-01-31 03:28:21.000000000","message":"We could go one step further.. have our 2 buckets, `METHOD.timing` and `METHOD.errors.timing`. And then also break down the non server errors some more:\n\n  response_types \u003d {1: \u0027info\u0027, 2: \u0027success\u0027, 3: \u0027redirect\u0027, 4: \u0027client_error\u0027}\n  ctrl.logger.timing_since(method + response_types[resp.status_int / 100] + \u0027.timing\u0027, ...)\n\nBut that might be more confusing as then someone might assume METHOD.timing would include METHOD.error.timing.\nUness we want to turn it on it\u0027s head. METHOD.timing _is_ everything and then we have a bucket for each as a break down. Could make a nice looking graph :)","commit_id":"cbcbc774681ad1a90f8fd260787c29943bedb675"}]}
