An HTTP client for go-server-timing middleware.
- An HTTP
Client
orRoundTripper
, fully compatible with Go's standard library. - Automatically time HTTP requests sent from an HTTP handler.
- Collects all timing headers from upstream servers.
- Customize timing headers according to the request, response and error of the HTTP round trip.
go get -u github.com/posener/client-timing
-
Add a
*clienttiming.Timer
to your server handler, or create it in the handler function itself. -
Wrap the
http.Handler
withservertiming.Middleware
. -
In the handler function, having
timer
of type*clienttiming.Timer
andreq
is the*http.Request
:a. Create an
*http.Client
usingtimer.Client(req.Context())
b. Or create an
http.RoundTripper
usingtimer.Transport(req.Context())
-
Use option a or b directly or inject it to a library that accepts them, in your outgoing HTTP request from the handler.
-
That is it! the timing header will appear in the response from the handler.
Suppose we have an HTTP handler:
type handler struct {
timer *clienttiming.Timer
}
Our usage of that handler will be:
func main() {
h := &handler{
timer: clienttiming.New(clienttiming.WithName("my-server")),
}
log.Fatal(http.ListenAndServe(":8080", servertiming.Middleware(h)))
}
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Create an http client using the request context
c := h.timer.Client(r.Context())
// Perform HTTP requests, as many as you like
resp, err := c.Get("https://golang.org/")
...
}
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Instrument an http client with a timing transport
c := &http.Client{
Transport: h.timer.Transport(r.Context()),
}
// Perform HTTP requests, as many as you like
resp, err := c.Get("https://golang.org/")
...
}
Run the example
go run ./example/main.go