0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GolangでSentryにStacktrace付きのエラーを送る方法について

Posted at

環境

  • golang 1.23.2
  • sentry-go v0.35.1
  • errors 0.9.1

対象読者

  • GolangからSentryにエラーを送付するときにerrをそのまま送付してもStacktraceがつかないことに悩んでいる方
  • errorをWrapした場合、Wrapした構造体の名称がSentryのタイトルになるので見づらくて困ってる方
  • SentryのStacktraceにStacktraceが出ないため、タグにStacktraceを出している方

書いていないこと

  • sentry-goを使用して1からSentryに送る方法
    • SentryHubやContextを作る方法はさまざま参考文献が見つかるので書いていません

実装方法

errに対してStacktraceを付与する

SentryにStacktraceを付与したい場合、自作のStacktraceを仕込むことは現状ではできないです。
Sentryが対応しているパッケージがあるため、それを使用します。
今回はgithub.com/pkg/errorsを使用します。注意点としては2021 年 12 月 1 日にアーカイブにされたパッケージのためその辺りが気になる方は他のパッケージを使用しましょう。
やり方は簡単でWithStack関数を使用するだけです。

import "github.com/pkg/errors"

errors.WithStack(err)

これだけSentryに渡したとき自動的にStacktraceを表示してくれます
ただ、他にも色々渡したかったりerrors.WithStack(err)をWrapしたい場合は下記も行なってください。

Sentryに対して新しいイベントを送信する

Sentryのsentry.CaptureException()を使用した場合、タイトルやサブタイトル、Stacktraceに入れるものを変更することができません。また、entry.ClientOptions にあるBeforeSendで色々と設定しても残念ながら私の環境では期待通りのIssueがSentryにはできませんでした。
そのため、Sentryに送るイベントをソース上で作成することにより期待通りのIssueをSentryに作成することができました。

import "github.com/getsentry/sentry-go"
func NewSentry(err error) {
    // sentryに対して送るイベントのインスタンス生成
	ev := sentry.NewEvent()
    // sentryに送りたい情報を色々と詰め込む
	ev.Level = sentry.LevelError
	ev.Timestamp = time.Now()
    ev.Exception = []sentry.Exception{
        {
            Type:       "Title",
            Value:      "sub_title",
            Stacktrace: sentry.ExtractStacktrace(err),
        },
    }
    // このhubには色々と設定
    hub = sentry.CurrentHub().Clone()
    hub.CaptureEvent(ev)
}

感想

個人的に色々書いてある記事だとピンポイントで読みたい箇所を探すのに苦労するので、今回はできるだけ省いて書いてみました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?