Question

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

Je cherche une réponse brève, je ne souhaite pas utiliser d'autres protocoles, etc. Bien entendu, je ne souhaite 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.

Était-ce utile?

La solution

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 avez envoyée 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).

Autres conseils

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

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

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

Quelque chose comme ça pourrait faire l'affaire

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

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

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

@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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top