モバイルアプリでログを取ろうと思ったとき、多くのアプリではGoogle Analyticsを使っていると思います。 Google Analyticsは2つの事象にうちどちらが多く発生しているかなどの用途では便利ですが、一方でGoogle Analyticsはサンプリングされているので誤差があったり、ユーザー属性から絞ったりということができません。 そのため、弊社のプロダクトではログはOAuthで認証してfluentd経由でTreasure Dataに流していたりします。
参考になる記事:Fluentdとログ収集のパターン - Go ahead!
京都の勉強会で(京都 Android 勉強会 2014.08)ログの話をしたら「そうそう大変なんだよね〜」と共感していただいて、やはり各自でログ収集のしくみを作って正確な値を取っていたり、クエリを投げて分析したりしているみたいでした。
しかし、この実装が中々厄介で、イベントが発火する度にAPIを叩くのは非効率なのでローカルストレージに一時保存して一定時間後に送信を試みたり、ログを束ねて1リクエストしたり、でも1万レコードを1リクエストにすると詰まるので適度に分割したり、送信に失敗したときはバックオフさせたり…などなど。 ログは事業の継続のために重要で、落ちたりとか二重で送られてたりすると困るので、テスタブルかつ確認しやすさブルが求められていて、日夜ログがちゃんと送られていないことに震えながら過ごしています。
そこで、各社のモバイルアプリのバッファリングの知見や実装を共有できたらいいね、という話をninjinkunさんとしたことを思い出して、ちょっと書いてみました。
弊社でやっていた実装は、やむを得ない事情で別プロセスからログを受け付ける必要があってトリッキーなことをしているので、今回新しく設計し直しました。
- ログを非同期でDBに書き込む
- ログを送信する間隔を設定することができる
- ログ送信の前後に処理を挟むことができる
そもそも役に立つのかも分からないのでここまでを雑に実装しました。OAuthを挟んでいたり、他の認証が必要なケースがあったりするだろうということで、基本的にはストレージへの保存と時間でのコールバックまでを責務としています。これから
- ログのバリデーション
- ログの集約と制限
を実装しようと思っていますが、なるべく汎用的にしたいので、みなさんのところではどのようにログを送っているとか、どういう実装が良いとか、アドバイスがあればください。