Skip to content

Commit

Permalink
Merge pull request #13 from infiniteloopcloud/fix-recoverer-logging
Browse files Browse the repository at this point in the history
Extend recoverer logging with RecovererLogStack
  • Loading branch information
PumpkinSeed committed May 30, 2023
2 parents 6fe7cec + 289c30f commit f9265a5
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/golang-migrate/migrate/v4 v4.15.1
github.com/google/uuid v1.3.0
github.com/infiniteloopcloud/hyper v0.4.0
github.com/infiniteloopcloud/log v0.1.3
github.com/infiniteloopcloud/log v0.1.4
github.com/infiniteloopcloud/xss-validator v0.0.0-20220701051113-03673195f8e1
github.com/lib/pq v1.10.4
github.com/pascaldekloe/jwt v1.10.0
Expand Down Expand Up @@ -42,7 +42,6 @@ require (
github.com/golang/protobuf v1.5.2 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.0 // indirect
github.com/infiniteloopcloud/weird v0.1.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,6 @@ github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmx
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8=
github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0=
github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
Expand Down Expand Up @@ -578,14 +577,14 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/infiniteloopcloud/hyper v0.2.0 h1:uQGNu5pkO+7LK95M2r9ENDTYbzWhn5h3JTOOZg4FteM=
github.com/infiniteloopcloud/go v0.4.0/go.mod h1:9CKlMPkG87gDeNv9Ddn4nZL2bZGghgnE+EtpZ0zMunI=
github.com/infiniteloopcloud/hyper v0.2.0/go.mod h1:v1Br6IBlHrND7AU/k+8iTUn8YKzdrD3ajihs+EGapCo=
github.com/infiniteloopcloud/hyper v0.4.0 h1:hZSN6/krtHQ3oxaebMfx8xtp/V+BHEnXHO3L1wHL/L4=
github.com/infiniteloopcloud/hyper v0.4.0/go.mod h1:WDXVYVIiEuN05Xrmqq2m1KvUSv+PzvbmIjYxkcw6Bms=
github.com/infiniteloopcloud/log v0.1.0/go.mod h1:4Oct/9/ZDRZuLM3rI8mx5JTVAmBymDWY7XHxWCEpuKw=
github.com/infiniteloopcloud/log v0.1.3 h1:ivirKlN4sftopoBgbXXjUqVRqioEjACpNAK2JvXizIM=
github.com/infiniteloopcloud/log v0.1.3/go.mod h1:4Oct/9/ZDRZuLM3rI8mx5JTVAmBymDWY7XHxWCEpuKw=
github.com/infiniteloopcloud/weird v0.1.0 h1:1pEQYxn1TnSEatEmcAu6b158S7QjCfECKRocFYGJi6s=
github.com/infiniteloopcloud/log v0.1.4 h1:SneFIa9CGWrOvAIoAgd15U2WLC/CAcd2JK5DFQjHCuA=
github.com/infiniteloopcloud/log v0.1.4/go.mod h1:4Oct/9/ZDRZuLM3rI8mx5JTVAmBymDWY7XHxWCEpuKw=
github.com/infiniteloopcloud/weird v0.1.0/go.mod h1:JW/8sf7YTkgioiTue+ZFJejTt0LqBZJDgFYjBbMoCOw=
github.com/infiniteloopcloud/xss-validator v0.0.0-20220701051113-03673195f8e1 h1:wTHrVM+bgfCuAGDXcKcvu1tZ5GudLDpdXEaULRYP0Hg=
github.com/infiniteloopcloud/xss-validator v0.0.0-20220701051113-03673195f8e1/go.mod h1:wUX5JTQ2jStX0APJLGxm5L5KUQPOe9sCnVRppNxLSk0=
Expand Down Expand Up @@ -1510,6 +1509,7 @@ gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/volatiletech/null.v6 v6.0.0-20170828023728-0bef4e07ae1b/go.mod h1:0LRKfykySnChgQpG3Qpk+bkZFWazQ+MMfc5oldQCwnY=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Expand Down
28 changes: 23 additions & 5 deletions middlewares/recoverer.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package middlewares

import (
"bytes"
"context"
"errors"
"fmt"
"io"
Expand All @@ -14,10 +15,11 @@ import (
"strings"

"github.com/go-chi/chi/v5/middleware"
"github.com/infiniteloopcloud/log"
)

type RecoverParserIface interface {
Parse(debugStack []byte, rvr interface{}) ([]byte, error)
Parse(ctx context.Context, debugStack []byte, rvr interface{}) ([]byte, error)
}

var RecoverParser RecoverParserIface = prettyStack{}
Expand All @@ -42,7 +44,7 @@ func Recoverer(next http.Handler) http.Handler {
if logEntry != nil {
logEntry.Panic(rvr, debug.Stack())
} else {
PrintPrettyStack(rvr)
PrintPrettyStack(r.Context(), rvr)
}

w.WriteHeader(http.StatusInternalServerError)
Expand All @@ -58,9 +60,9 @@ func Recoverer(next http.Handler) http.Handler {
// for ability to test the PrintPrettyStack function
var recovererErrorWriter io.Writer = os.Stderr

func PrintPrettyStack(rvr interface{}) {
func PrintPrettyStack(ctx context.Context, rvr interface{}) {
debugStack := debug.Stack()
out, err := RecoverParser.Parse(debugStack, rvr)
out, err := RecoverParser.Parse(ctx, debugStack, rvr)
if err == nil {
//nolint:errcheck
recovererErrorWriter.Write(out)
Expand All @@ -70,14 +72,18 @@ func PrintPrettyStack(rvr interface{}) {
}
}

func SetRecovererErrorWriter(w io.Writer) {
recovererErrorWriter = w
}

func SetRecoverParser(p RecoverParserIface) {
RecoverParser = p
}

type prettyStack struct {
}

func (s prettyStack) Parse(debugStack []byte, rvr interface{}) ([]byte, error) {
func (s prettyStack) Parse(_ context.Context, debugStack []byte, rvr interface{}) ([]byte, error) {
var err error
useColor := true
buf := &bytes.Buffer{}
Expand Down Expand Up @@ -258,3 +264,15 @@ func cW(w io.Writer, useColor bool, color []byte, s string, args ...interface{})
w.Write(reset)
}
}

type RecovererLogStack struct{}

func (l RecovererLogStack) Parse(ctx context.Context, debugStack []byte, rvr interface{}) ([]byte, error) {
parsedLog := log.Parse(ctx, log.ErrorLevelString, "panic happen",
fmt.Errorf("panic happen: %v", rvr),
log.Field{
Key: "debug_stack",
Value: strings.Join(strings.Split(string(debugStack), "\n"), "|"),
})
return []byte(parsedLog), nil
}
3 changes: 2 additions & 1 deletion middlewares/recoverer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package middlewares

import (
"bytes"
"context"
"io"
"net/http"
"net/http/httptest"
Expand Down Expand Up @@ -99,7 +100,7 @@ func TestRecovererCustomParser(t *testing.T) {

type custom struct{}

func (c custom) Parse(debugStack []byte, rvr interface{}) ([]byte, error) {
func (c custom) Parse(_ context.Context, debugStack []byte, rvr interface{}) ([]byte, error) {
stack := strings.Split(string(debugStack), "\n")

if len(stack) > 0 {
Expand Down

0 comments on commit f9265a5

Please sign in to comment.