web-dev-qa-db-fra.com

Comment trouver le temps de réponse d'une requête HTTP via un socket

J'utilise un socket Java, connecté à un serveur. Si j'envoie une demande HEADER http, comment puis-je mesurer le temps de réponse du serveur? Dois-je utiliser un minuteur Java fourni ou existe-t-il un moyen plus simple?

Je cherche une réponse brève, je ne souhaite pas utiliser d'autres protocoles, etc. Je ne souhaite évidemment pas non plus disposer d'une solution liant mon application à un système d'exploitation spécifique. S'il vous plaît les gens, les solutions IN-CODE seulement. 

19
Martin Andersson

Je dirais que cela dépend de l'intervalle exact que vous essayez de mesurer, du temps écoulé depuis le dernier octet de la demande que vous envoyez jusqu'au premier octet de la réponse que vous recevez? Ou jusqu'à ce que toute la réponse soit reçue? Ou essayez-vous de mesurer le temps côté serveur uniquement?

Si vous essayez uniquement de mesurer le temps de traitement côté serveur, vous aurez du mal à déterminer le temps passé en transit sur le réseau pour que votre demande arrive et que la réponse soit renvoyée. Sinon, puisque vous gérez vous-même la demande via un socket, vous pouvez mesurer le temps écoulé entre deux moments quelconques en vérifiant l'horloge système et en calculant la différence. Par exemple:

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

Ce code mesurerait le temps écoulé entre le moment où vous avez commencé à écrire votre demande et celui où vous avez fini de recevoir la réponse, puis imprimez le résultat (en supposant que vos méthodes de lecture/écriture soient implémentées).

11
Dave L.

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

19
A B

Vous pouvez utiliser time, curl et time sur la ligne de commande. L'argument -I de curl lui demande de ne demander que l'en-tête.

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

Quelque chose comme ça pourrait faire l'affaire

 import Java.io.IOException; 
 
 import org.Apache.commons.httpclient.HttpClient; 
 import org.Apache.commons.httpclient.HttpMethod; 
 importer org.Apache.commons.httpclient.URIException; 
 importer org.Apache.commons.httpclient.methods.HeadMethod; 
 importer org.Apache.commons.lang.time.StopWatch ; 
 // import org.Apache.commons.lang3.time.StopWatch 
 
 public class Main {
 
 public static void main (String [] args) lève URIException {
 Chronomètre watch = new StopWatch (); 
 Client HttpClient = new HttpClient (); 
 HttpMethod, méthode = new HeadMethod ("http: // stackoverflow .com /");

 try {
 watch.start (); 
 client.executeMethod (méthode); 
} catch (IOException e) {
 e.printStackTrace (); 
} finalement {
 watch.stop (); 
} 
 
 Système .out.println (St ring.format ("% s% s% d:% s", méthode.getName (), méthode.getURI (), méthode.getStatusCode (), watch.toString ())); 
 
} 
} 
 HEAD http://stackoverflow.com/ 200: 0: 00: 00.404 
7
Dave Cheney

Peut-être qu'il me manque quelque chose, mais pourquoi ne pas simplement utiliser:

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

Utilisez AOP pour intercepter les appels du socket et mesurer le temps de réponse.

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

De cette manière, vous pouvez calculer le temps de réponse réel de votre service indépendamment de la vitesse du réseau. 

0
Sudabe-Neirizi