it-swarm-es.tech

¿Cómo puedo encontrar el tiempo de respuesta de una solicitud HTTP a través de un Socket

Estoy usando un socket Java, conectado a un servidor. Si envío una solicitud http HEADER, ¿cómo puedo medir el tiempo de respuesta del servidor? ¿Debo usar un temporizador Java provisto, o hay una manera más fácil?

Estoy buscando una respuesta corta, no quiero usar otros protocolos, etc. Obviamente, tampoco quiero tener una solución que vincule mi aplicación a un sistema operativo específico. Por favor, personas, solo soluciones IN-CODE.

19
Martin Andersson

Diría que depende de qué intervalo exacto intente medir, la cantidad de tiempo desde el último byte de la solicitud que envía hasta el primer byte de la respuesta que recibe. ¿O hasta que se reciba toda la respuesta? ¿O está tratando de medir solo el tiempo del lado del servidor?

Si solo está tratando de medir el tiempo de procesamiento del lado del servidor, tendrá dificultades para calcular la cantidad de tiempo que pasa en el tránsito de la red para que su solicitud llegue y la respuesta para regresar. De lo contrario, dado que está gestionando la solicitud usted mismo a través de un Socket, puede medir el tiempo transcurrido entre dos momentos comprobando el reloj del sistema y calculando la diferencia. Por ejemplo:

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

Este código mediría el tiempo desde que comienza a escribir su solicitud hasta que termina de recibir la respuesta e imprime el resultado (suponiendo que tenga implementados sus métodos específicos de lectura/escritura).

11
Dave L.

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

19
A B

Puede usar time y curl and time en la línea de comandos. El argumento -I para curl le indica que solo solicite el encabezado.

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

Algo como esto podría hacer el truco

 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) lanza URIException {
 StopWatch watch = new StopWatch (); 
 HttpClient client = new HttpClient (); 
 HttpMethod method = new HeadMethod ("http: // stackoverflow .com /");[.____.font>
 intente {
 watch.start (); 
 client.executeMethod (método); 
} catch (IOException e) {
 e.printStackTrace (); 
} finalmente {
 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

Tal vez me falta algo, pero ¿por qué no usas?

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

Use AOP para interceptar llamadas al socket y medir el tiempo de respuesta.

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 esta manera, puede calcular el tiempo de respuesta real de su servicio independientemente de la velocidad de la red.

0
Sudabe-Neirizi