it-swarm-korea.com

소켓을 통해 HTTP 요청의 응답 시간을 어떻게 찾을 수 있습니까?

서버에 연결된 Java 소켓을 사용하고 있습니다. HEADER http 요청을 보내면 서버의 응답 시간을 어떻게 측정 할 수 있습니까? 제공된 Java 타이머를 사용해야합니까, 아니면 더 쉬운 방법이 있습니까?

나는 짧은 대답을 찾고 있는데 다른 프로토콜 등을 사용하고 싶지 않습니다. 분명히 내 응용 프로그램을 특정 OS에 연결하는 솔루션을 갖고 싶지 않습니다. 사람, IN-CODE 솔루션 만 부탁드립니다.

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

명령 줄에서 time과 curl 및 time을 사용할 수 있습니다. curl에 대한 -I 인수는 헤더 만 요청하도록 지시합니다.

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 
 
 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 (); 
} 마지막으로 {
 watch.stop (); 
} 
 
 시스템 .out.println (St ring.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