MCPcopy
hub / github.com/grafana/dskit / Wrap

Method Wrap

middleware/logging.go:79–148  ·  view source on GitHub ↗

Wrap implements Middleware

(next http.Handler)

Source from the content-addressed store, hash-verified

77
78// Wrap implements Middleware
79func (l Log) Wrap(next http.Handler) http.Handler {
80 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
81 begin := time.Now()
82 uri := r.RequestURI // capture the URI before running next, as it may get rewritten
83 requestLog := l.logWithRequest(r)
84 // Log headers before running 'next' in case other interceptors change the data.
85 headers, err := dumpRequestHeaders(r, l.HTTPHeadersToExclude)
86 if err != nil {
87 headers = nil
88 level.Error(requestLog).Log("msg", "could not dump request headers", "err", err)
89 }
90 var buf bytes.Buffer
91 wrapped := newBadResponseLoggingWriter(w, &buf)
92 next.ServeHTTP(wrapped, r)
93
94 statusCode, writeErr := wrapped.getStatusCode(), wrapped.getWriteError()
95
96 if writeErr != nil {
97 if errors.Is(writeErr, context.Canceled) {
98 if l.LogRequestAtInfoLevel {
99 if l.LogRequestHeaders && headers != nil {
100 level.Info(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, request cancelled: %s ws: %v; %s", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r), headers))
101 } else {
102 level.Info(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, request cancelled: %s ws: %v", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r)))
103 }
104 } else {
105 if l.LogRequestHeaders && headers != nil {
106 level.Debug(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, request cancelled: %s ws: %v; %s", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r), headers))
107 } else {
108 level.Debug(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, request cancelled: %s ws: %v", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r)))
109 }
110 }
111 } else {
112 if l.LogRequestHeaders && headers != nil {
113 level.Warn(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, error: %s ws: %v; %s", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r), headers))
114 } else {
115 level.Warn(requestLog).Log("msg", dskit_log.LazySprintf("%s %s %s, error: %s ws: %v", r.Method, uri, time.Since(begin), writeErr, IsWSHandshakeRequest(r)))
116 }
117 }
118 return
119 }
120
121 switch {
122 // success and shouldn't log successful requests.
123 case statusCode >= 200 && statusCode < 300 && l.DisableRequestSuccessLog:
124 return
125
126 case 100 <= statusCode && statusCode < 500 || statusCode == http.StatusBadGateway || statusCode == http.StatusServiceUnavailable:
127 if l.LogRequestAtInfoLevel {
128 if l.LogRequestHeaders && headers != nil {
129 level.Info(requestLog).Log("msg", dskit_log.LazySprintf("%s %s (%d) %s ws: %v; %s", r.Method, uri, statusCode, time.Since(begin), IsWSHandshakeRequest(r), string(headers)))
130 } else {
131 level.Info(requestLog).Log("msg", dskit_log.LazySprintf("%s %s (%d) %s", r.Method, uri, statusCode, time.Since(begin)))
132 }
133 } else {
134 if l.LogRequestHeaders && headers != nil {
135 level.Debug(requestLog).Log("msg", dskit_log.LazySprintf("%s %s (%d) %s ws: %v; %s", r.Method, uri, statusCode, time.Since(begin), IsWSHandshakeRequest(r), string(headers)))
136 } else {

Calls 10

logWithRequestMethod · 0.95
dumpRequestHeadersFunction · 0.85
IsWSHandshakeRequestFunction · 0.85
IsMethod · 0.80
getStatusCodeMethod · 0.65
getWriteErrorMethod · 0.65
LogMethod · 0.45
ErrorMethod · 0.45
ServeHTTPMethod · 0.45