環境
- 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)
}
感想
個人的に色々書いてある記事だとピンポイントで読みたい箇所を探すのに苦労するので、今回はできるだけ省いて書いてみました。