← 返回全部文章

Subtrace 不是“全协议内核抓包”:我按官方仓库重新核对了一遍

Subtrace 是一个用一条命令查看后端 HTTP 请求的网络检查器。官方仓库确认了 Linux 安装、HTTP/2、过滤规则、敏感信息脱敏和 SYS_PTRACE 要求,但 X 帖中的 Apache-2.0、eBPF、PostgreSQL/Redis/gRPC 全协议等说法没有得到仓库资料支持。

X 上有人把 Subtrace 介绍成“后端网络侦探”:在内核层监控所有出入请求,支持 HTTP 、 gRPC 、 PostgreSQL 、 Redis,还能在生产环境以几乎没有损耗的方式定位故障。

这个介绍里有一些方向是对的,但也混进了几处需要核对的说法。我查了 Subtrace 当前 GitHub 仓库、 README 、官方文档和许可证文件,结论如下:

  • Subtrace 确实是一个后端网络请求检查器。
  • 官方文档明确支持查看 HTTP 请求,并提供 HTTP/2 控制项。
  • 官方 README 提供 Linux 安装方式和 subtrace run 启动方式。
  • 官方文档要求 Linux SYS_PTRACE 能力,容器部署时需要额外配置。
  • 仓库许可证是 BSD 3-Clause,不是 X 帖写的 Apache-2.0 。
  • 公开仓库资料没有确认 PostgreSQL 、 Redis 、 gRPC 全部作为可视化协议支持,也没有把工具定位为 eBPF 抓包工具。

Subtrace 是做什么的

Subtrace 的官方定位是“Network inspector for your backend”,也就是给后端使用的网络检查器。

它的使用方式很直接:在启动后端服务的命令前加上 subtrace run --,然后打开它提供的链接查看网络请求流。


# 安装 Linux 版本
curl -fsSL https://subtrace.dev/install.sh | sh

# Node.js
subtrace run -- npm run dev

# Go
subtrace run -- go run .

# FastAPI
subtrace run -- fastapi run main.py

# 其他程序
subtrace run -- [command]

官方快速开始文档给出的流程是:安装 CLI,用 Subtrace 包住原来的启动命令,再打开 subt.link 地址查看后端服务器的网络日志。

它更像一个临时打开的请求观察窗口,而不是要求你先改一遍业务代码、再接入一整套复杂监控平台。

它能帮你看什么

当后端接口变慢或报错时,问题可能出在当前服务,也可能出在它调用的第三方接口、内部服务或认证流程。

Subtrace 适合帮助你先回答这些问题:

  • 当前服务有没有发出请求?
  • 请求发给了哪个地址?
  • 哪个调用返回了错误状态?
  • 请求是不是卡在某个外部服务上?
  • 某个接口的响应时间是否明显变长?
  • 服务启动后,实际发生了哪些网络调用?

这类信息对调试很有用。尤其在本地复现困难、调用链较长、错误只在特定环境出现时,先看到真实请求,比盲目猜测更省时间。

官方资料确认的能力边界

HTTP 请求是明确支持的主线

README 和快速开始文档反复强调的是查看后端 HTTP 请求。仓库还提供了 Node.js 、 Go 、 FastAPI 、 Flask 、 Gunicorn 、 Laravel 等启动示例。

仓库中也有 SUBTRACE_HTTP2 环境变量,用于控制 HTTP/2 捕获,默认开启。这可以确认 HTTP/2 相关处理存在。

但这和“所有协议都能完整解析”不是一回事。当前公开 README 和文档没有给出 PostgreSQL 、 Redis 、 gRPC 的完整支持列表、字段说明或示例,因此不建议把它宣传成全协议网络分析器。

不需要修改业务代码

官方快速开始方式是在启动命令外包一层 subtrace run --。对于已有服务,这通常比在每个 HTTP 客户端里加埋点更轻量。

不过“不改业务代码”不等于“不需要改部署配置”。如果服务在容器、 Kubernetes 或 ECS 中运行,仍然可能需要添加 Linux 能力和启动参数。

可以用规则过滤请求

Subtrace 默认追踪所有请求,也提供 YAML 规则过滤。例如只保留错误响应,排除健康检查:

rules:
  - if: response.status >= 400
    then: include
  - if: request.url == "/health"
    then: exclude
  - if: request.method == "HEAD"
    then: exclude

规则按顺序匹配,命中第一条后就停止判断。如果没有匹配规则,请求默认会被保留。

这对生产排查很重要。没有过滤时,健康检查、静态资源和大量正常请求会淹没真正的问题。

安全方面要特别小心

网络请求里经常有 Cookie 、 Authorization 、 Set-Cookie 等敏感字段。 Subtrace 官方文档说明,默认会脱敏已知认证凭证。

文档提供了三种处理方式:

  • redact:完全脱敏,也是默认值。
  • hash:用 SHA-256 形式替代原值,方便判断不同请求是否使用了同一凭证。
  • keep:保留完整凭证明文,官方文档明确标注为不建议。

如果使用配置文件,可以这样指定脱敏模式:

authCredentials: "redact"

不要为了调试方便把它改成 keep 后直接上传日志或分享链接。网络日志本身就可能包含用户身份、内部地址、请求参数和第三方密钥。

第一次使用时,建议先用测试服务验证:日志会发到哪里,谁能打开链接,链接是否公开,记录会保留多久,退出后是否还能访问。

容器和生产环境不是开箱即用

Subtrace 官方文档明确要求 SYS_PTRACE 能力。

Docker 中可能需要:

docker run -it --rm --cap-add=SYS_PTRACE debian:12

Docker Compose 中要给服务增加:

services:
  my-app:
    command: "subtrace run -- ./start.sh"
    cap_add:
      - SYS_PTRACE

Kubernetes 也需要在容器的 securityContext 中加入这个能力。 ECS Fargate 等环境则要修改任务定义。

这意味着 Subtrace 不是把一条命令复制进生产环境就结束了。增加 Linux 能力会改变容器的权限边界,部署前要让负责基础设施和安全的人一起评估。

性能数据怎么看

Subtrace 官方基准文档称,在其测试条件下,极端负载下额外延迟低于 1 毫秒,典型负载下预计低于 0.1 毫秒。

测试使用 AWS m5a.4xlarge,16 个 vCPU 、 64 GiB 内存,客户端和服务端在同一台机器上,并发客户端持续发送请求 10 秒。

这组数据可以作为参考,但不能直接变成“生产环境几乎零损耗”。真实应用的请求大小、并发量、网络距离、容器配置和日志策略都可能不同。官方文档也建议在自己的应用上测量实际影响。

许可证也需要纠正

X 帖写的是 Apache-2.0,但仓库根目录的 LICENSE 文件明确写的是 BSD 3-Clause License,版权年份为 2024,版权主体是 Subtrace, Inc.。

两者都允许较宽松的使用和再发布,但具体义务并不完全相同。涉及二次分发、商业集成或产品打包时,应以仓库当前许可证文件为准。

适合谁

Subtrace 适合:

  • 正在排查后端外部请求失败或变慢的开发者。
  • 想快速观察服务请求,不想先接入完整可观测平台的团队。
  • 需要在本地、测试环境或临时生产排障中查看 HTTP 请求的人。
  • 使用 Node 、 Go 、 Python 、 PHP 等后端技术栈,并能控制启动命令的人。

它不一定适合:

  • 需要长期指标、告警、链路追踪和历史分析的大型团队。
  • 不能接受请求数据离开本地环境的项目。
  • 没有权限调整容器能力和部署配置的使用者。
  • 把数据库协议、消息队列和所有内部网络流量都要求完整解析的场景。

最后总结

Subtrace 的真实价值比较明确:用一条启动命令观察后端 HTTP 请求,帮助开发者快速定位外部调用、状态码和响应问题。它的上手成本低,官方也提供了 Docker 、 Docker Compose 、 Kubernetes 和多种后端框架的文档。

但 X 帖中的“Apache-2.0 、 eBPF 、全协议、生产环境几乎零损耗”不能全部照搬。许可证、协议范围、底层实现和性能结论,都应该回到官方仓库和实际环境重新确认。

如果你要试,建议先从本地或测试环境开始,启用默认凭证脱敏,确认日志可见范围,再决定是否放进生产排障流程。

来源链接:https://github.com/subtrace/subtrace

官方文档:https://subtrace.dev/docs

X 信息入口:https://x.com/cycledecoded/status/2084593850795135319

来源:https://github.com/subtrace/subtrace