スクレイピングや自動処理など「エラーコツコツ潰していく系開発」に効く Sentry
まとめ
Sentry はいいぞ
あるある開発過程
スクレイピングや自動処理など成功率の低いところから始まるプログラムにありがちな開発過程として、エラーをコツコツ潰していくというものがある。
具体的には以下のような過程。
- まず、もっとも理想的で綺麗な例について動くように作る。
- 対応できた例と同じパターンのものについていは成功するが、そうでないものがたくさんあり、ほぼ失敗する。
- どういったものが失敗しているかはエラーログから漁ろうとする。
- エラー処理、ロギングもまともに作ってないので、自動で回している時はなぜ失敗しているのわからない。
- 個別に手動でコツコツと起動し続け、失敗する例を見つける。
- 見つけたらその例について詳しくデバッグして、どういうエラー処理・ロギングをすれば問題の原因が特定できたか考え、実装する。
- そしたらまた自動で回すが、たくさん失敗する。
- さっき 6.で追加したところと同じところで落ちていれば原因を特定できるはずだが、その他のエラーが相変わらず多すぎて何が何やらわからない。
- かろうじて見つけた意味のわかるエラーログから、そのパターンについての実装を追加する。
- 2.に戻る。を繰り返す。
こういうことよくやってませんか?僕はやってます。
この過程のうち、何も工夫せずにやると特に時間がかかるのが大量のログの中から意味のわかる失敗する例を見つける部分と、修正後に稼働させて他のエラーが出るのを待つというサイクルのオーバーヘッド。できたら一挙にエラーを掌握し、失敗例の頻出度順に優先度をつけて対応するなどしたいもの。
この部分はうまくログを処理してくれるサービスやアプリケーションを使えば効率化することができるのでそれを紹介したいというのがこの記事の意図です。
最終的には「Sentry はいいぞ」ということなのだが、その他の選択肢から紹介する。
サービス紹介
Cloud Watch Logs
AWS を利用するのなら大抵簡単に Cloud Watch Logs に出力するオプションがあるので利用する場面は多い。
CloudWatch Logs Insightsを使えば様々な条件で検索をかけることができる。
CloudWatch Dashboardも作ったりもできるけど、手動で頑張ってクエリ組み立て調べていくイメージなのでちょっと大変かな。
DataDog
DataDog はほとんど自動的に設定を行ってくれる汎用の監視サービス。
AWS と連携させると EC2 や ECS コンテナなどの死活や消費 CPU メモリなどのリソースなど自動的に監視してくれる。他にもいろんなイベントを設定して監視することができ、例えばある URL にリクエストを定期的に送りレスポンス速度を監視してくれたりもできる。
ログに関しても送信する設定さえできればあとは自動的に頻出パターンごとにグルーピングして表示したりできる。あと DataDog Logs Management は比較的料金が安い。
設定が大変だったイメージだったけど、久しぶりに見たら簡単になってるっぽい。python の場合 log を json 形式にするフォーマッタを logger に仕込む必要がある。
AWS Lambda(python)へのセットアップ方法:https://docs.datadoghq.com/ja/serverless/installation/python/?tab=serverlessframework
sematext
DataDog の競合サービス。UI とか DataDog 以上にいい感じだと思うところも多いけど、ユーザー数が DataDog の方が多いので使うなら DataDog かな?
LogDNA
Log に特化したサービス。各言語ログ送信用のライブラリが用意されていて導入が簡単。UI もわかりやすく、データのビジュアライズのダッシュボード作成が簡単にできる。アラートやどんなパターンのログがどういう推移をしているかを監視し続けるみたいな設定のが簡単にできた。試しにログ管理したいけど面倒な設定はしたくないという時には良さそう。
Seq
LogDNA と似たような機能のものだが、クラウドサービスではなく docker image が用意されているセルフホスト型のもの。もちろん管理コストはかかるが、single-user license 無料なので個人開発者の一家に一台あると嬉しいのではという気持ち。うちの NUC 上で 24h 動いている。
Sentry
ログレベルがエラー以上のもののみを集めることに特化したサービス。
各言語ログ送信用のライブラリが用意されていて導入が簡単。ログをパターンごとに自動で分けてくれて、頻出度順に並べてくれるというのが基本機能で、そのパターンに関して豊富な機能で管理することができる。
例えばアラートはもちろん、担当者を決めたり、GitHub Issues 的に議論したり、無視するかとか解決したかとかフラグ建てられたり。
例えば python においてはコード内に数行仕込むだけで設定完了なので、ローカルでも簡単に使えるし、本番環境でも簡単。いろんな環境から乱雑にエラーを送ったとしてもどこから来たエラーなのかも綺麗に見分けてくれて、どのデプロイのエラーかも管理してくれる。
紹介記事:
[楽々エラー監視]Sentry をつかって Lambda(python)のエラートラッキングを試してみる
総評
Sentry 以外は基本全てのログを管理するサービスなのでうまくやらないと Error を見逃したりするのと、エラーパターンを管理するという機能はあまり。
Sentry を使えば全てのエラーを見逃さず、一目で優先度順に管理ができるということで、「エラーコツコツ潰していく系開発」には Sentry が効く。
Discussion