Используйте Sentry с Beego

Я использую Sentry в своих проектах Python, недавно я начал проект с Go и Beego framework, и я необходимо настроить Sentry для отчетов об ошибках в моем проекте. Но после прочтения документации Beego я не смог найти правильного способа сделать это. Пожалуйста, помогите мне, если вы реализовали это раньше.


person hamidfzm    schedule 07.07.2017    source источник


Ответы (2)


Это может быть простое решение без отключения функции восстановления beego:

func initRecover() {
    originRecover := beego.BConfig.RecoverFunc
    beego.BConfig.RecoverFunc = func(ctx *context.Context) {
        defer originRecover(ctx)
        if err := recover(); err != nil {
            //*** your reporting code here. ***
            panic(err)
        }
    }
}
person Boris Borshevsky    schedule 28.08.2017

После нескольких часов чтения кодов BeeGo и Sentry я понял, как это реализовать:

package main

import (
    "errors"
    "fmt"
    "net/http"
    "runtime"

    "github.com/astaxie/beego"
    "github.com/astaxie/beego/context"
    "github.com/astaxie/beego/logs"
    "github.com/getsentry/raven-go"
)

func init() {
    raven.SetDSN(beego.AppConfig.String("SentryDSN"))

    if !beego.BConfig.RecoverPanic {
        beego.BConfig.RecoverFunc = recoverPanic
    }
}

func recoverPanic(ctx *context.Context) {
    if err := recover(); err != nil {
        if err == beego.ErrAbort {
            return
        }
        if !beego.BConfig.RecoverPanic {
            errStr := fmt.Sprint(err)
            packet := raven.NewPacket(errStr, raven.NewException(errors.New(errStr), raven.NewStacktrace(2, 3, nil)), raven.NewHttp(ctx.Request))
            raven.Capture(packet, nil)
            ctx.ResponseWriter.WriteHeader(http.StatusInternalServerError)
        }

        //if beego.BConfig.EnableErrorsShow {
        //  if _, ok := beego.ErrorMaps[fmt.Sprint(err)]; ok {
        //      exception(fmt.Sprint(err), ctx)
        //      return
        //  }
        //}
        var stack string
        logs.Critical("the request url is ", ctx.Input.URL())
        logs.Critical("Handler crashed with error", err)
        for i := 1; ; i++ {
            _, file, line, ok := runtime.Caller(i)
            if !ok {
                break
            }
            logs.Critical(fmt.Sprintf("%s:%d", file, line))
            stack = stack + fmt.Sprintln(fmt.Sprintf("%s:%d", file, line))
        }
        //if beego.BConfig.RunMode == beego.DEV && beego.BConfig.EnableErrorsRender {
        //  showErr(err, ctx, stack)
        //}

    }
}
person hamidfzm    schedule 15.07.2017