Dissecando Requisições HTTP Direto no Terminal com httptap
Quando um serviço externo ou microsserviço interno começa subitamente a ficar lento, suas mãos naturalmente reach for o bom e velho curl. Mas o curl padrão apenas outputa o body da resposta, e para extrair os timings das fases de conexão, você precisa construir um template monstruoso com uma dúzia de variáveis via o flag -w. Ou você abre um navegador, vai na aba Network do DevTools, e admira o bonito waterfall lá. No console de um servidor remoto, você não pode abrir um navegador, e vasculhar output cru é uma dor.
Recentemente encontrei o httptap. É uma ferramenta Python elegante que divide qualquer requisição HTTP em suas fases componentes: DNS, handshake TCP, negociação TLS, time to first byte (TTFB), e transferência do body da resposta. Tudo isso é exibido como um gráfico de waterfall claro direto no console.
O Que Está Por Trás e Por Que Você Precisa Dele
A ferramenta é construída em Python usando httpx, httpcore, dnspython, e a biblioteca Rich para renderizar a interface. Ela não apenas mede o tempo total de resposta—ela faz hooks no tracing da stack de rede e mostra exatamente em qual estágio uma requisição ficou presa.

Se você já usou o projeto httpstat, a ideia vai parecer familiar. Mas o httptap tem várias diferenças importantes:
- Ele pode rastrear cadeias de redirects e medir o timing de cada etapa separadamente, mostrando uma tabela de resumo.
- Suporta verificações de budget de latência (SLO) com códigos de saída legíveis.
- Inspeciona certificados TLS: reporta hostname (CN), algoritmo de cifra, versão do protocolo, e dias até expiração.
- Exporta JSON estruturado detalhado com todas as métricas para automação.
- Entende flags do curl (
-X,-L,-H,-k,-x), então você não precisa reaprender.
Como Instalar e Executar
A forma mais rápida de instalar no macOS ou Linux é via Homebrew:
brew install httptap
Se você prefere ferramentas Python, pip ou uv funcionam:
uv pip install httptap
# или
pip install httptap
Também há uma imagem Docker pronta no registro do GitHub Packages:
docker run --rm ghcr.io/ozeranskii/httptap:latest https://example.com
O uso básico é direto:
httptap https://httpbin.io/get
A ferramenta fará a requisição e outputará uma tabela organizada com os timings de cada etapa, código de status, e informações de rede (incluindo versão do protocolo HTTP/2 e família de endereço IPv4/IPv6).
O Que a Ferramenta Pode Fazer na Prática
Trabalhando com Qualquer Método HTTP e Corpos de Requisição
A ferramenta envia JSON ou XML sem problemas. Se você passar o flag --data sem especificar explicitamente um método, a ferramenta mudará para POST por conta própria, imitando o comportamento do curl:
httptap https://httpbin.io/post --data '{"status": "testing", "source": "httptap"}'
Se os dados estão em um arquivo, você pode passar o caminho via sintaxe @:
httptap https://httpbin.io/post --data @payload.json
Para outros métodos, existe o familiar flag --method (ou -X):
httptap https://httpbin.io/put --method PUT --data '{"key": "value"}'
Rastreando Cadeias de Redirects
Poucas ferramentas conseguem mostrar adequadamente quanto tempo uma série de respostas 301 e 302 leva. Aqui você só precisa adicionar o flag --follow (ou -L):
httptap --follow https://httpbin.io/redirect/2

O output incluirá um detalhamento para cada host intermediário e uma linha final com o tempo total.
Verificando Budgets de Latência no CI
Uma das funcionalidades mais úteis do projeto é o flag --slo. Ele transforma a ferramenta em um instrumento de smoke test e gate para pipelines de build:
httptap --slo total=500,ttfb=200 https://api.example.com/health
Se o serviço alvo responder com status 200 mas o TTFB exceder 200 milissegundos ou o tempo total ultrapassar 500 milissegundos, a ferramenta retornará código de saída 4. Se ocorrer um erro de rede, retorna código 75 (EX_TEMPFAIL conforme padrão BSD sysexits).
Graças à separação de código, você pode configurar um script de deploy para distinguir entre falhas de rede e degradação de performance:
httptap --slo total=1500,tls=200 https://staging.example.com/
case $? in
0) echo "Сервис уложился в нормативы" ;;
4) echo "Нарушен SLO по времени ответа"; exit 1 ;;
75) echo "Временный сетевой сбой, повторяем проверку" ;;
esac
Scripting e Output Compacto
Para automação e cron jobs, o output gráfico do Rich pode ser excessivo. Dois modos estão disponíveis para esses cenários:
-
Modo linha compacta
--compactpara logs:httptap --compact https://httpbin.io/get -
Stream de texto de métricas
--metrics-only:httptap --metrics-only https://httpbin.io/getVocê receberá uma única linha de volta como:
Step 1: dns=30.1 connect=97.3 tls=199.0 ttfb=472.2 total=476.0 status=200 bytes=389 ip=44.211.11.205 family=IPv4 tls_version=TLSv1.2 proxy=direct -
Exportação JSON via
--json out/report.json, onde timings, headers, parâmetros TLS e endereços IP são salvos.
Resolvers Personalizados e Extensibilidade
Se você está escrevendo utilitários Python internos, o httptap pode ser usado como uma biblioteca. A arquitetura é construída sobre protocols (typing.Protocol), então os componentes são fáceis de trocar. Por exemplo, você pode sobrescrever o resolver DNS para testar a resposta de um IP específico sem modificar /etc/hosts:
from httptap import HTTPTapAnalyzer, SystemDNSResolver
class StaticDNS(SystemDNSResolver):
def resolve(self, host, port, timeout):
return "93.184.216.34", "IPv4", 0.05
analyzer = HTTPTapAnalyzer(dns_resolver=StaticDNS())
steps = analyzer.analyze_url("https://example.com")
for step in steps:
print(f"TTFB: {step.timing.ttfb_ms:.2f} ms")
A ferramenta se mostrou compacta, rápida e focada em uma tarefa específica. Ela preenche bem o gap entre o curl -w cru e profilers gráficos pesados.
O utilitário será útil para engenheiros de operações para diagnóstico rápido de endpoints lentos em servidores, desenvolvedores backend para medir latências de APIs externas, e equipes de QA para verificar SLOs diretamente nos pipelines. Experimente instalar localmente e substituir seu curl -I usual por um par de dias. A diferença em clareza é notável imediatamente.
Projetos relacionados