GAEのエラーは、デフォルトでGCPのロギングに出力されますが、ずっと追い辛いと思っていたのでsentry-go導入してエラー監視できるようにしてみました。
Pull Request
実装
Sentryはアプリのエラー監視でも使用していますがGo言語もサポートしていたので、こちらを採用しました。
実装的には上記のドキュメント通りでOKです。 ペペロミアではフレームワークにGinを採用しているので、以下のドキュメントの通り実装しました。
まず、main関数に以下を追加
func main() { err := sentry.Init(sentry.ClientOptions{ Dsn: os.Getenv("SENTRY_DNS"), Debug: flase, AttachStacktrace: true, })
ペペロミアではエラー出力箇所を一箇所にまとめていたので、そこにSentryのメッセージ送信処理を追加
// Render 書き込み func (e *ErrorResponse) Render(gc *gin.Context) { if hub := sentrygin.GetHubFromContext(gc); hub != nil { hub.WithScope(func(scope *sentry.Scope) { r := getRole(gc) if r == RoleApp || r == RoleGraphql || r == RoleAdmin { // アプリの場合はユーザーIDを追加 uid, _ := GetSelfUID(gc) scope.SetUser(sentry.User{ID: uid}) } hub.Scope().SetTag("role", r) hub.CaptureException(e.Error) }) } gc.JSON(e.StatusCode, e) }
ユーザーIDがSentryで表示されると便利そうなので、以下の部分でユーザーIDを設定しています (※cronで実行するAPIにはユーザーIDが無いのでif文で分岐させています)
if r == RoleApp || r == RoleGraphql || r == RoleAdmin { // アプリの場合はユーザーIDを追加 uid, _ := GetSelfUID(gc) scope.SetUser(sentry.User{ID: uid}) } hub.Scope().SetTag("role", r) hub.CaptureException(e.Error)
これでエラーが発生すると以下みたいにSentryにエラーメッセージが飛ぶようになります。
以下の画像で、ちゃんとユーザーIDが設定されているのも確認できました。
あとは、SentryのIntegrationsの設定でSlackと連携させればエラー発生時に気づけるようになると思います。
Sentryはフロントエンドのエラー監視システムのイメージがありましたが、Go言語でも問題なく運用できそうです。