feat(go): step 2 — per-phase request breakdown via httptrace

Instruments HTTP requests with net/http/httptrace.ClientTrace to capture
timestamps for DNS, TCP connect, TLS handshake, TTFB, and body transfer.
TLS row is omitted automatically for plain http:// URLs. Output is an
aligned text table with a separator before the Total row.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 00:23:36 +02:00
parent a588eb3b0e
commit 0ecfb9bb1a
5 changed files with 184 additions and 10 deletions

View File

@@ -0,0 +1,80 @@
# Step 2 — Per-Phase Breakdown
## What this step delivers
`latprobe` now shows a full breakdown of every phase of an HTTP request:
| Phase | What it measures |
|-------|-----------------|
| DNS lookup | Time to resolve the hostname (`DNSStart``DNSDone`) |
| TCP connect | Time to establish the TCP connection (`ConnectStart``ConnectDone`) |
| TLS handshake | Time to complete TLS negotiation — HTTPS only (`TLSHandshakeStart``TLSHandshakeDone`) |
| Server (TTFB) | Time from request sent to first response byte (`WroteRequest``GotFirstResponseByte`) |
| Transfer | Time to download the response body (`GotFirstResponseByte` → body closed) |
| Total | Wall-clock time for the entire request |
The TLS row is omitted automatically for plain `http://` URLs.
Implemented via `net/http/httptrace.ClientTrace` — stdlib only, no external dependencies.
## Build
```sh
cd go
go build -o latprobe .
```
## Usage
```sh
latprobe <url> [url ...]
```
## Examples
### HTTPS (all phases present)
```sh
$ ./latprobe https://example.com
https://example.com (200)
DNS lookup : 18.21 ms
TCP connect : 10.12 ms
TLS handshake : 36.11 ms
Server (TTFB) : 21.95 ms
Transfer : 0.18 ms
─────────────────────────────
Total : 88.00 ms
```
### HTTP (TLS row omitted)
```sh
$ ./latprobe http://example.com
http://example.com (200)
DNS lookup : 1.64 ms
TCP connect : 9.29 ms
Server (TTFB) : 17.96 ms
Transfer : 0.07 ms
─────────────────────────────
Total : 29.56 ms
```
### Multiple URLs
```sh
$ ./latprobe https://example.com https://www.google.com
https://example.com (200)
DNS lookup : 18.21 ms
...
https://www.google.com (200)
DNS lookup : 7.15 ms
...
```
## Notes
- **DNS absent on repeat connections**: when the OS has cached the DNS result,
the DNS phase may be very short or absent. This is expected.
- **Phases don't always sum exactly to Total**: the trace hooks introduce
negligible overhead between events; the difference is typically < 1 ms.