...
1 package sentry
2
3 import (
4 "errors"
5 "fmt"
6 "net/http"
7 "runtime/debug"
8
9 "github.com/getsentry/raven-go"
10 "github.com/gin-gonic/gin"
11 )
12
13 func Recovery(client *raven.Client, onlyCrashes bool) gin.HandlerFunc {
14
15 return func(c *gin.Context) {
16 defer func() {
17 flags := map[string]string{
18 "endpoint": c.Request.RequestURI,
19 }
20 if rval := recover(); rval != nil {
21 debug.PrintStack()
22 rvalStr := fmt.Sprint(rval)
23 packet := raven.NewPacket(rvalStr,
24 raven.NewException(errors.New(rvalStr), raven.NewStacktrace(2, 3, nil)),
25 raven.NewHttp(c.Request))
26 client.Capture(packet, flags)
27 c.AbortWithStatus(http.StatusInternalServerError)
28 }
29 if !onlyCrashes {
30 for _, item := range c.Errors {
31 packet := raven.NewPacket(item.Error(),
32 &raven.Message{
33 Message: item.Error(),
34 Params: []interface{}{item.Meta},
35 },
36 raven.NewHttp(c.Request))
37 client.Capture(packet, flags)
38 }
39 }
40 }()
41
42 c.Next()
43 }
44 }
45
View as plain text