X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7db3ceda16742b65d73ebbc05d02351a5e0496bd..0945afa5523fb45f827750e4d1700df4ff222295:/sdk/go/httpserver/logger.go diff --git a/sdk/go/httpserver/logger.go b/sdk/go/httpserver/logger.go index 50191eb3f0..5336488df0 100644 --- a/sdk/go/httpserver/logger.go +++ b/sdk/go/httpserver/logger.go @@ -9,8 +9,8 @@ import ( "net/http" "time" - "git.curoverse.com/arvados.git/sdk/go/ctxlog" - "git.curoverse.com/arvados.git/sdk/go/stats" + "git.arvados.org/arvados.git/sdk/go/ctxlog" + "git.arvados.org/arvados.git/sdk/go/stats" "github.com/sirupsen/logrus" ) @@ -53,10 +53,21 @@ func LogRequests(h http.Handler) http.Handler { logRequest(w, req, lgr) defer logResponse(w, req, lgr) - h.ServeHTTP(w, req) + h.ServeHTTP(rewrapResponseWriter(w, wrapped), req) }) } +// Rewrap w to restore additional interfaces provided by wrapped. +func rewrapResponseWriter(w http.ResponseWriter, wrapped http.ResponseWriter) http.ResponseWriter { + if hijacker, ok := wrapped.(http.Hijacker); ok { + return struct { + http.ResponseWriter + http.Hijacker + }{w, hijacker} + } + return w +} + func Logger(req *http.Request) logrus.FieldLogger { return ctxlog.FromContext(req.Context()) } @@ -68,10 +79,16 @@ func logRequest(w *responseTimer, req *http.Request, lgr *logrus.Entry) { func logResponse(w *responseTimer, req *http.Request, lgr *logrus.Entry) { if tStart, ok := req.Context().Value(&requestTimeContextKey).(time.Time); ok { tDone := time.Now() + writeTime := w.writeTime + if !w.wrote { + // Empty response body. Header was sent when + // handler exited. + writeTime = tDone + } lgr = lgr.WithFields(logrus.Fields{ "timeTotal": stats.Duration(tDone.Sub(tStart)), - "timeToStatus": stats.Duration(w.writeTime.Sub(tStart)), - "timeWriteBody": stats.Duration(tDone.Sub(w.writeTime)), + "timeToStatus": stats.Duration(writeTime.Sub(tStart)), + "timeWriteBody": stats.Duration(tDone.Sub(writeTime)), }) } respCode := w.WroteStatus()