昨日ふと投稿したtwitterが結構RTやイイネが付いたのだけど、twitterの長さの制約の関係でちょっとした注意点が漏れていたので記事にしてみた。
twitterの投稿内容はこんな感じ
GAE/Goだと、Stackdriver Error Reportingに通知されたStacktraceのHoge.go:90などのようなリンクからCloud Source Repositories のコードに直接飛べるので、どの行でエラー出たのかすぐわかるのでもう手放せない。 https://t.co/MfTnizr5tX
— kiyo (@chidakiyo) 2017年5月31日
GAE/Goだと
で書き始めているので何もしなくて実現できているのかと誤解されそうだったので、
注意点を下記します。
Stackdriver Error Reporting とはなに?
Stackdriver Error Reporting は、実行中のクラウド サービスで発生したクラッシュをカウントして、
分析と集計を実施します。
結果は一元化されたエラー管理インターフェースに表示され、並べ替えやフィルタリングも行えます。
専用のビューには、タイムチャート、発生回数、影響を受けたユーザー数、最初または最後の発生日時、
削除された例外スタック トレースといったエラー詳細が表示されます。
また、新しいエラーの発生時にメールアラートやモバイル アラートを受信することもできます。
エラーをよしなに通知しますよ。というもので、詳しくは こちら を。
Cloud Source Repositories とはなに?
Cloud Source Repositories では、プライベート Git レポジトリをいくつでも持つことができ、
お客様に最適な方法でクラウド プロジェクトに関連付けられているコードを整理することができます。
簡単に言うとgitのリポジトリですよ、と。
さっそく、注意点
ただ普通に Go で書いて Appengine にデプロイしただけでは 使えません!!
1点だけ注意点があって、ログの中にStackdriver Error Reportingが Stacktraceだと認識できる形式の文字列
を出力する必要があります。
どうすればいいか
サンプルコードですが、
エラー発生箇所でログに以下のようなロジックで生成したStacktraceを含めれば良いです。
(ユーティリティ化して使うのが良いと思いますが、その際にStackを剥がす処理をしたくなると思いますのでそのあたりは頑張ってみてください)
c := appengine.NewContext(r) // appengineのcontextを生成する
buf := make([]byte, 1<<16)
runtime.Stack(buf, true)
s := fmt.Sprintf("%s", buf)
log.Errorf(c, s) // ログを出力する
GAE/Goを書いたことがある人はわかると思いますが、Stacktraceを普通にログとして出力しているだけです。
どのようになるか
上記のようにStacktraceを含むログを出力した際に、Error Reportingはエラーを認識してエラーを通知します。
上の例は殆どモザイクで見えないと思いますが、ErrorReportingで通知されたエラーの1件を選択すると以下のようなエラーの詳細画面へと遷移します。
エラー詳細画面に Go の Stacktrace が表示されるので、 gin.go:265
のようなリンクになっている部分をクリックします。
リンクから遷移すると Source Repository のコードへ飛び、ここまでのことがブラウザの中で一発で出来ます。
(この例はginというgoのライブラリのコードに飛んでいる例なのですが、実際には実装したアプリケーションのソースコードに飛んで確認ができます。)
ちなみに、Go のコードは Source Repository でわざわざホストする必要は無いと思います。
agppengineにデプロイするだけ。ちなみに、Source Repositoryの参照権限の付与は忘れないようにしましょう。