mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2026-05-17 00:26:36 +03:00
lib/httpserver: log the client address additionally to the requestURI in the SendPrometheusError()
This should allow detecting the client, which led to the error logged via SendPrometheusError() function,
e.g. this improves troubleshooting of the logged errors.
This is a follow-up for c9bb4ddeed
This commit is contained in:
@@ -653,10 +653,7 @@ func (rwa *responseWriterWithAbort) abort() {
|
||||
// Errorf writes formatted error message to w and to logger.
|
||||
func Errorf(w http.ResponseWriter, r *http.Request, format string, args ...any) {
|
||||
errStr := fmt.Sprintf(format, args...)
|
||||
remoteAddr := GetQuotedRemoteAddr(r)
|
||||
requestURI := GetRequestURI(r)
|
||||
errStr = fmt.Sprintf("remoteAddr: %s; requestURI: %s; %s", remoteAddr, requestURI, errStr)
|
||||
logger.WarnfSkipframes(1, "%s", errStr)
|
||||
logHTTPError(r, errStr)
|
||||
|
||||
// Extract statusCode from args
|
||||
statusCode := http.StatusBadRequest
|
||||
@@ -678,6 +675,14 @@ func Errorf(w http.ResponseWriter, r *http.Request, format string, args ...any)
|
||||
http.Error(w, errStr, statusCode)
|
||||
}
|
||||
|
||||
// logHTTPError logs the errStr with the client remote address and the request URI obtained from r.
|
||||
func logHTTPError(r *http.Request, errStr string) {
|
||||
remoteAddr := GetQuotedRemoteAddr(r)
|
||||
requestURI := GetRequestURI(r)
|
||||
errStr = fmt.Sprintf("remoteAddr: %s; requestURI: %s; %s", remoteAddr, requestURI, errStr)
|
||||
logger.WarnfSkipframes(2, "%s", errStr)
|
||||
}
|
||||
|
||||
// ErrorWithStatusCode is error with HTTP status code.
|
||||
//
|
||||
// The given StatusCode is sent to client when the error is passed to Errorf.
|
||||
|
||||
@@ -3,15 +3,14 @@ package httpserver
|
||||
import (
|
||||
"errors"
|
||||
"net/http"
|
||||
|
||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
||||
)
|
||||
|
||||
// SendPrometheusError sends err to w in Prometheus querying API response format.
|
||||
//
|
||||
// See https://prometheus.io/docs/prometheus/latest/querying/api/#format-overview for more details
|
||||
func SendPrometheusError(w http.ResponseWriter, r *http.Request, err error) {
|
||||
logger.WarnfSkipframes(1, "error in %q: %s", GetRequestURI(r), err)
|
||||
errStr := err.Error()
|
||||
logHTTPError(r, errStr)
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
statusCode := http.StatusUnprocessableEntity
|
||||
|
||||
Reference in New Issue
Block a user