Goのスタックトレースは車輪の再発明を恐れずに

オリジナルのThe Go gopher(Gopherくん)は、Renée Frenchによってデザインされました。
はじめに
Goで開発と運用を行っているとエラーログがやけにシンプルなことに気づきます。
そう、 デフォルト状態ではスタックトレースがつかないのです。
本番環境で障害が発生した時などにスタックトレースがあるとエラー原因の調査にとても役立ちます。
Goの標準パッケージにはエラーログにスタックトレースを付加できる機能がないので、便利なパッケージがないか探してみました。
最初に結論
エラーにスタックトレースを付加する機能を持つパッケージはたくさんありますが、様々な理由で自信を持って採用できないので自分で実装しましょう。そんなに難しくないし。
Goの標準パッケージにスタックトレースを付加する機能が存在しない理由
Goの標準パッケージはミニマムで高速に動作するように作られています。
それらに比べて、スタックトレースを取得する処理は若干ではありますがコストが高いです。(注: 標準パッケージのそこかしこで行うには高コストですが、アプリケーションレベルになるとそれほどではありません)
標準の errors パッケージにスタックトレース機能を追加すると全てのエラー発生箇所で高コストな処理を行うことになり、ミニマムで高速に動作するように作られた標準パッケージに足枷をはめることになります。
そのためGoの標準パッケージではスタックトレース機能が実装されないそうです。
サードパーティライブラリ
標準パッケージに存在しないなら、まずはサードパーティライブラリを探しますよね。
過去には有用とされたパッケージもありますが、今ではお勧めできない理由を記載します。
pkg/errors
以前はこれを使っていれば間違いありませんでした。
ですが同等の機能が標準の errors パッケージに実装された結果、役目を終えたとのことで2020年12月にアーカイブされています。
スタックトレースの取得方法が公式で非推奨とされた方法らしく、現在では使わない方が良いです。
golang.org/x/xerrors
準標準パッケージと呼ばれることもある golang.org/x/ パッケージです。
このパッケージにスタックトレース機能があるため、ゆくゆくは標準パッケージにスタックトレース機能が実装されることが期待されました。
ですがスタックトレース以外の機能は標準パッケージに実装され、スタックトレース機能だけは除外されパッケージの利用自体が非推奨となりました。
一度はパッケージ全体が非推奨となりましたが、その後スタックトレース機能だけは非推奨が解除されています。
非推奨ではありませんが、インポートされていると使いたくなるのが人のサガというもの。
間違えて使うのを避けるためにも利用は控えましょう。
cockroachdb/errors
巷ではログ周りにはcockroachdbのエラーライブラリを使えば間違いない!と言われることもありますが、残念ながらスタックトレースの取得に pkg/errors を使っています。
非推奨のパッケージを使用しているため、利用は避けるべきです。
その他個人開発のライブラリ
他にも個人が公開しているライブラリが色々あります。
個人開発で利用する上では問題ありませんが、業務で商用利用する上ではセキュリティ上の懸念、サポート体制の不足、前触れなく非公開になる可能性などにより、採用しづらい事情があります。
無いなら自作するしかない
有名ライブラリが選択肢から外れ、個人開発のライブラリはプロダクションコードでは採用しにくい。
となると自作するしかありません。
幸いなことにスタックトレースを取得する処理は参考にできるソースコードがたくさんあります。
車輪の再発明を恐れず、エラー処理パッケージを自作しましょう。
余談
株式会社newmoがエラーライブラリを公開しました。 公開されたばかりで被インポート数はまだ少ないですが今後有力な選択肢になりうると考えています。
業界最大級の法人向けIT製品比較サービス「ITトレンド」の運営会社、イノベーション開発チームの公式Tech Blogです! 各記事の内容は個人の意見であり、企業を代表するものではございません。 note にも投稿しています! note.com/inno_tech/m/me0da0dc94db9
Discussion