From 98e38acc90217a7a5bdb23b048c10d47d6dee1f7 Mon Sep 17 00:00:00 2001 From: Jaime Martinez Date: Thu, 7 Oct 2021 15:28:15 +1100 Subject: feat: add panic handler middleware Changelog: added --- app.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'app.go') diff --git a/app.go b/app.go index b97ec0bc..eba3c690 100644 --- a/app.go +++ b/app.go @@ -289,6 +289,7 @@ func (a *theApp) buildHandlerPipeline() (http.Handler, error) { if a.config.General.PropagateCorrelationID { correlationOpts = append(correlationOpts, correlation.WithPropagation()) } + handler = handlePanicMiddleware(handler) handler = correlation.InjectCorrelationID(handler, correlationOpts...) // This MUST be the last handler! @@ -499,3 +500,21 @@ func (a *theApp) TLSConfig() (*cryptotls.Config, error) { return tls.Create(a.config.General.RootCertificate, a.config.General.RootKey, a.ServeTLS, a.config.General.InsecureCiphers, a.config.TLS.MinVersion, a.config.TLS.MaxVersion) } + +// handlePanicMiddleware logs and captures the recover() information from any panic +func handlePanicMiddleware(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + i := recover() + if i != nil { + err := fmt.Errorf("panic trace: %v", i) + metrics.PanicRecoveredCount.Inc() + logging.LogRequest(r).WithError(err).Error("recovered from panic") + errortracking.Capture(err, errortracking.WithRequest(r), errortracking.WithContext(r.Context())) + httperrors.Serve500(w) + } + }() + + handler.ServeHTTP(w, r) + }) +} -- cgit v1.2.3