diff --git a/static/js/compose.js b/static/js/compose.js index 452a739e72..7aa64ae7a4 100644 --- a/static/js/compose.js +++ b/static/js/compose.js @@ -356,13 +356,14 @@ function send_message_ajax(request, success) { }); } -function report_send_time(send_time, receive_time) { +function report_send_time(send_time, receive_time, display_time) { $.ajax({ dataType: 'json', // This seems to be ignored. We still get back an xhr. url: '/json/report_send_time', type: 'POST', - data: {"time": send_time, - "received": receive_time} + data: {"time": send_time.toString(), + "received": receive_time.toString(), + "displayed": display_time.toString()} }); } @@ -389,7 +390,8 @@ function maybe_report_send_times(message_id) { return; } report_send_time(data.send_finished - data.start, - data.received - data.start); + data.received - data.start, + data.displayed - data.start); } exports.mark_end_to_end_receive_time = function (message_id) { @@ -400,6 +402,14 @@ exports.mark_end_to_end_receive_time = function (message_id) { maybe_report_send_times(message_id); }; +exports.mark_end_to_end_display_time = function (message_id) { + if (exports.send_times_data[message_id] === undefined) { + exports.send_times_data[message_id] = {}; + } + exports.send_times_data[message_id].displayed = new Date(); + maybe_report_send_times(message_id); +}; + function process_send_time(message_id, start_time) { var send_finished = new Date(); var send_time = (send_finished - start_time); diff --git a/static/js/zulip.js b/static/js/zulip.js index f06cf402c6..7140f87c44 100644 --- a/static/js/zulip.js +++ b/static/js/zulip.js @@ -636,6 +636,9 @@ function add_messages(messages, msg_list, messages_are_new) { _.each(messages, function (message) { if (message.sent_by_me) { compose.mark_end_to_end_receive_time(message.id); + setTimeout(function () { + compose.mark_end_to_end_display_time(message.id); + }, 0); } }); } diff --git a/zerver/views/__init__.py b/zerver/views/__init__.py index 593ff02298..f0650e3b99 100644 --- a/zerver/views/__init__.py +++ b/zerver/views/__init__.py @@ -1880,10 +1880,12 @@ if not (settings.DEBUG or settings.TEST_SUITE): @has_request_variables def json_report_send_time(request, user_profile, time=REQ(converter=to_non_negative_int), - received=REQ(converter=to_non_negative_int, default="(unknown)")): - logging.info("End-to-end send time: %dms/%dms (%s)" % (time, received, user_profile.email)) + received=REQ(converter=to_non_negative_int, default="(unknown)"), + displayed=REQ(converter=to_non_negative_int, default="(unknown)")): + logging.info("End-to-end send time: %sms/%sms/%sms (%s)" % (time, received, displayed, user_profile.email)) statsd.timing("endtoend.send_time.%s" % (statsd_key(user_profile.realm.domain),), time) statsd.timing("endtoend.receive_time.%s" % (statsd_key(user_profile.realm.domain),), received) + statsd.timing("endtoend.displayed_time.%s" % (statsd_key(user_profile.realm.domain),), displayed) return json_success() @authenticated_json_post_view