code: func (c *Client) LogRequest(r *http.Request, reqKey string) *http.Request {
  	if c.httpLogger == nil {
  		return r
  	}
  
  	t := &httpTransfer{
  		URL:    strings.SplitN(r.URL.String(), "?", 2)[0],
  		Method: r.Method,
  		Key:    reqKey,
  	}
  
  	ctx := httptrace.WithClientTrace(r.Context(), &httptrace.ClientTrace{
  		GetConn: func(_ string) {
  			atomic.CompareAndSwapInt64(&t.Start, 0, time.Now().UnixNano())
  		},
  		DNSStart: func(_ httptrace.DNSStartInfo) {
  			atomic.CompareAndSwapInt64(&t.DNSStart, 0, time.Now().UnixNano())
  		},
  		DNSDone: func(_ httptrace.DNSDoneInfo) {
  			atomic.CompareAndSwapInt64(&t.DNSEnd, 0, time.Now().UnixNano())
  		},
  		ConnectStart: func(_, _ string) {
  			atomic.CompareAndSwapInt64(&t.ConnStart, 0, time.Now().UnixNano())
  		},
  		ConnectDone: func(_, _ string, _ error) {
  			atomic.CompareAndSwapInt64(&t.ConnEnd, 0, time.Now().UnixNano())
  		},
  		TLSHandshakeStart: func() {
  			atomic.CompareAndSwapInt64(&t.TLSStart, 0, time.Now().UnixNano())
  		},
  		TLSHandshakeDone: func(_ tls.ConnectionState, _ error) {
  			atomic.CompareAndSwapInt64(&t.TLSEnd, 0, time.Now().UnixNano())
  		},
  		GotFirstResponseByte: func() {
  			atomic.CompareAndSwapInt64(&t.ResponseStart, 0, time.Now().UnixNano())
  		},
  	})
  
  	return r.WithContext(context.WithValue(ctx, transferKey, t))
  }
docs: // LogRequest tells the client to log the request's stats to the http log
  // after the response body has been read.