Подтвердить что ты не робот

Как найти время ответа HTTP-запроса через Socket

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

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

4b9b3361

Ответ 1

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

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

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);
}

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Что-то вроде этого может сделать трюк

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

Ответ 5

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

// 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");

Ответ 6

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

Ответ 7

@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;
    }
}

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