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




Вы можете использовать время, завиток и время в командной строке. Аргумент -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);
}
Этот код будет измерять время с момента, когда вы начинаете писать свой запрос, до того, когда вы заканчиваете получать ответ, и распечатывать результат (при условии, что у вас реализованы определенные методы чтения / записи).
где я могу добавить эту функцию ?? в свой веб-сервис?
Прошедшее время следует измерять с помощью System.nanoTime(), см. stackoverflow.com/a/1776053/1839228
@FranzBecker Вы совершенно правы. Теперь, когда срок службы Java 1.4 давно истек, можно с уверенностью предположить, что System.nanoTime () всегда доступен.
Используйте АОП для перехвата вызовов сокета и измерения времени ответа.
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;
}
}
Таким образом, вы можете рассчитать реальное время отклика вашего сервиса независимо от скорости сети.
Для отладки или для использования вашей программой?