CLI AI

Medir o tempo de resposta de uma API com curl

2026-06-22

A forma mais rápida de ver quanto tempo uma chamada de API demora é curl -s -o /dev/null -w '%{time_total}\n' https://api.example.com/, que imprime só o tempo total e nada mais. Esse número sozinho não diz se o atraso está no DNS, na rede, no TLS ou no próprio servidor — para isso é preciso quebrar a requisição em etapas. Aqui vão cinco números em vez de um, e o que fazer com cada um.

1. Quanto tempo a requisição levou de verdade?

clai
$ clai quantos segundos esse endereco demora para responder→ curl -s -o /dev/null -w '%{time_total}\n' https://cliai.tech/1.244094

-o /dev/null descarta o corpo da resposta, -s esconde a barra de progresso, e -w imprime só o que foi pedido. Já tem um número, mas ele não explica nada.

2. Quebrar o tempo por etapa

clai
$ clai divide o tempo de resposta por etapa: dns, conexao, tls, primeiro byte→ curl -s -o /dev/null -w 'dns: %{time_namelookup}\nconnect: %{time_connect}\ntls: %{time_appconnect}\nttfb: %{time_starttransfer}\ntotal: %{time_total}\n' https://cliai.tech/dns: 0.000782connect: 0.299098tls: 0.414729ttfb: 1.124750total: 1.244094

Os valores são cumulativos, não independentes — o que importa são as diferenças entre eles. O DNS levou 0,0008s, montar a conexão TCP levou 0,298s, o handshake TLS levou 0,116s, e do TLS pronto até o primeiro byte foram 0,71s — isso é o servidor pensando. É aí que mora o problema, se houver algum.

3. Ler as diferenças, não os números absolutos

time_namelookup acima de 0,1s aponta para o resolver ou um cache frio. connect - namelookup é a latência de rede até o servidor, mais ou menos metade do ping de ida e volta. starttransfer - appconnect é quanto tempo o servidor levou pensando na requisição. total - starttransfer é o tempo de transferência do corpo, e depende do tamanho da resposta.

4. Foi mesmo um 200?

clai
$ clai mostra o tempo, o codigo de status e o tamanho do corpo→ curl -s -o /dev/null -w 'code: %{http_code}  size: %{size_download}  total: %{time_total}\n' https://cliai.tech/code: 200

Um tempo sem o código de status não serve para nada — um 500 rápido não significa que está tudo bem. A lista completa de variáveis está em man curl, na seção WRITE-OUT VARIABLES.

5. Uma medição só não basta

clai
$ clai mede o tempo de resposta cinco vezes seguidas→ for i in $(seq 5); do curl -s -o /dev/null -w '%{time_total}\n' https://cliai.tech/; done

Uma única medição não significa nada. A primeira requisição quase sempre é mais lenta por causa do DNS frio e da montagem da conexão. Olhe para a variação entre as repetições, não para o primeiro número.

6. Levar o formato para um arquivo

clai
$ clai salva o formato de medicao em um arquivo e reutiliza→ curl -s -o /dev/null -w @curl-format.txt https://cliai.tech/

-w @arquivo lê o formato de um arquivo, então a linha longa para de atrapalhar. Esse arquivo geralmente fica no repositório junto com os outros scripts de checagem.

Pegadinhas

  • Os valores são cumulativos. time_appconnect já inclui o DNS e a conexão. Subtraia a etapa anterior, ou você vai concluir que o TLS levou meio segundo quando isso é na verdade a soma de tudo antes dele.
  • time_appconnect é zero em HTTP puro. Sem TLS essa etapa simplesmente não existe, e o zero aqui não é erro de medição.
  • curl mede uma requisição, não performance. Para carga, use hey, wrk ou k6. curl responde "para onde vai o tempo", não "quanto tráfego aguenta".

Perguntas relacionadas

O que é TTFB? Tempo até o primeiro byte — o valor time_starttransfer na saída. Geralmente é o sinal mais claro da velocidade do backend.

Por que a primeira requisição é sempre mais lenta? Cache DNS frio, montagem da conexão TCP e o handshake TLS. Uma requisição repetida via keep-alive pula as três.

Como medir só o DNS? %{time_namelookup} sozinho, ou dig +stats, que mostra o tempo de resolução separado do resto.

Veja também

Pare de decorar os formatos -w do curl — descreva o que quer medir e o CliAI escreve o comando. Instale em uma linha.