>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
Python

HTTP-Anfragen direkt im Terminal sezieren mit httptap

httptap banner

Wenn ein externer Dienst oder ein interner Microservice plötzlich zu lahmen beginnt, greifen Ihre Hände natürlich zu altbewährtem curl. Aber Standard-curl gibt nur den Response-Body aus, und um die Timings der Verbindungsphasen zu extrahieren, müssen Sie eine monstrous Vorlage mit einem Dutzend Variablen über das -w Flag erstellen. Oder Sie öffnen einen Browser, navigieren zur Netzwerk-Registerkarte in den DevTools und bewundern das hübsche Wasserfalldiagramm dort. Auf der Konsole eines Remote-Servers können Sie keinen Browser öffnen, und sich durch Rohausgabe zu wühlen ist mühsam.

Ich bin kürzlich auf httptap gestoßen. Es ist ein praktisches Python-Tool, das jede HTTP-Anfrage in ihre Bestandteile zerlegt: DNS, TCP-Handshake, TLS-Verhandlung, Time to First Byte (TTFB) und Response-Body-Übertragung. All das wird als übersichtliches Wasserfalldiagramm direkt in der Konsole angezeigt.


Was steckt dahinter und warum Sie es brauchen

Das Tool ist in Python unter Verwendung von httpx, httpcore, dnspython und der Rich-Bibliothek für die Darstellung der Oberfläche gebaut. Es misst nicht nur die Gesamtantwortzeit – es bindet sich in das Network-Stack-Tracing ein und zeigt genau, auf welcher Stufe eine Anfrage hängengeblieben ist.

sample-output.png

Wenn Sie schon einmal das Projekt httpstat verwendet haben, wird Ihnen die Idee bekannt vorkommen. Aber httptap hat mehrere wesentliche Unterschiede:

  • Es kann Weiterleitungsketten verfolgen und die Zeitmessung für jeden Schritt separat durchführen, mit einer Übersichtstabelle.
  • Unterstützt Latenz-Budget-Prüfungen (SLO) mit lesbaren Exit-Codes.
  • Inspiziert TLS-Zertifikate: meldet Hostname (CN), Verschlüsselungsalgorithmus, Protokollversion und Tage bis zum Ablauf.
  • Exportiert detailliertes strukturiertes JSON mit allen Metriken für die Automatisierung.
  • Versteht curl-Flags (-X, -L, -H, -k, -x), sodass Sie Ihre Finger nicht umgewöhnen müssen.

Installation und Ausführung

Der schnellste Weg zur Installation auf macOS oder Linux ist über Homebrew:

brew install httptap

Wenn Sie Python-Tools bevorzugen, funktionieren pip oder uv:

uv pip install httptap
# или
pip install httptap

Es gibt auch ein fertiges Docker-Image im GitHub Packages Registry:

docker run --rm ghcr.io/ozeranskii/httptap:latest https://example.com

Die grundlegende Verwendung ist unkompliziert:

httptap https://httpbin.io/get

Das Tool führt die Anfrage aus und gibt eine übersichtliche Tabelle mit den Zeitmessungen für jeden Schritt, dem Statuscode und den Netzwerkinformationen aus (einschließlich HTTP/2-Protokollversion und IPv4/IPv6-Adressfamilie).


Was das Tool in der Praxis leistet

Arbeit mit beliebigen HTTP-Methoden und Request-Bodies

Das Tool sendet JSON oder XML problemlos. Wenn Sie das --data Flag ohne explizite Methodenangabe übergeben, wechselt das Tool automatisch auf POST, was dem Verhalten von curl entspricht:

httptap https://httpbin.io/post --data '{"status": "testing", "source": "httptap"}'

Wenn die Daten in einer Datei sind, können Sie den Pfad über die @-Syntax übergeben:

httptap https://httpbin.io/post --data @payload.json

Für andere Methoden gibt es das vertraute --method Flag (oder -X):

httptap https://httpbin.io/put --method PUT --data '{"key": "value"}'

Verfolgung von Weiterleitungsketten

Wenige Tools können korrekt zeigen, wie viel Zeit eine Reihe von 301- und 302-Responses benötigt. Hier müssen Sie nur das --follow Flag (oder -L) hinzufügen:

httptap --follow https://httpbin.io/redirect/2

sample-follow-redirects-output.png

Die Ausgabe enthält eine detaillierte Aufschlüsselung für jeden Zwischenhost und eine letzte Zeile mit der Gesamtzeit.

Prüfung von Latenz-Budgets in CI

Eine der nützlichsten Funktionen des Projekts ist das --slo Flag. Es verwandelt das Tool in ein Smoke-Test- und Gate-Instrument für Build-Pipelines:

httptap --slo total=500,ttfb=200 https://api.example.com/health

Wenn der Zieldienst mit einem 200-Status antwortet, aber TTFB 200 Millisekunden überschreitet oder die Gesamtzeit über 500 Millisekunden liegt, gibt das Tool den Exit-Code 4 zurück. Bei einem Netzwerkfehler gibt es den Code 75 zurück (EX_TEMPFAIL gemäß BSD sysexits-Standard).

Dank der Code-Trennung können Sie ein Deployment-Skript so konfigurieren, dass es zwischen Netzwerkfehlern und Leistungseinbußen unterscheidet:

httptap --slo total=1500,tls=200 https://staging.example.com/
case $? in
  0) echo "Сервис уложился в нормативы" ;;
  4) echo "Нарушен SLO по времени ответа"; exit 1 ;;
  75) echo "Временный сетевой сбой, повторяем проверку" ;;
esac

Skripting und kompakte Ausgabe

Für Automatisierung und Cron-Jobs kann die grafische Ausgabe von Rich übermäßig sein. Für solche Szenarien stehen zwei Modi zur Verfügung:

  1. Kompakter Zeilenmodus --compact für Logs:

    httptap --compact https://httpbin.io/get
    
  2. Metrik-Text-Stream --metrics-only:

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

    Sie erhalten eine einzige Zeile zurück wie:

    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. JSON-Export über --json out/report.json, wobei Timings, Header, TLS-Parameter und IP-Adressen gespeichert werden.


Benutzerdefinierte Resolver und Erweiterbarkeit

Wenn Sie interne Python-Utilities schreiben, kann httptap als Bibliothek verwendet werden. Die Architektur basiert auf Protokollen (typing.Protocol), sodass Komponenten leicht ausgetauscht werden können. Sie können beispielsweise den DNS-Resolver überschreiben, um die Antwort einer bestimmten IP zu testen, ohne /etc/hosts zu ändern:

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

Das Tool hat sich als kompakt, schnell und auf eine bestimmte Aufgabe fokussiert erwiesen. Es schließt elegant die Lücke zwischen rohem curl -w und schwergewichtigen grafischen Profilern.

Das Tool wird für Operations-Ingenieure zur schnellen Diagnose langsamer Endpunkte auf Servern, für Backend-Entwickler zur Messung externer API-Latenzen und für QA-Teams zur Prüfung von SLOs direkt in Pipelines nützlich sein. Versuchen Sie, es lokal zu installieren und Ihr übliches curl -I für ein paar Tage zu ersetzen. Der Unterschied in der Übersichtlichkeit ist sofort bemerkbar.

Ähnliche Projekte