Analiza żądań HTTP bezpośrednio w terminalu dzięki httptap
Gdy zewnętrzna usługa lub wewnętrzny mikroserwis nagle zaczyna się ślimaczyć, ręce naturalnie sięgają po starego, dobrego curla. Ale standardowy curl po prostu wyświetla treść odpowiedzi, a żeby wyciągnąć czasy poszczególnych faz połączenia, musisz zbudować potworny szablon z tuzinem zmiennych za pomocą flagi -w. Albo odpalasz przeglądarkę, otwierasz zakładkę Sieć w DevTools i podziwiasz tam ładny wykres kaskadowy. Na konsoli zdalnego serwera nie możesz otworzyć przeglądarki, a przekopywanie się przez surowe wyniki to mordęga.
Niedawno natknąłem się na httptap. To niezłe narzędzie Pythona, które rozkłada dowolne żądanie HTTP na składowe fazy: DNS, uzgadnianie TCP, negocjację TLS, czas do pierwszego bajtu (TTFB) i transfer treści odpowiedzi. Wszystko to wyświetlane jako czytelny wykres kaskadowy prosto w konsoli.
Pod maską i dlaczego tego potrzebujesz
Narzędzie jest zbudowane w Pythonie z użyciem httpx, httpcore, dnspython oraz biblioteki Rich do renderowania interfejsu. Nie mierzy tylko całkowitego czasu odpowiedzi — wpija się w śledzenie stosu sieciowego i pokazuje dokładnie, na którym etapie żądanie utknęło.

Jeśli kiedykolwiek używałeś projektu httpstat, koncepcja będzie znajoma. Ale httptap ma kilka kluczowych różnic:
- Śledzi łańcuchy przekierowań i mierzy czas każdego kroku osobno, pokazując tabelę podsumowującą.
- Obsługuje kontrole budżetu opóźnień (SLO) z czytelnymi kodami wyjścia.
- Sprawdza certyfikaty TLS: raportuje nazwę hosta (CN), algorytm szyfrowania, wersję protokołu i dni do wygaśnięcia.
- Eksportuje szczegółowy ustrukturyzowany JSON ze wszystkimi metrykami do automatyzacji.
- Rozumie flagi curla (
-X,-L,-H,-k,-x), więc nie musisz przestawiać palców.
Jak zainstalować i uruchomić
Najszybszy sposób na instalację na macOS lub Linuksie to Homebrew:
brew install httptap
Jeśli wolisz narzędzia Pythona, pip lub uv też zadziałają:
uv pip install httptap
# или
pip install httptap
Jest też gotowy obraz Docker w rejestrze GitHub Packages:
docker run --rm ghcr.io/ozeranskii/httptap:latest https://example.com
Podstawowe użycie jest proste:
httptap https://httpbin.io/get
Narzędzie wykona żądanie i wyświetli elegancką tabelę z czasami każdego etapu, kodem statusu i informacjami o sieci (w tym wersja protokołu HTTP/2 i rodzina adresów IPv4/IPv6).
Co potrafi narzędzie w praktyce
Praca z dowolnymi metodami HTTP i ciałami żądań
Narzędzie wysyła JSON lub XML bez problemów. Jeśli przekażesz flagę --data bez jawnego określenia metody, narzędzie samo przełączy się na POST, naśladując zachowanie curla:
httptap https://httpbin.io/post --data '{"status": "testing", "source": "httptap"}'
Jeśli dane znajdują się w pliku, możesz przekazać ścieżkę za pomocą składni @:
httptap https://httpbin.io/post --data @payload.json
Dla innych metod dostępna jest znajoma flaga --method (lub -X):
httptap https://httpbin.io/put --method PUT --data '{"key": "value"}'
Śledzenie łańcuchów przekierowań
Niewiele narzędzi potrafi prawidłowo pokazać, ile czasu zajmuje seria odpowiedzi 301 i 302. Tutaj wystarczy dodać flagę --follow (lub -L):
httptap --follow https://httpbin.io/redirect/2

Wynik będzie zawierał szczegółowy rozkład dla każdego pośredniego hosta oraz końcowy wiersz z całkowitym czasem.
Sprawdzanie budżetów opóźnień w CI
Jedną z najbardziej przydatnych funkcji projektu jest flaga --slo. Zamienia narzędzie w instrument dymkowy i bramkowy dla pipeline'ów budowania:
httptap --slo total=500,ttfb=200 https://api.example.com/health
Jeśli docelowa usługa odpowie kodem 200, ale TTFB przekroczy 200 milisekund lub całkowity czas przekroczy 500 milisekund, narzędzie zwróci kod wyjścia 4. W przypadku błędu sieci zwraca kod 75 (EX_TEMPFAIL według standardu BSD sysexits).
Dzięki rozdzieleniu kodu możesz skonfigurować skrypt wdrożeniowy, aby rozróżniać błędy sieci od pogorszenia wydajności:
httptap --slo total=1500,tls=200 https://staging.example.com/
case $? in
0) echo "Сервис уложился в нормативы" ;;
4) echo "Нарушен SLO по времени ответа"; exit 1 ;;
75) echo "Временный сетевой сбой, повторяем проверку" ;;
esac
Skrypty i zwięzły wynik
Do automatyzacji i zadań cron graficzne wyniki Rich mogą być nadmiarowe. Dla takich scenariuszy dostępne są dwa tryby:
-
Tryb zwięzłej linii
--compactdla logów:httptap --compact https://httpbin.io/get -
Strumień tekstowy metryk
--metrics-only:httptap --metrics-only https://httpbin.io/getOtrzymasz z powrotem jedną linię w stylu:
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 -
Eksport JSON przez
--json out/report.json, gdzie zapisane są czasy, nagłówki, parametry TLS i adresy IP.
Niestandardowe resolwery i rozszerzalność
Jeśli piszesz wewnętrzne narzędzia w Pythonie, httptap może być używane jako biblioteka. Architektura opiera się na protokołach (typing.Protocol), więc komponenty można łatwo wymieniać. Na przykład możesz nadpisać resolver DNS, aby przetestować odpowiedź konkretnego IP bez modyfikowania /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")
Narzędzie okazało się zwięzłe, szybkie i skoncentrowane na jednym konkretnym zadaniu. Ładnie wypełnia lukę między surowym curl -w a ciężkimi graficznymi profilerami.
Utilita będzie przydatna dla inżynierów operacyjnych do szybkiej diagnostyki wolnych punktów końcowych na serwerach, programistów backend do mierzenia opóźnień zewnętrznych API oraz zespołów QA do sprawdzania SLO bezpośrednio w pipeline'ach. Spróbuj zainstalować ją lokalnie i przez kilka dni zastąpić nią zwykły curl -I. Różnica w czytelności jest od razu widoczna.
Powiązane projekty