Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: improve debug log readability #861

Merged
merged 5 commits into from
Mar 9, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 19 additions & 14 deletions internal/trace/transport.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,56 +16,61 @@ limitations under the License.
package trace

import (
"fmt"
"net/http"
"strings"

"github.com/sirupsen/logrus"
"sync/atomic"
)

// Transport is an http.RoundTripper that keeps track of the in-flight
// request and add hooks to report HTTP tracing events.
type Transport struct {
http.RoundTripper
count uint64
}

// NewTransport creates and returns a new instance of Transport
func NewTransport(base http.RoundTripper) *Transport {
return &Transport{base}
return &Transport{
RoundTripper: base,
}
}

// RoundTrip calls base roundtrip while keeping track of the current request.
func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
number := atomic.AddUint64(&t.count, 1) - 1
ctx := req.Context()
e := Logger(ctx)

e.Debugf("> Request URL: %q", req.URL)
e.Debugf("> Request method: %q", req.Method)
e.Debugf("> Request headers:")
logHeader(req.Header, e)
// log the request
e.Debugf("Request #%d\n> Request URL: %q\n> Request method: %q\n> Request headers:\n%s",
number, req.URL, req.Method, logHeader(req.Header))
wangxiaoxuan273 marked this conversation as resolved.
Show resolved Hide resolved

// log the response
resp, err = t.RoundTripper.RoundTrip(req)
if err != nil {
e.Errorf("Error in getting response: %w", err)
} else if resp == nil {
e.Errorf("No response obtained for request %s %q", req.Method, req.URL)
} else {
e.Debugf("< Response Status: %q", resp.Status)
e.Debugf("< Response headers:")
logHeader(resp.Header, e)
e.Debugf("Response #%d\n< Response Status: %q\n< Response headers:\n%s",
number, resp.Status, logHeader(resp.Header))
}
return resp, err
}

// logHeader prints out the provided header keys and values, with auth header
// scrubbed.
func logHeader(header http.Header, e logrus.FieldLogger) {
func logHeader(header http.Header) string {
if len(header) > 0 {
headers := []string{}
for k, v := range header {
if strings.EqualFold(k, "Authorization") {
v = []string{"*****"}
}
e.Debugf(" %q: %q", k, strings.Join(v, ", "))
headers = append(headers, fmt.Sprintf(" %q: %q", k, strings.Join(v, ", ")))
}
} else {
e.Debugf(" Empty header")
return strings.Join(headers, "\n")
}
return " Empty header"
}