Como posso encontrar o tempo de resposta de uma solicitação HTTP através de um Socket

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou usando um soquete Java, conectado a um servidor.Se eu enviar uma solicitação HTTP HEADER, como posso medir o tempo de resposta do servidor?Devo usar um timer java fornecido ou existe uma maneira mais fácil?

Estou procurando uma resposta curta, não quero usar outros protocolos etc.Obviamente, não quero ter uma solução que vincule meu aplicativo a um sistema operacional específico.Por favor pessoal, apenas soluções IN-CODE.

Foi útil?

Solução

Eu diria que depende de qual intervalo exato você está tentando medir, a quantidade de tempo desde o último byte da solicitação que você envia até o primeiro byte da resposta que você recebe?Ou até que toda a resposta seja recebida?Ou você está tentando medir apenas o tempo do servidor?

Se você estiver tentando medir apenas o tempo de processamento do lado do servidor, terá dificuldade em calcular a quantidade de tempo gasto no trânsito da rede para que sua solicitação chegue e a resposta retorne.Caso contrário, como você mesmo gerencia a solicitação por meio de um Socket, você pode medir o tempo decorrido entre dois momentos quaisquer verificando o relógio do sistema e calculando a diferença.Por exemplo:

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

Esse código mediria o tempo desde o início da escrita de sua solicitação até o término do recebimento da resposta e imprimiria o resultado (supondo que você tenha implementado seus métodos específicos de leitura/gravação).

Outras dicas

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

Você pode usar time e curl e time na linha de comando.O argumento -I para curl instrui-o a solicitar apenas o cabeçalho.

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

Algo assim pode resolver o problema

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

Talvez esteja faltando alguma coisa, mas por que você não usa:

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

Use AOP para interceptar chamadas para o soquete e medir o tempo de resposta.

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

Desta forma, você pode calcular o tempo real de resposta do seu serviço independente da velocidade da rede.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top