Wie kann ich die Antwortzeit einer HTTP-Anforderung durch einen Sockel finden

StackOverflow https://stackoverflow.com/questions/68999

  •  09-06-2019
  •  | 
  •  

Frage

Ich verwende einen Java-Buchse, mit einem Server verbunden. Wenn ich eine Header HTTP-Anforderung senden, wie kann ich die Antwortzeit vom Server messen? Muss ich eine bereitgestellte Java-Timer verwenden, oder gibt es einen einfacheren Weg?

Ich bin für eine kurze Antwort suchen, ich will nicht andere Protokolle verwenden usw. Offensichtlich haben weder ich will eine Lösung haben, die zu einem bestimmten OS meine Anwendung bindet. Bitte Leute, IN-CODE-Lösungen nur.

War es hilfreich?

Lösung

Ich würde sagen, es hängt davon ab, was genau Intervall Sie messen versuchen, die Höhe der Zeit aus dem letzten Byte der Anforderung, die Sie bis zum ersten Byte der Antwort senden, dass Sie erhalten? Oder, bis die gesamte Antwort empfangen? Oder versuchen Sie nur die serverseitige Zeit zu messen?

Wenn Sie versuchen, nur die Server-Seite der Verarbeitungszeit zu messen, Sie gehen eine schwierige Zeit haben, um die Menge an Zeit für Ihre Anfrage in Netzwerk-Transit verbracht Ausklammerung ankommen und die Antwort zurück. Ansonsten, da Sie die Anforderung, sich durch einen Sockel sind verwalten, können Sie die verstrichene Zeit zwischen zwei beliebigen Momente messen, indem die Systemuhr Überprüfung und die Differenz berechnet wird. Zum Beispiel:

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

Dieser Code würde die Zeit aus messen, wenn Sie Ihre Anfrage beginnen zu schreiben, um, wenn Sie die Antwort fertig zu empfangen und das Ergebnis drucken (vorausgesetzt, Sie Ihre spezifischen Lese- / Schreib Methoden implementiert haben).

Andere Tipps

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

Sie können Zeit und curl und die Zeit auf der Kommandozeile verwenden. Das Argument -I für Locke weist er nur den Header fordern.

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

So etwas könnte den Trick tun

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

Vielleicht bin ich etwas fehlt, aber warum Sie nicht nur verwenden:

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

Mit AOP Anrufe an die Buchse abzufangen und die Reaktionszeit messen.

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

Auf diese Weise können Sie die echte Reaktionszeit Ihres Service unabhängig von der Netzwerkgeschwindigkeit berechnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top