it-swarm.it

Come posso trovare il tempo di risposta di una richiesta HTTP attraverso un socket

Sto usando un socket Java, connesso a un server. Se invio una richiesta http HEADER, come posso misurare il tempo di risposta dal server? Devo utilizzare un timer Java fornito o esiste un modo più semplice?

Sto cercando una risposta breve, non voglio usare altri protocolli, ecc. Ovviamente non voglio nemmeno avere una soluzione che leghi la mia applicazione a un sistema operativo specifico. Si prega di persone, solo soluzioni IN-CODE.

19
Martin Andersson

Direi che dipende da quale intervallo esatto stai provando, la quantità di tempo dall'ultimo byte della richiesta che invii fino al primo byte della risposta che ricevi? O fino a quando non viene ricevuta l'intera risposta? O stai provando a misurare solo il tempo sul lato server?

Se si sta tentando di misurare solo il tempo di elaborazione lato server, si avrà difficoltà a considerare la quantità di tempo trascorso nel transito di rete per la richiesta di arrivo e la risposta al reso. Altrimenti, dal momento che gestisci la richiesta da solo tramite un Socket, puoi misurare il tempo trascorso tra due momenti qualsiasi controllando l'orologio di sistema e calcolando la differenza. Per esempio:

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

Questo codice misurerebbe il tempo dal momento in cui inizierai a scrivere la tua richiesta al termine della ricezione della risposta, e stamperai il risultato (presumendo che tu abbia implementato i tuoi specifici metodi di lettura/scrittura).

11
Dave L.

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

19
A B

È possibile utilizzare il tempo e l'arricciatura e il tempo sulla riga di comando. L'argomento -I per curl indica di richiedere solo l'intestazione.

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

Qualcosa come questo potrebbe fare il trucco

 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 Principale {
 
 public static void main (String [] args) lancia URIException {
 StopWatch watch = new StopWatch (); 
 HttpClient client = new HttpClient (); 
 HttpMethod method = new HeadMethod ("http: // stackoverflow .com /");

 prova {
 watch.start (); 
 client.executeMethod (metodo); 
} catch (IOException e) {
 e.printStackTrace (); 
} infine {
 watch.stop (); 
} 
 
 Sistema .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

Forse mi manca qualcosa, ma perché non usi semplicemente:

// 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

Utilizzare AOP per intercettare le chiamate al socket e misurare il tempo di risposta.

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

In questo modo, puoi calcolare il tempo reale di risposta del tuo servizio indipendentemente dalla velocità della rete.

0
Sudabe-Neirizi