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:
Aliaksandr Valialkin
2025-07-05 23:49:02 +02:00
parent e4fc202ab8
commit 524f58c78c
2 changed files with 11 additions and 7 deletions

View File

@@ -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.

View File

@@ -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