😊

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 -jsongopanix 経由で実行することも可能だ。

ライブラリとして使う

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 もらえたら嬉しい。

https://github.com/mickamy/gopanix

Discussion