Как узнать время ответа HTTP-запроса через сокет

Я использую сокет Java, подключенный к серверу. Если я отправлю HTTP-запрос HEADER, как я могу измерить время ответа от сервера? Должен ли я использовать предоставленный таймер Java или есть более простой способ?

Я ищу краткий ответ, я не хочу использовать другие протоколы и т. д. Очевидно, я не хочу иметь решение, которое связывает мое приложение с конкретной ОС. Пожалуйста, люди, только решения IN-CODE.

Для отладки или для использования вашей программой?

owenmarshall 16.09.2008 06:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
20
1
81 355
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете использовать время, завиток и время в командной строке. Аргумент -I для curl указывает ему запрашивать только заголовок.

time curl -I 'http://server:3000'

Что-то вроде этого может помочь

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.HeadMethod;
import org.apache.commons.lang.time.StopWatch;
//import org.apache.commons.lang3.time.StopWatch

public class Main {

    public static void main(String[] args) throws URIException {
        StopWatch watch = new StopWatch();
        HttpClient client = new HttpClient();
        HttpMethod method = new HeadMethod("http://stackoverflow.com/");

        try {
            watch.start();
            client.executeMethod(method);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            watch.stop();
        }

        System.out.println(String.format("%s %s %d: %s", method.getName(), method.getURI(), method.getStatusCode(), watch.toString()));

    }
}
HEAD http://stackoverflow.com/ 200: 0:00:00.404

Возможно, я чего-то упускаю, но почему бы вам просто не использовать:

// open your connection
long start = System.currentTimeMillis();
// send request, wait for response (the simple socket calls are all blocking)
long end = System.currentTimeMillis();
System.out.println("Round trip response time = " + (end-start) + " millis");
Ответ принят как подходящий

Я бы сказал, это зависит от того, какой точный интервал вы пытаетесь измерить, количество времени от последнего байта запроса, который вы отправляете, до первого байта ответа, который вы получаете? Или пока не будет получен весь ответ? Или вы пытаетесь измерить только время на стороне сервера?

Если вы пытаетесь измерить только время обработки на стороне сервера, вам будет сложно определить количество времени, затрачиваемого на передачу по сети, для получения вашего запроса и получения ответа. В противном случае, поскольку вы сами управляете запросом через Socket, вы можете измерить время, прошедшее между любыми двумя моментами, проверив системный таймер и вычислив разницу. Например:

public void sendHttpRequest(byte[] requestData, Socket connection) {
    long startTime = System.nanoTime();
    writeYourRequestData(connection.getOutputStream(), requestData);
    byte[] responseData = readYourResponseData(connection.getInputStream());
    long elapsedTime = System.nanoTime() - startTime;
    System.out.println("Total elapsed http request/response time in nanoseconds: " + elapsedTime);
}

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

где я могу добавить эту функцию ?? в свой веб-сервис?

Aditya Vyas-Lakhan 24.02.2015 08:03

Прошедшее время следует измерять с помощью System.nanoTime(), см. stackoverflow.com/a/1776053/1839228

Franz Becker 22.01.2020 15:02

@FranzBecker Вы совершенно правы. Теперь, когда срок службы Java 1.4 давно истек, можно с уверенностью предположить, что System.nanoTime () всегда доступен.

Dave L. 22.01.2020 19:47

Используйте АОП для перехвата вызовов сокета и измерения времени ответа.

curl -s -w "%{time_total}\n" -o /dev/null http://server:3000

@Aspect
@Profile("performance")
@Component
public class MethodsExecutionPerformance {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("execution(* it.test.microservice.myService.service.*.*(..))")
    public void serviceMethods() {
    }

    @Around("serviceMethods()")
    public Object monitorPerformance(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch(getClass().getName());
        stopWatch.start();
        Object output = proceedingJoinPoint.proceed();
        stopWatch.stop();
        logger.info("Method execution time\n{}", stopWatch.prettyPrint());
        return output;
    }
}

Таким образом, вы можете рассчитать реальное время отклика вашего сервиса независимо от скорости сети.

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