From 69864b8ab9563e6bcd544ba253e39dc740ca96d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pablo=20Villaf=C3=A1=C3=B1ez?= Date: Tue, 19 Nov 2024 11:24:33 +0100 Subject: [PATCH] feat: improve logs when a context is canceled in the proxy --- services/proxy/pkg/command/server.go | 1 + .../proxy/pkg/middleware/context_logger.go | 26 +++++++++++++++++++ services/proxy/pkg/proxy/proxy.go | 11 ++++++++ 3 files changed, 38 insertions(+) create mode 100644 services/proxy/pkg/middleware/context_logger.go diff --git a/services/proxy/pkg/command/server.go b/services/proxy/pkg/command/server.go index a8a47fe8d..964e718bf 100644 --- a/services/proxy/pkg/command/server.go +++ b/services/proxy/pkg/command/server.go @@ -343,6 +343,7 @@ func loadMiddlewares(logger log.Logger, cfg *config.Config, chimiddleware.RealIP, chimiddleware.RequestID, middleware.AccessLog(logger), + middleware.ContextLogger(logger), middleware.HTTPSRedirect, middleware.Security(cspConfig), router.Middleware(serviceSelector, cfg.PolicySelector, cfg.Policies, logger), diff --git a/services/proxy/pkg/middleware/context_logger.go b/services/proxy/pkg/middleware/context_logger.go new file mode 100644 index 000000000..d8f0cc177 --- /dev/null +++ b/services/proxy/pkg/middleware/context_logger.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + + "github.com/owncloud/ocis/v2/ocis-pkg/log" +) + +// ContextLogger is a middleware to use a logger associated with the request's +// context which includes general information of the request. +func ContextLogger(logger log.Logger) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := logger.With(). + Str("remoteAddr", r.RemoteAddr). + Str(log.RequestIDString, r.Header.Get("X-Request-ID")). + Str("proto", r.Proto). + Str("method", r.Method). + Str("path", r.URL.Path). + Str("query", r.URL.RawQuery). + Str("fragment", r.URL.Fragment). + Logger().WithContext(r.Context()) + next.ServeHTTP(w, r.WithContext(ctx)) + }) + } +} diff --git a/services/proxy/pkg/proxy/proxy.go b/services/proxy/pkg/proxy/proxy.go index 4d3894c84..c8a5b992c 100644 --- a/services/proxy/pkg/proxy/proxy.go +++ b/services/proxy/pkg/proxy/proxy.go @@ -14,6 +14,7 @@ import ( "github.com/owncloud/ocis/v2/services/proxy/pkg/config" "github.com/owncloud/ocis/v2/services/proxy/pkg/proxy/policy" "github.com/owncloud/ocis/v2/services/proxy/pkg/router" + "github.com/rs/zerolog" ) // MultiHostReverseProxy extends "httputil" to support multiple hosts with different policies @@ -41,6 +42,16 @@ func NewMultiHostReverseProxy(opts ...Option) (*MultiHostReverseProxy, error) { ri.Rewrite()(r) } + rp.ErrorHandler = func(rw http.ResponseWriter, req *http.Request, err error) { + reqLogger := zerolog.Ctx(req.Context()) + if ev := reqLogger.Error(); ev.Enabled() { + ev.Err(err).Msg("error happened in MultiHostReverseProxy") + } else { + rp.logger.Err(err).Msg("error happened in MultiHostReverseProxy") + } + rw.WriteHeader(http.StatusBadGateway) + } + tlsConf := &tls.Config{ MinVersion: tls.VersionTLS12, InsecureSkipVerify: options.Config.InsecureBackends, //nolint:gosec