>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Python

Dissecando Requisições HTTP Direto no Terminal com httptap

httptap banner

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.

sample-output.png

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

sample-follow-redirects-output.png

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:

  1. Modo linha compacta --compact para logs:

    httptap --compact https://httpbin.io/get
    
  2. Stream de texto de métricas --metrics-only:

    httptap --metrics-only https://httpbin.io/get
    

    Você 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
    
  3. 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