>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Python

在终端直接剖析 HTTP 请求:httptap

httptap banner

当外部服务或内部微服务突然开始变慢时,你自然会伸手去用老牌的 curl。但标准 curl 只输出响应体,要提取连接阶段的耗时,你得通过 -w 标志构建一个包含十几个变量的复杂模板。或者你打开浏览器,进入 DevTools 的 Network 标签,欣赏那里漂亮的瀑布图。但在远程服务器的终端上,你无法打开浏览器,挖掘原始输出也很痛苦。

我最近发现了 httptap。这是一个简洁的 Python 工具,将任何 HTTP 请求分解为其组成阶段:DNS、TCP 握手、TLS 协商、首字节时间(TTFB)和响应体传输。所有这些都以清晰的瀑布图形式直接显示在控制台中。


底层原理及使用场景

该工具使用 Python 构建,集成了 httpx、httpcore、dnspython 和 Rich 库来渲染界面。它不仅测量总响应时间——还能挂接到网络堆栈追踪,精确显示请求卡在哪个阶段。

sample-output.png

如果你使用过 httpstat 项目,这个概念会让你感到熟悉。但 httptap 有几个关键区别:

  • 它可以追踪重定向链,单独测量每一步的耗时,并显示汇总表。
  • 支持延迟预算(SLO)检查,并提供人类可读的退出码。
  • 检查 TLS 证书:报告主机名(CN)、加密算法、协议版本和距过期天数。
  • 导出详细的结构化 JSON,包含所有指标,便于自动化。
  • 理解 curl 标志(-X-L-H-k-x),无需重新适应。

安装与运行

在 macOS 或 Linux 上最快的安装方式是使用 Homebrew:

brew install httptap

如果更喜欢 Python 工具,可以用 pip 或 uv:

uv pip install httptap
# или
pip install httptap

GitHub Packages 注册表中也提供了现成的 Docker 镜像:

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

基本用法很简单:

httptap https://httpbin.io/get

该工具会发起请求并输出一个整洁的表格,包含每一步的耗时、状态码和网络信息(包括 HTTP/2 协议版本和 IPv4/IPv6 地址族)。


工具的实际能力

处理任意 HTTP 方法和请求体

该工具可以顺利发送 JSON 或 XML。如果你传入 --data 标志而没有明确指定方法,该工具会自动切换到 POST,模仿 curl 的行为:

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

如果数据在文件中,可以通过 @ 语法传递路径:

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

对于其他方法,可以使用熟悉的 --method 标志(或 -X):

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

追踪重定向链

很少有工具能正确显示一系列 301 和 302 响应需要多少时间。这里你只需要添加 --follow 标志(或 -L):

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

sample-follow-redirects-output.png

输出将包含每个中间主机的详细分解,以及包含总时间的最后一行。

在 CI 中检查延迟预算

该项目最有用的功能之一是 --slo 标志。它将工具变成构建流水线的冒烟测试和门控工具:

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

如果目标服务返回 200 状态但 TTFB 超过 200 毫秒或总时间超过 500 毫秒,工具将返回退出码 27。如果发生网络错误,则返回代码 28(按 BSD sysexits 标准的 EX_TEMPFAIL)。

由于代码分离,你可以配置部署脚本来区分网络故障和性能下降:

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

脚本化与紧凑输出

对于自动化和 cron 作业,Rich 的图形输出可能过于冗余。针对这种情况提供了两种模式:

  1. 用于日志的紧凑行模式 29:

    httptap --compact https://httpbin.io/get
    
  2. 指标文本流 30:

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

    你会收到一条类似这样的单行回复:

    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. 通过 31 导出 JSON,其中时间、头部、TLS 参数和 IP 地址都会被保存。


自定义解析器与扩展性

如果你在编写内部 Python 工具,httptap 可以作为库使用。架构基于协议(typing.Protocol),因此组件易于替换。例如,你可以覆盖 DNS 解析器来测试特定 IP 的响应,而无需修改 32:

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

这个工具小巧、快速,专注于一个特定任务。它很好地填补了原始 33 和重量级图形分析器之间的空白。

该工具对于运维工程师快速诊断服务器上缓慢的端点、后端开发人员测量外部 API 延迟,以及 QA 团队在流水线中检查 SLO 都很有用。试着在本地安装它,用它替换你常用的 34 两三天。清晰度的差异立竿见影。

相关项目