GoogleCloudFunctionsからSentryへアラート送信時にエラーがまとまってしまう問題

サーバーサイドエンジニアの@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を見てみます。 image.png

すると以下のようになっていました。

  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を見てみます。 image.png

本当は実装した関数の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として認識されるようにします。 上記の記事を参考に以下のように設定しました。

image.png

path:**/vendor/** +appを設定することで、AppOnlyを指定した際のStackTraceに実装した関数部分の StackTraceも追加されます。

おわりに

ニッチなTipsでしたが、CFをGolangで活用していく方々のエラートラッキングが加速すればと願っております。

また、MFKESSAIではWebHookサービスのようなSeverless Architectureの活用など 刺激的で技術的な挑戦を共にしてくれるエンジニアを募集しております。 興味をもっていただけましたら、こちらまでお願いします!