Как я могу найти время ответа HTTP-запроса через сокет - PullRequest
19 голосов
/ 16 сентября 2008

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

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

Ответы [ 7 ]

19 голосов
/ 21 сентября 2012

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

12 голосов
/ 16 сентября 2008

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

time curl -I 'http://server:3000'
11 голосов
/ 16 сентября 2008

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

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

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

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

7 голосов
/ 16 сентября 2008

Нечто подобное может сработать

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
2 голосов
/ 16 сентября 2008

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

// 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");
0 голосов
/ 24 января 2019
@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;
    }
}

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

0 голосов
/ 16 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...