Tracing HTTP Requests with Go's net/HTTP/httptrace
Le package net/http/httptrace, présent depuis Go 1.7, expose des hooks permettant d'observer des étapes internes d'une requête HTTP sortante telles que la résolution DNS, l'acquisition de connexion, la poignée TLS et l'arrivée du premier octet de réponse. Au lieu d'une interface Tracer, il attache un *ClientTrace au context.Context, ce qui permet de propager le traçage automatiquement avec la requête, d'éviter l'état mutable partagé et de n'introduire qu'un léger coût lorsque le trace est absent. ClientTrace est une structure contenant des champs fonctions optionnels pour chaque hook (DNSStart, ConnectStart, TLSHandshakeDone, GotFirstResponseByte, etc.), de sorte que l'on ne définit que les hooks utiles et que de nouveaux hooks peuvent être ajoutés sans casser le code existant. L'article illustre deux usages pratiques — un CLI style curl qui enregistre des timestamps dans chaque hook pour afficher une répartition des durées, et un http.RoundTripper qui attache un ClientTrace à chaque requête pour journaliser les timings (en enveloppant éventuellement res.Body pour mesurer la durée totale), en précisant que les traces s'ajoutent (se composent) si plusieurs traces sont fixées sur le même contexte. Enfin, httptrace permet de vérifier la réutilisation des connexions via GotConnInfo.Reused et d'autres métadonnées, et l'auteur conclut que ce petit API contextuel est suffisant pour déboguer les requêtes lentes sans recourir immédiatement à des agents APM ou bibliothèques externes.