it-swarm-ru.tech

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

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

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

19
Martin Andersson

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

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

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

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

11
Dave L.

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

19
A B

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

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

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

 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 

 открытый класс Main {

 public static void main (String [] args) выдает URIException {
 StopWatch watch = новый StopWatch (); 
 HttpClient client = new HttpClient (); 
 Метод HttpMethod = new HeadMethod ("http://stackoverflow.com/"); 

 пытаться {
 watch.start (); 
 client.executeMethod (метод); 
 } catch (IOException e) {
 e.printStackTrace (); 
 } в конце концов {
 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 
7
Dave Cheney

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

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

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

0
Adi
@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
Sudabe-Neirizi