I did want to use sentry in my middleware.
func InitTracker() {
rate, _ := strconv.ParseFloat(os.Getenv("SENTRY_SAMPLE_RATE"), 32)
err := sentry.Init(sentry.ClientOptions{
Dsn: os.Getenv("SENTRY_DSN"),
Environment: os.Getenv("SENTRY_ENVIRONMENT"),
Release: os.Getenv("SENTRY_RELEASE"),
DebugWriter: os.Stderr,
Debug: true,
SampleRate: float32(rate),
})
if err != nil {
fmt.Printf("Sentry initialization failed: %v\n", err)
}
}
func LoggerWithSentry() echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(ctx echo.Context) (err error) {
req := ctx.Request()
res := ctx.Response()
if err = next(ctx); err != nil {
ctx.Error(err)
}
if res.Status >= http.StatusBadRequest {
var errCtx = map[string]string{
"UserAgent": req.UserAgent(),
"Referer": req.Referer(),
"ResponseCode": string(res.Status),
}
var requestCtx = map[string]string{
"Method": req.Method,
"URL": req.URL.RawPath,
"Query": req.URL.RawQuery,
}
var userCtx = sentry.User{
IPAddress: ctx.RealIP(),
}
sentry.WithScope(func(scope *sentry.Scope) {
scope.SetTags(errCtx)
scope.SetContext("Request", requestCtx)
scope.SetUser(userCtx)
sentry.CaptureException(err)
scope.Clear()
})
}
return next(ctx)
}
}
}
{"time":"2019-05-26T13:43:50.104382363Z","level":"-","prefix":"echo","file":"recover.go","line":"73","message":"[PANIC RECOVER] reflect: call of reflect.Value.MethodByName on zero Value goroutine 30 [running]:\ngithub.com/labstack/echo/v4/middleware.RecoverWithConfig.func1.1.1(0xa0c470, 0x1000, 0xc000060000, 0xab8180, 0xc0000e4cb0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/labstack/echo/v4/middleware/recover.go:71 +0xf1\npanic(0x911ae0, 0xc0003db8a0)\n\t/app/tmp/cache/go1.12.5/go/src/runtime/panic.go:522 +0x1b5\nreflect.Value.MethodByName(0x0, 0x0, 0x0, 0x9a4f74, 0xe, 0xc0001c57d8, 0xc0004fa240, 0xc0004f1980)\n\t/app/tmp/cache/go1.12.5/go/src/reflect/value.go:1277 +0x1b5\ngithub.com/getsentry/sentry-go.extractReflectedStacktraceMethod(0x0, 0x0, 0x8, 0x10, 0xc00041d2f0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/stacktrace.go:78 +0xe7\ngithub.com/getsentry/sentry-go.ExtractStacktrace(0x0, 0x0, 0x60)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/stacktrace.go:51 +0x39\ngithub.com/getsentry/sentry-go.(*Client).eventFromException(0xc000232e10, 0x0, 0x0, 0x9a06a0, 0x5, 0xc0002bef00)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/client.go:241 +0x39\ngithub.com/getsentry/sentry-go.(*Client).CaptureException(0xc000232e10, 0x0, 0x0, 0xc0002bef00, 0xaa0480, 0xc00046b3f0, 0xc00041d2f0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/client.go:172 +0x58\ngithub.com/getsentry/sentry-go.(*Hub).CaptureException(0xc0002ce4a0, 0x0, 0x0, 0x7)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/hub.go:173 +0xfe\ngithub.com/getsentry/sentry-go.CaptureException(...)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/api.go:37\ngithub.com/kotovskyart/edera-api/shared/kernel.LoggerWithSentry.func1.1.1(0xc00046b3f0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/shared/kernel/middleware.go:71 +0x2d5\ngithub.com/getsentry/sentry-go.(*Hub).WithScope(0xc0002ce4a0, 0xc0001c5ab0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/hub.go:132 +0x6e\ngithub.com/getsentry/sentry-go.WithScope(...)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/getsentry/sentry-go/api.go:82\ngithub.com/kotovskyart/edera-api/shared/kernel.LoggerWithSentry.func1.1(0xab8180, 0xc0000e4cb0, 0x0, 0x0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/shared/kernel/middleware.go:60 +0x3c4\ngithub.com/labstack/echo/v4/middleware.RecoverWithConfig.func1.1(0xab8180, 0xc0000e4cb0, 0x0, 0x0)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/labstack/echo/v4/middleware/recover.go:78 +0xd5\ngithub.com/labstack/echo/v4.(*Echo).ServeHTTP(0xc000456380, 0xaa9480, 0xc00048c1c0, 0xc00019ce00)\n\t/tmp/build_39d9da06f2d4785aacc77b42833ee49d/vendor/github.com/labstack/echo/v4/echo.go:593 +0x221\nnet/http.serverHandler.ServeHTTP(0xc00013a0d0, 0xaa9480, 0xc00048c1c0, 0xc00019ce00)\n\t/app/tmp/cache/go1.12.5/go/src/net/http/server.go:2774 +0xa8\nnet/http.(*conn).serve(0xc00013c780, 0xaaa640, 0xc00026ad00)\n\t/app/tmp/cache/go1.12.5/go/src/net/http/server.go:1878 +0x851\ncreated by net/http.(*Server).Serve\n\t/app/tmp/cache/go1.12.5/go/src/net/http/server.go:2884 +0x2f4\n\ngoroutine 1 [IO wait]:\ninternal/poll.runtime_pollWait(0x7fd0586e7dd8, 0x72, 0x0)\n\t/app/tmp/cache/go1.12.5/go/src/runtime/netpoll.go:182 +0x56\ninternal/poll.(*pollDesc).wait(0xc000138218, 0x72, 0x0, 0x0, 0x9a1646)\n\t/app/tmp/cache/go1.12.5/go/src/internal/poll/fd_poll_runtime.go:87 +0x9b\ninternal/poll.(*pollDesc).waitRead(...)\n\t/app/tmp/cache/go1.12.5/go/src/internal/poll/fd_poll_runtime.go:92\ninternal/poll.(*FD).Accept(0xc000138200, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)\n\t/app/tmp/cache/go1.12.5/go/src/internal/poll/fd_unix.go:384 +0x1ba\nnet.(*netFD).accept(0xc000138200, 0xb4, 0x203000, 0x203000)\n\t/app/tmp/cache/go1.12.5/go/src/net/fd_unix.go:238 +0x42\nnet.(*TCPListener).accept(0xc0003f40a8, 0xc000034500, 0x40d499, 0xc00013c780)\n\t/app/tmp/cache/go1.12.5/go/src/net/tcpsock_posix.go:139 +0x32\nnet.(*TCPListener).AcceptTCP(0xc0003f40a8, 0x8c05c6ee, 0x5f229440908c2f94, 0x44b7d8)\n\t/app/tmp/cache/go1.12.5/go/src/net/tcpsock.go:247 +0x48\ngithub.com/labstack/echo/v4.tcpKeepAl\n"}