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