Измерьте общее время сетевой передачи от сервлетов

Как измерить, как долго клиент должен ждать запроса.

На стороне сервера это просто, например, через фильтр. Но если мы хотим учесть общее время, включая задержку и передачу данных, это будет сложно.

можно ли получить доступ к базовому сокету, чтобы увидеть, когда запрос завершен? или нужно делать какие-то трюки с javascript? может быть, через синхронизацию часов между браузером и сервером? есть ли готовые сценарии javascript для этой задачи?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
2 018
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете установить 0-байтовый буфер отправки сокета (и я точно не рекомендую это), чтобы при блокирующем вызове HttpResponse.send () у вас было более точное представление о том, когда остался последний байт, но время в пути не учитывается. . Экк - меня тошнит даже от упоминания об этом. Вы можете сделать это в Tomcat с конкретными настройками коннектора. (Документация по Tomcat 6 Connector)

Или вы могли бы придумать какой-то подход с отметкой времени javascript, но я бы не ожидал установить часы клиента. Потребовалось бы сделать несколько обращений к веб-серверу.

  • запрос отметки времени
  • настоящий запрос
  • отчет о данных

И этот подход покроет задержку, хотя у вас все еще есть некоторая дисперсия джиттера.

Хммм ... интересная проблема у вас там. :)

Если вы хотите измерить его в своем браузере для имитации любого клиентского запроса, вы можете посмотреть вкладку net в firebug, чтобы узнать, сколько времени требуется для загрузки каждой части страницы и порядок загрузки.

Ответ принят как подходящий

Невозможно узнать, сколько времени клиенту пришлось ждать исключительно на стороне сервера. Вам понадобится JavaScript.

Вы не хотите синхронизировать часы клиента и сервера, это перебор. Просто измерьте время между тем, когда клиент делает запрос, и когда он заканчивает отображение своего ответа.

Если клиент AJAX, это может быть довольно просто: вызовите new Date (). GetTime (), чтобы получить время в миллисекундах, когда был сделан запрос, и сравнить его со временем после анализа результата. Затем отправьте эту информацию о времени на сервер в фоновом режиме.

Для приложения, отличного от AJAX, когда пользователь щелкает запрос, используйте JavaScript, чтобы отправить текущую метку времени (с точки зрения клиента) на сервер вместе с запросом и передать ту же метку времени обратно клиенту, когда полученная страница перезагружается. В обработчике onLoad этой страницы измерьте общее прошедшее время, а затем отправьте его обратно на сервер - либо используя XmlHttpRequest, либо добавив дополнительный аргумент к следующему запросу, сделанному серверу.

Проблема с этим подходом в том, что его нельзя прозрачно добавить к существующей реализации, отличной от ajax. будет сложно добавить дополнительный параметр даты к каждому сделанному запросу, но этот метод звучит так, как будто он действительно измеряет время весь, необходимое для перехода от клиент-сервер-клиент.

Andreas Petersson 18.09.2008 00:50

Вы можете обернуть объект HttpServletResponse и OutputStream, возвращаемый HttpServletResponse. Когда вывод начинает писать, вы можете установить startDate, а когда он останавливается (или когда он сбрасывается и т. д.), Вы можете установить stopDate.

Это можно использовать для расчета времени, которое потребовалось для потоковой передачи всех данных обратно клиенту.

Мы используем его в нашем приложении, и цифры кажутся разумными.

изменить: вы можете установить дату начала в ServletFilter, чтобы получить продолжительность ожидания клиента. Я дал вам время, необходимое для записи вывода клиенту.

но это не учитывает буфер сокета и задержку, о которой упоминает OP :(

Stu Thompson 17.09.2008 23:20

это выглядит многообещающе, я попробую.

Andreas Petersson 18.09.2008 00:39

просто попробовал это, и это не сработало. кажется, что байты в выходной поток записываются задолго до того, как они покидают физическую машину.

Andreas Petersson 23.09.2008 00:30

Ознакомьтесь с Jiffy-web, разработанным netflix, чтобы дать им более точное представление об общей странице -> время рендеринга страницы.

У меня такая же проблема. Но этот Бумага JavaOne мне очень помог решить эту проблему. Я бы попросил вас пройти через это, и он в основном использует javascript для расчета времени.

Другие вопросы по теме