An HTTP client for go-server-timing middleware.
- An HTTP
ClientorRoundTripper, 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.Timerto your server handler, or create it in the handler function itself.Wrap the
http.Handlerwithservertiming.Middleware.In the handler function, having
timerof type*clienttiming.Timerandreqis the*http.Request:a. Create an
*http.Clientusingtimer.Client(req.Context())b. Or create an
http.RoundTripperusingtimer.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:
typehandlerstruct {
timer*clienttiming.Timer
}Our usage of that handler will be:
funcmain() {
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 contextc:=h.timer.Client(r.Context())
// Perform HTTP requests, as many as you likeresp, err:=c.Get("https://golang.org/")
...
}func (h*handler) ServeHTTP(w http.ResponseWriter, r*http.Request) {
// Instrument an http client with a timing transportc:=&http.Client{
Transport: h.timer.Transport(r.Context()),
}
// Perform HTTP requests, as many as you likeresp, err:=c.Get("https://golang.org/")
...
}Run the example
go run ./example/main.go