http: adjust log level for request failure
Failed requests due to API client errors are to be marked as DEBUG. The Error log level should be reserved to signal problems with the cluster and are actionable for nomad system operators. Logs due to misbehaving API clients don't represent a system level problem and seem spurius to nomad maintainers at best. These log messages can also be attack vectors for deniel of service attacks by filling servers disk space with spurious log messages.
This commit is contained in:
parent
4559f95c58
commit
b8fb32f5d2
|
@ -467,7 +467,11 @@ func (s *HTTPServer) wrap(handler func(resp http.ResponseWriter, req *http.Reque
|
|||
|
||||
resp.WriteHeader(code)
|
||||
resp.Write([]byte(errMsg))
|
||||
s.logger.Error("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
if isAPIClientError(code) {
|
||||
s.logger.Debug("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
} else {
|
||||
s.logger.Error("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -521,7 +525,11 @@ func (s *HTTPServer) wrapNonJSON(handler func(resp http.ResponseWriter, req *htt
|
|||
code, errMsg := errCodeFromHandler(err)
|
||||
resp.WriteHeader(code)
|
||||
resp.Write([]byte(errMsg))
|
||||
s.logger.Error("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
if isAPIClientError(code) {
|
||||
s.logger.Debug("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
} else {
|
||||
s.logger.Error("request failed", "method", req.Method, "path", reqURL, "error", err, "code", code)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -533,6 +541,11 @@ func (s *HTTPServer) wrapNonJSON(handler func(resp http.ResponseWriter, req *htt
|
|||
return f
|
||||
}
|
||||
|
||||
// isAPIClientError returns true if the passed http code represents a client error
|
||||
func isAPIClientError(code int) bool {
|
||||
return 400 <= code && code <= 499
|
||||
}
|
||||
|
||||
// decodeBody is used to decode a JSON request body
|
||||
func decodeBody(req *http.Request, out interface{}) error {
|
||||
dec := json.NewDecoder(req.Body)
|
||||
|
|
|
@ -1082,6 +1082,18 @@ func TestHTTPServer_Limits_OK(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func Test_IsAPIClientError(t *testing.T) {
|
||||
trueCases := []int{400, 403, 404, 499}
|
||||
for _, c := range trueCases {
|
||||
require.Truef(t, isAPIClientError(c), "code: %v", c)
|
||||
}
|
||||
|
||||
falseCases := []int{100, 300, 500, 501, 505}
|
||||
for _, c := range falseCases {
|
||||
require.Falsef(t, isAPIClientError(c), "code: %v", c)
|
||||
}
|
||||
}
|
||||
|
||||
func httpTest(t testing.TB, cb func(c *Config), f func(srv *TestAgent)) {
|
||||
s := makeHTTPServer(t, cb)
|
||||
defer s.Shutdown()
|
||||
|
|
Loading…
Reference in New Issue