GitHub - posener/client-timing: An HTTP client for go-server-timing middleware. Enables automatic timing propagation through HTTP calls between servers. (original) (raw)
client-timing
An HTTP client for go-server-timing middleware.
Features:
- 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.
Install
go get -u github.com/posener/client-timing
Usage
- Add a
*clienttiming.Timerto your server handler, or create it in the handler function itself. - Wrap the
http.Handlerwith servertiming.Middleware. - In the handler function, having
timerof type*clienttiming.Timerandreqis 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.
Example
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))) }
Example for Client function:
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/")
...}
Example for Transport function:
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