Go panic にさようなら。スタックトレースを HTML で可視化する `gopanix` を作った
きらぼしシステム株式会社でエンジニアをしている mickamy です。
今期の目標で、当社のプレゼンスを高める、というものをおいたので、開発を行う上で得た知見をご紹介したいと思います。
以下、都合により言い切り(ですます調にあらず)です。
Go を書いていて、panic: something went wrong という文字列に頭を抱えたことはないだろうか。長大なスタックトレースを追って原因を探すのは、決して楽しい作業ではない。
それなら、スタックトレースを見やすくすればいい。
というわけで、gopanix を作った。
gopanix とは
gopanix は、Go アプリケーションで発生した panic を HTML で可視化するツール。CLI としても、ライブラリとしても使える。
- panic 発生時にHTMLレポートを生成
- スタックトレースを構造化して表示(関数名、ファイル、行番号など)
- 自動的にブラウザで開く
-
defer gopanix.Handle()を仕込むだけでOK
ちょっとしたツールだが、あるとないとでクラッシュ対応の快適さがまったく違う。
なお、gopanix は本番環境での利用には向いていない。HTML の生成は、本番アプリケーションの動作に不必要な負荷を与える可能性があるため、開発環境や検証用ステージングでの利用を推奨する。
使い方
CLIとして使う
go install github.com/mickamy/gopanix/cmd/gopanix@latest
gopanix run ./cmd/main.go
go run で実行したアプリが panic すると、HTMLが生成されて自動でブラウザに表示される。
あるいは、gopanix test ./... で、go test -json を gopanix 経由で実行することも可能だ。
ライブラリとして使う
import "github.com/mickamy/gopanix"
func main() {
defer gopanix.Handle(false) // HTML を生成。true の場合ブラウザで開く
panic("something went wrong")
}
HTMLレポートの中身
- 発生時刻(タイムスタンプ)
- panic メッセージ
- 関数名、ファイル、行番号を一覧表示
なんで作ったのか
開発中のツールが panic で落ちたとき、再現はできるけど何が起きたかログから追うのが面倒だった。特にスタックトレースの途中で log.Fatal が挟まると情報が潰れていたり、肝心の箇所が流れてしまうことが多かった。
じゃあ HTML でぱっと見れるようにして、検索も共有もしやすくしようと考えた。
できるだけ「置くだけで使える」ツールにしたかった。
今後やりたいこと
- 複数
panicのログを一覧で表示するモード - Web サーバとして常駐し、外部アプリからレポート送信可能にする
おわりに
気になったらぜひ触ってみてほしい。Star もらえたら嬉しい。
Discussion