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:
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