it-swarm-eu.dev

Wie finde ich die Antwortzeit einer HTTP-Anfrage über einen Socket

Ich verwende einen Java-Socket, der mit einem Server verbunden ist. Wie kann ich die Antwortzeit vom Server messen, wenn ich eine HEADER-http-Anforderung sende? Muss ich einen bereitgestellten Java-Timer verwenden oder gibt es einen einfacheren Weg?

Ich suche eine kurze Antwort, ich möchte keine anderen Protokolle usw. verwenden. Natürlich möchte ich auch keine Lösung, die meine Anwendung an ein bestimmtes Betriebssystem bindet. Bitte Leute, nur IN-CODE-Lösungen. 

19

Ich würde sagen, es hängt davon ab, in welchem ​​Intervall Sie genau messen, wie viel Zeit vom letzten Byte der Anforderung, die Sie senden, bis zum ersten Byte der Antwort, die Sie erhalten? Oder bis die gesamte Antwort eingegangen ist? Oder versuchen Sie nur die serverseitige Zeit zu messen?

Wenn Sie versuchen, nur die serverseitige Verarbeitungszeit zu messen, wird es schwierig sein, die Zeit zu ermitteln, die Sie für die Ankunft Ihrer Anfrage und die Antwort auf die Antwort in der Netzwerkübertragung verbracht haben. Andernfalls können Sie, da Sie die Anforderung selbst über einen Socket verwalten, die verstrichene Zeit zwischen zwei beliebigen Zeitpunkten messen, indem Sie die Systemuhr überprüfen und die Differenz berechnen. 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 misst die Zeit von dem Zeitpunkt an, an dem Sie Ihre Anfrage ausschreiben, bis zum Ende der Antwort und zeigt das Ergebnis an (vorausgesetzt, Sie haben Ihre spezifischen Lese-/Schreibmethoden implementiert).

11
Dave L.

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

19
A B

Sie können time und curl und time in der Befehlszeile verwenden. Das Argument -I für curl weist es an, nur den Header anzufordern.

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

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.StopWatch ; 
 // import org.Apache.commons.lang3.time.StopWatch 
 
 öffentliche Klasse Main {
 
 public static void main (String [] args) löst URIException {
 StopWatch watch = neue StopWatch (); 
 HttpClient-Client = neuer HttpClient (); 
 HttpMethod-Methode = neue HeadMethod ("http: // stackoverflow .com /");[.____.(
 try {
 watch.start (); 
 client.executeMethod (Methode); 
} catch (IOException e) {
 e.printStackTrace (); 
} schließlich {
 watch.stop (); 
} 
 
 System .out.println (St ring.format ("% s% s% d:% s"), method.getName (), method.getURI (), method.getStatusCode (), watch.toString ())); 
 
} 
} 
 KOPF http://stackoverflow.com/ 200: 0: 00: 00.404 
7
Dave Cheney

Vielleicht fehlt mir etwas, aber warum benutzt du nicht einfach:

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

Mit AOP können Sie Anrufe an den Socket abfangen und die Antwortzeit messen.

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

Auf diese Weise können Sie die reale Antwortzeit Ihres Dienstes unabhängig von der Netzwerkgeschwindigkeit berechnen. 

0
Sudabe-Neirizi