67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| // Package logging provides various logging helpers for ARC
 | |
| package logging
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"io"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/go-logr/logr"
 | |
| 	"github.com/gregjones/httpcache"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	// https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting
 | |
| 	headerRateLimitRemaining = "X-RateLimit-Remaining"
 | |
| )
 | |
| 
 | |
| // Transport wraps a transport with metrics monitoring
 | |
| type Transport struct {
 | |
| 	Transport http.RoundTripper
 | |
| 
 | |
| 	Log *logr.Logger
 | |
| }
 | |
| 
 | |
| func (t Transport) RoundTrip(req *http.Request) (*http.Response, error) {
 | |
| 	resp, err := t.Transport.RoundTrip(req)
 | |
| 	if resp != nil {
 | |
| 		t.log(req, resp)
 | |
| 	}
 | |
| 	return resp, err
 | |
| }
 | |
| 
 | |
| func (t Transport) log(req *http.Request, resp *http.Response) {
 | |
| 	if t.Log == nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	var args []interface{}
 | |
| 
 | |
| 	marked := resp.Header.Get(httpcache.XFromCache) == "1"
 | |
| 
 | |
| 	args = append(args, "from_cache", marked, "method", req.Method, "url", req.URL.String())
 | |
| 
 | |
| 	if !marked {
 | |
| 		// Do not log outdated rate limit remaining value
 | |
| 
 | |
| 		remaining := resp.Header.Get(headerRateLimitRemaining)
 | |
| 
 | |
| 		args = append(args, "ratelimit_remaining", remaining)
 | |
| 	}
 | |
| 
 | |
| 	if t.Log.V(4).Enabled() {
 | |
| 		var buf bytes.Buffer
 | |
| 
 | |
| 		if _, err := io.Copy(&buf, resp.Body); err != nil {
 | |
| 			t.Log.V(3).Info("unable to copy http response", "error", err)
 | |
| 		}
 | |
| 		resp.Body.Close()
 | |
| 
 | |
| 		t.Log.V(4).Info("Logging HTTP round-trip", "method", req.Method, "requestHeader", req.Header, "statusCode", resp.StatusCode, "responseHeader", resp.Header, "responseBody", buf.String())
 | |
| 
 | |
| 		resp.Body = io.NopCloser(&buf)
 | |
| 	}
 | |
| 
 | |
| 	t.Log.V(3).Info("Seen HTTP response", args...)
 | |
| }
 |