>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Python

Analiza żądań HTTP bezpośrednio w terminalu dzięki httptap

httptap banner

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.

sample-output.png

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

sample-follow-redirects-output.png

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:

  1. Tryb zwięzłej linii --compact dla logów:

    httptap --compact https://httpbin.io/get
    
  2. Strumień tekstowy metryk --metrics-only:

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

    Otrzymasz 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
    
  3. 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