it-swarm-pt.tech

Como posso encontrar o tempo de resposta de uma solicitação HTTP por meio de um soquete

Eu 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 temporizador Java fornecido ou há uma maneira mais fácil?

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

19
Martin Andersson

Eu diria que depende de qual intervalo exato você está tentando medir, a quantidade de tempo do ú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 lado do servidor?

Se você estiver tentando medir apenas o tempo de processamento do lado do servidor, terá dificuldade em calcular o tempo gasto no trânsito da rede para que sua solicitação chegue e a resposta seja retornada. Caso contrário, como você está gerenciando a solicitação por meio de um soquete, é possível medir o tempo decorrido entre dois momentos, 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 mede o tempo desde quando você começa a escrever sua solicitação até quando você termina de receber a resposta e imprime o resultado (supondo que você tenha implementado seus métodos específicos de leitura/gravação).

11
Dave L.

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

19
A B

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

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

Algo como isso pode fazer o truque

 import Java.io.IOException; 
 
 import org.apache.commons.httpclient.HttpClient; 
 import org.Apache.commons.httpclient.HttpMethod; .____.] importar org.Apache.commons.httpclient.URIException; 
 import org.Apache.commons.httpclient.methods.HeadMethod; 
 import org.Apache.commons.lang.time.StopWatch ; 
 // importar org.Apache.commons.lang3.time.StopWatch 
 
 public class Principal {
 
 public static void main (String [] args) lança URIException {
 StopWatch watch = novo StopWatch (); 
 HttpClient client = novo HttpClient (); 
 Método HttpMethod = new HeadMethod ("http: // stackoverflow com {.____.] watch.start (); e) {
 e.printStackTrace (); 
} finalmente {
 watch.stop (); 
} 
 
 Sistema .out.println (St ring.format ("% s% s% d:% s", method.getName (), method.getURI (), method.getStatusCode (), watch.toString ())); 
 
} 
} 
 CABEÇA http://stackoverflow.com/ 200: 0: 00: 00.404 
7
Dave Cheney

Talvez eu esteja sentindo falta de algo, mas por que você não usa apenas:

// 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 chamadas para o soquete e medir o tempo de resposta.

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

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

0
Sudabe-Neirizi