diff --git a/api/graphite_proxy.go b/api/graphite_proxy.go index 2e07f07f04..66d4259bde 100644 --- a/api/graphite_proxy.go +++ b/api/graphite_proxy.go @@ -1,12 +1,16 @@ package api import ( + "context" "fmt" "net/http" "net/http/httputil" "net/url" "sync" + log "github.com/sirupsen/logrus" + + "github.com/grafana/metrictank/api/response" "github.com/grafana/metrictank/stats" ) @@ -46,5 +50,20 @@ func NewGraphiteProxy(u *url.URL) *httputil.ReverseProxy { resp.Header.Del("content-length") return nil } + + graphiteProxy.ErrorHandler = func(rw http.ResponseWriter, req *http.Request, err error) { + if graphiteProxy.ErrorLog != nil { + graphiteProxy.ErrorLog.Printf("http: proxy error: %v", err) + } else { + log.Printf("http: proxy error: %v", err) + } + + if req.Context().Err() == context.Canceled { + // if the client disconnected before the query was fully processed + rw.WriteHeader(response.HttpClientClosedRequest) + } else { + rw.WriteHeader(http.StatusBadGateway) + } + } return graphiteProxy } diff --git a/api/response/error.go b/api/response/error.go index 317a83cece..9ba5e1f5c4 100644 --- a/api/response/error.go +++ b/api/response/error.go @@ -96,4 +96,6 @@ func (r *ErrorResp) Headers() (headers map[string]string) { return headers } -var RequestCanceledErr = NewError(499, "request canceled") +const HttpClientClosedRequest = 499 + +var RequestCanceledErr = NewError(HttpClientClosedRequest, "request canceled")