サーバーサイドエンジニアの@usumachiです。 For Developersチームとして、MFKESSAIを利用するエンジニアの体験向上に向けた開発をしています。 今回はGoogle Cloud FunctionsとSentryを利用したエラートラッキングについてのTipsを紹介できればと思います。
MFKESSAIでは、エラーのトラッキングにSentryを利用しています。 Google Cloud FunctionsからGolangで発生したエラーをSentryで管理する際に、 エラーがすべて1つにまとまってしまうという問題に直面しました。 その解決方法を共有できればと思います。
Google Cloud Functionsの活用
MFKESSAIでは、ユーザーへのWebHookサービスの実装にGoogle Cloud PlatformのCloud Functions (以下CF)を利用しています。 下記MFKESSAI handbookに記載されているチーム図では、「売り手チーム」に分類されている「通知サービス」です。 このWebHookサービスはServerless Architecureを活用しており、下記のソリューションを協調させています。
どのように協調しているかはまた別の機会にお伝えできればと考えています。
問題点と原因
CFの実装はGolangで行っています。 エラーが発生した場合、StackTraceと共にSentryのAPIへ送信しています。 この際に何も設定をしていないと、Sentry上でのAppOnlyのStackTraceを見てみます。
すると以下のようになっていました。
File "/tmp/sgb/gopath/src/serverlessapp/worker.go", line 123, in executeFunction
File "/go/src/net/http/server.go", line 1964, in ServeHTTP
File "/go/src/net/http/server.go", line 2361, in ServeHTTP
File "/go/src/net/http/server.go", line 2741, in ServeHTTP
File "/go/src/net/http/server.go", line 1847, in serve
どうやらCF上では指定した関数の実行が executeFunction
という関数内で行わているようです。
以下のページによるとSentryではエラーイベントをStackTraceによって分類します。
イベントグルーピング
これにより、CFからのすべてのエラーが同一のものとみなされてしまっていました。
FullのStackTraceを見てみます。
本当は実装した関数のStackTraceが続くはずなのですが、どういうわけか消えていました。
... logger呼び出しまでのStackTraceが続きます。
File "/tmp/sgb/gopath/src/serverlessapp/vendor/test_cf/handler.go", line 10, in Handler
実装部分は/tmp/sgb/gopath/src/serverlessapp/vendor
以下に入っていて
ApplicationのStackTraceではないと認識されているのが原因のようでした。
解決方法
Sentryには現在Beta機能ですが、Custom Grouping Enhancementsという機能があります。 Custom Grouping Enhancements
こちらを利用して /tmp/sgb/gopath/src/serverlessapp/vendor
以下もApplicationのStackTraceとして認識されるようにします。
上記の記事を参考に以下のように設定しました。
path:**/vendor/** +app
を設定することで、AppOnlyを指定した際のStackTraceに実装した関数部分の
StackTraceも追加されます。
おわりに
ニッチなTipsでしたが、CFをGolangで活用していく方々のエラートラッキングが加速すればと願っております。
また、MFKESSAIではWebHookサービスのようなSeverless Architectureの活用など 刺激的で技術的な挑戦を共にしてくれるエンジニアを募集しております。 興味をもっていただけましたら、こちらまでお願いします!