...

Source file src/github.com/gin-gonic/contrib/sentry/recovery.go

Documentation: github.com/gin-gonic/contrib/sentry

     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